From f4b66bd43c75d4f12f056632073a29d2d2062cb8 Mon Sep 17 00:00:00 2001 From: grenos Date: Wed, 1 Apr 2020 00:40:04 +0200 Subject: [PATCH] PROGRESS child view controllers, GFUserInfoHeaderVC --- GHFollowers.xcodeproj/project.pbxproj | 12 ++ .../UserInterfaceState.xcuserstate | Bin 55518 -> 61673 bytes .../Labels/GFTitleLabel-Secondary.swift | 39 +++++++ .../ViewControllers/GFUserInfoheaderVC.swift | 109 ++++++++++++++++++ GHFollowers/Screens/UserInfoVC.swift | 35 +++++- GHFollowers/Utilities/Constants.swift | 13 +++ 6 files changed, 203 insertions(+), 5 deletions(-) create mode 100644 GHFollowers/Components/Labels/GFTitleLabel-Secondary.swift create mode 100644 GHFollowers/Components/ViewControllers/GFUserInfoheaderVC.swift create mode 100644 GHFollowers/Utilities/Constants.swift diff --git a/GHFollowers.xcodeproj/project.pbxproj b/GHFollowers.xcodeproj/project.pbxproj index fc9308a..8b866cf 100644 --- a/GHFollowers.xcodeproj/project.pbxproj +++ b/GHFollowers.xcodeproj/project.pbxproj @@ -29,6 +29,9 @@ 7DA45F73242E332000AB426F /* UIHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DA45F72242E332000AB426F /* UIHelper.swift */; }; 7DA45F7A242FB95700AB426F /* GFEmptyStateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DA45F79242FB95700AB426F /* GFEmptyStateView.swift */; }; 7DA45F7C2430E3C900AB426F /* UserInfoVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DA45F7B2430E3C900AB426F /* UserInfoVC.swift */; }; + 7DA45F812433DE1300AB426F /* GFTitleLabel-Secondary.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DA45F802433DE1300AB426F /* GFTitleLabel-Secondary.swift */; }; + 7DA45F832433F4FC00AB426F /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DA45F822433F4FC00AB426F /* Constants.swift */; }; + 7DA45F852433FAF800AB426F /* GFUserInfoheaderVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DA45F842433FAF800AB426F /* GFUserInfoheaderVC.swift */; }; 7DFAC88A242A86D200F5780C /* GFAlertContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DFAC889242A86D200F5780C /* GFAlertContainerView.swift */; }; /* End PBXBuildFile section */ @@ -57,6 +60,9 @@ 7DA45F72242E332000AB426F /* UIHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIHelper.swift; sourceTree = ""; }; 7DA45F79242FB95700AB426F /* GFEmptyStateView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GFEmptyStateView.swift; sourceTree = ""; }; 7DA45F7B2430E3C900AB426F /* UserInfoVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserInfoVC.swift; sourceTree = ""; }; + 7DA45F802433DE1300AB426F /* GFTitleLabel-Secondary.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "GFTitleLabel-Secondary.swift"; sourceTree = ""; }; + 7DA45F822433F4FC00AB426F /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; + 7DA45F842433FAF800AB426F /* GFUserInfoheaderVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GFUserInfoheaderVC.swift; sourceTree = ""; }; 7DFAC889242A86D200F5780C /* GFAlertContainerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GFAlertContainerView.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -168,6 +174,7 @@ children = ( 7DA45F6B242BAEEC00AB426F /* ErrorMessage.swift */, 7DA45F72242E332000AB426F /* UIHelper.swift */, + 7DA45F822433F4FC00AB426F /* Constants.swift */, ); path = Utilities; sourceTree = ""; @@ -218,6 +225,7 @@ children = ( 7D98BB45242A52B7006C53E9 /* GFTitleLabel.swift */, 7D98BB47242A5507006C53E9 /* GFBodyLabel.swift */, + 7DA45F802433DE1300AB426F /* GFTitleLabel-Secondary.swift */, ); path = Labels; sourceTree = ""; @@ -226,6 +234,7 @@ isa = PBXGroup; children = ( 7D98BB49242A55ED006C53E9 /* GFAlertVC.swift */, + 7DA45F842433FAF800AB426F /* GFUserInfoheaderVC.swift */, ); path = ViewControllers; sourceTree = ""; @@ -315,12 +324,15 @@ 7DA45F64242B73E600AB426F /* Follower.swift in Sources */, 7D98BB46242A52B7006C53E9 /* GFTitleLabel.swift in Sources */, 7D98BB4C242A7327006C53E9 /* UIViewController+EXT.swift in Sources */, + 7DA45F812433DE1300AB426F /* GFTitleLabel-Secondary.swift in Sources */, 7D98BB44242A29B4006C53E9 /* FollowerListVC.swift in Sources */, 7DA45F6C242BAEEC00AB426F /* ErrorMessage.swift in Sources */, 7DA45F73242E332000AB426F /* UIHelper.swift in Sources */, 7DA45F69242B831900AB426F /* NetworkManager.swift in Sources */, 7D98BB282428FE73006C53E9 /* AppDelegate.swift in Sources */, + 7DA45F852433FAF800AB426F /* GFUserInfoheaderVC.swift in Sources */, 7D98BB2A2428FE73006C53E9 /* SceneDelegate.swift in Sources */, + 7DA45F832433F4FC00AB426F /* Constants.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/GHFollowers.xcodeproj/project.xcworkspace/xcuserdata/vasilis.xcuserdatad/UserInterfaceState.xcuserstate b/GHFollowers.xcodeproj/project.xcworkspace/xcuserdata/vasilis.xcuserdatad/UserInterfaceState.xcuserstate index 4514ddba77fa69ac47a6508762f0131eceb8aa59..6fe178063f33747a4f78477202b1a41faf9437ec 100644 GIT binary patch delta 31017 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 diff --git a/GHFollowers/Components/Labels/GFTitleLabel-Secondary.swift b/GHFollowers/Components/Labels/GFTitleLabel-Secondary.swift new file mode 100644 index 0000000..05dc6ee --- /dev/null +++ b/GHFollowers/Components/Labels/GFTitleLabel-Secondary.swift @@ -0,0 +1,39 @@ +// +// GFTitleLabel-Secondary.swift +// GHFollowers +// +// Created by Vasileios Gkreen on 31/03/2020. +// Copyright © 2020 Vasileios Gkreen. All rights reserved. +// + +import UIKit + +class GFTitleLabel_Secondary: UILabel { + + override init(frame: CGRect) { + super.init(frame: frame) + configure() + } + + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + + init(fontSize: CGFloat) { + super.init(frame: .zero) + font = UIFont.systemFont(ofSize: fontSize, weight: .medium) + + configure() + } + + + private func configure () { + textColor = .secondaryLabel + adjustsFontSizeToFitWidth = true + minimumScaleFactor = 0.90 + lineBreakMode = .byTruncatingTail + translatesAutoresizingMaskIntoConstraints = false + } +} diff --git a/GHFollowers/Components/ViewControllers/GFUserInfoheaderVC.swift b/GHFollowers/Components/ViewControllers/GFUserInfoheaderVC.swift new file mode 100644 index 0000000..c26dd3a --- /dev/null +++ b/GHFollowers/Components/ViewControllers/GFUserInfoheaderVC.swift @@ -0,0 +1,109 @@ +// +// GFUserInfoheaderVC.swift +// GHFollowers +// +// Created by Vasileios Gkreen on 01/04/2020. +// Copyright © 2020 Vasileios Gkreen. All rights reserved. +// + + +import UIKit + +class GFUserInfoheaderVC: UIViewController { + + let avatarImageView = GFAvatarImageView(frame: .zero) + let usernameLabel = GFTitleLabel(textAlignment: .left, fontSize: 34) + let nameLabel = GFTitleLabel_Secondary(fontSize: 18) + let locationImageView = UIImageView() + let locationLabel = GFTitleLabel_Secondary(fontSize: 18) + let bioLabel = GFBodyLabel(textAlignment: .left) + + var user: User! + + // create a custom initializer + // so when we initialize the VC we can pass the User object + init(user: User) { + super.init(nibName: nil, bundle: nil) + self.user = user + } + // the no storyboard init + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func viewDidLoad() { + super.viewDidLoad() + addSubViews() + layoutUI() + configureUIElements() + } + + + func configureUIElements() { + avatarImageView.downloadImage(from: user.avatarUrl) + usernameLabel.text = user.login + nameLabel.text = user.name ?? "" // nil coalescing (if null then use placeholder in string) + locationLabel.text = user.location ?? "No Location" + bioLabel.text = user.bio ?? "" + bioLabel.numberOfLines = 3 + + locationImageView.image = UIImage(systemName: SFSymbols.location) + // ovveride the default blue color of SFSymbols + locationImageView.tintColor = .secondaryLabel + } + + + + // MARK: VIEW FUNCTIONS + + // add all the subView here + func addSubViews() { + view.addSubview(avatarImageView) + view.addSubview(usernameLabel) + view.addSubview(nameLabel) + view.addSubview(locationImageView) + view.addSubview(locationLabel) + view.addSubview(bioLabel) + } + + + // add all constraints for the elements here + func layoutUI() { + let padding: CGFloat = 20 + let textImagePadding: CGFloat = 12 + locationImageView.translatesAutoresizingMaskIntoConstraints = false + + NSLayoutConstraint.activate([ + avatarImageView.topAnchor.constraint(equalTo: view.topAnchor, constant: padding), + avatarImageView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: padding), + avatarImageView.widthAnchor.constraint(equalToConstant: 90), + avatarImageView.heightAnchor.constraint(equalToConstant: 90), + + usernameLabel.topAnchor.constraint(equalTo: avatarImageView.topAnchor), + usernameLabel.leadingAnchor.constraint(equalTo: avatarImageView.trailingAnchor, constant: textImagePadding), + usernameLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -padding), + usernameLabel.heightAnchor.constraint(equalToConstant: 38), + + nameLabel.centerYAnchor.constraint(equalTo: avatarImageView.centerYAnchor, constant: 8), + nameLabel.leadingAnchor.constraint(equalTo: avatarImageView.trailingAnchor, constant: textImagePadding), + nameLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -padding), + nameLabel.heightAnchor.constraint(equalToConstant: 20), + + locationImageView.bottomAnchor.constraint(equalTo: avatarImageView.bottomAnchor), + locationImageView.leadingAnchor.constraint(equalTo: avatarImageView.trailingAnchor, constant: textImagePadding), + locationImageView.heightAnchor.constraint(equalToConstant: 20), + locationImageView.widthAnchor.constraint(equalToConstant: 20), + + locationLabel.centerYAnchor.constraint(equalTo: locationImageView.centerYAnchor), + locationLabel.leadingAnchor.constraint(equalTo: locationImageView.trailingAnchor, constant: 5), + locationLabel.trailingAnchor.constraint(equalToSystemSpacingAfter: view.trailingAnchor, multiplier: -padding), + locationLabel.heightAnchor.constraint(equalToConstant: 20), + + bioLabel.topAnchor.constraint(equalTo: avatarImageView.bottomAnchor, constant: textImagePadding), + bioLabel.leadingAnchor.constraint(equalTo: avatarImageView.leadingAnchor), + bioLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -padding), + bioLabel.heightAnchor.constraint(equalToConstant: 60) + ]) + } +} + diff --git a/GHFollowers/Screens/UserInfoVC.swift b/GHFollowers/Screens/UserInfoVC.swift index 54724ec..1838530 100644 --- a/GHFollowers/Screens/UserInfoVC.swift +++ b/GHFollowers/Screens/UserInfoVC.swift @@ -10,37 +10,62 @@ import UIKit class UserInfoVC: UIViewController { + let headerView = UIView() + // username gets passed here from FollowerListVC from function -- extension FollowerListVC: UICollectionViewDelegate -- var username: String! override func viewDidLoad() { super.viewDidLoad() - + view.backgroundColor = .systemBackground // create done button for navigation let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(dismissVC)) // add button to navigation bar navigationItem.rightBarButtonItem = doneButton + layoutUI() NetworkManager.shared.getUserInfo(for: username) { [weak self] result in guard let self = self else {return} switch result { case .success(let user): - print(user) + + DispatchQueue.main.async { + self.add(childVC: GFUserInfoheaderVC(user: user), to: self.headerView) + } + case .failure(let error): self.presentGFAlertOnMainThread(title: "Something went wrong", message: error.rawValue, buttonTitle: "Ok") } - - } - } @objc func dismissVC() { dismiss(animated: true) } + + + func layoutUI() { + view.addSubview(headerView) + headerView.translatesAutoresizingMaskIntoConstraints = false + + NSLayoutConstraint.activate([ + headerView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), + headerView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + headerView.trailingAnchor.constraint(equalTo: view.trailingAnchor), + headerView.heightAnchor.constraint(equalToConstant: 180) + ]) + } + + func add(childVC: UIViewController, to containerView: UIView) { + addChild(childVC) + containerView.addSubview(childVC.view) + childVC.view.frame = containerView.bounds + childVC.didMove(toParent: self) + } + } diff --git a/GHFollowers/Utilities/Constants.swift b/GHFollowers/Utilities/Constants.swift new file mode 100644 index 0000000..dd11bde --- /dev/null +++ b/GHFollowers/Utilities/Constants.swift @@ -0,0 +1,13 @@ +// +// Constants.swift +// GHFollowers +// +// Created by Vasileios Gkreen on 01/04/2020. +// Copyright © 2020 Vasileios Gkreen. All rights reserved. +// + +import Foundation + +enum SFSymbols { + static let location = "mappin.and.ellipse" +}