From 24bedee7f0536678fdab11e8e8df690614e0f868 Mon Sep 17 00:00:00 2001 From: Kleiton Mendes Date: Mon, 12 Dec 2022 10:57:02 -0300 Subject: [PATCH 1/4] Criando a ContactListView e a ContactCellView --- .../FinanceApp.xcodeproj/project.pbxproj | 4 + .../AppDelegate/SceneDelegate.swift | 2 +- .../img.imageset/Contents.json | 21 +++++ .../Assets.xcassets/img.imageset/img.png | Bin 0 -> 6046 bytes .../img2.imageset/Contents.json | 21 +++++ .../Assets.xcassets/img2.imageset/img2.png | Bin 0 -> 4805 bytes .../img3.imageset/Contents.json | 21 +++++ .../Assets.xcassets/img3.imageset/img3.png | Bin 0 -> 5938 bytes .../img4.imageset/Contents.json | 21 +++++ .../Assets.xcassets/img4.imageset/img4.png | Bin 0 -> 5177 bytes .../img5.imageset/Contents.json | 21 +++++ .../Assets.xcassets/img5.imageset/img5.png | Bin 0 -> 5132 bytes .../img6.imageset/Contents.json | 21 +++++ .../Assets.xcassets/img6.imageset/img6.png | Bin 0 -> 5420 bytes .../img7.imageset/Contents.json | 21 +++++ .../Assets.xcassets/img7.imageset/img7.png | Bin 0 -> 4134 bytes .../Screens/Components/ContactCellView.swift | 5 ++ .../ContactList/ContactListModel.swift | 26 ++++++ .../Screens/ContactList/ContactListView.swift | 77 ++++++++++++++++++ .../ContactListViewController.swift | 63 ++++++++++++++ 20 files changed, 323 insertions(+), 1 deletion(-) create mode 100644 solutions/devsprint-pedro-alvarez-2/FinanceApp/Resources/Assets.xcassets/img.imageset/Contents.json create mode 100644 solutions/devsprint-pedro-alvarez-2/FinanceApp/Resources/Assets.xcassets/img.imageset/img.png create mode 100644 solutions/devsprint-pedro-alvarez-2/FinanceApp/Resources/Assets.xcassets/img2.imageset/Contents.json create mode 100644 solutions/devsprint-pedro-alvarez-2/FinanceApp/Resources/Assets.xcassets/img2.imageset/img2.png create mode 100644 solutions/devsprint-pedro-alvarez-2/FinanceApp/Resources/Assets.xcassets/img3.imageset/Contents.json create mode 100644 solutions/devsprint-pedro-alvarez-2/FinanceApp/Resources/Assets.xcassets/img3.imageset/img3.png create mode 100644 solutions/devsprint-pedro-alvarez-2/FinanceApp/Resources/Assets.xcassets/img4.imageset/Contents.json create mode 100644 solutions/devsprint-pedro-alvarez-2/FinanceApp/Resources/Assets.xcassets/img4.imageset/img4.png create mode 100644 solutions/devsprint-pedro-alvarez-2/FinanceApp/Resources/Assets.xcassets/img5.imageset/Contents.json create mode 100644 solutions/devsprint-pedro-alvarez-2/FinanceApp/Resources/Assets.xcassets/img5.imageset/img5.png create mode 100644 solutions/devsprint-pedro-alvarez-2/FinanceApp/Resources/Assets.xcassets/img6.imageset/Contents.json create mode 100644 solutions/devsprint-pedro-alvarez-2/FinanceApp/Resources/Assets.xcassets/img6.imageset/img6.png create mode 100644 solutions/devsprint-pedro-alvarez-2/FinanceApp/Resources/Assets.xcassets/img7.imageset/Contents.json create mode 100644 solutions/devsprint-pedro-alvarez-2/FinanceApp/Resources/Assets.xcassets/img7.imageset/img7.png create mode 100644 solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ContactList/ContactListModel.swift diff --git a/solutions/devsprint-pedro-alvarez-2/FinanceApp.xcodeproj/project.pbxproj b/solutions/devsprint-pedro-alvarez-2/FinanceApp.xcodeproj/project.pbxproj index 4e9ec32..3f3e46d 100644 --- a/solutions/devsprint-pedro-alvarez-2/FinanceApp.xcodeproj/project.pbxproj +++ b/solutions/devsprint-pedro-alvarez-2/FinanceApp.xcodeproj/project.pbxproj @@ -50,6 +50,7 @@ 98C8A4E327C819DE00A630ED /* Contact.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98C8A4E227C819DE00A630ED /* Contact.swift */; }; 98C8A4E527C81A3F00A630ED /* TransferResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98C8A4E427C81A3F00A630ED /* TransferResult.swift */; }; 98C8A4E727C81A9C00A630ED /* UserProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98C8A4E627C81A9C00A630ED /* UserProfile.swift */; }; + FBECEFF22943E4E40027C8A2 /* ContactListModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBECEFF12943E4E40027C8A2 /* ContactListModel.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -117,6 +118,7 @@ 98C8A4E227C819DE00A630ED /* Contact.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Contact.swift; sourceTree = ""; }; 98C8A4E427C81A3F00A630ED /* TransferResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransferResult.swift; sourceTree = ""; }; 98C8A4E627C81A9C00A630ED /* UserProfile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserProfile.swift; sourceTree = ""; }; + FBECEFF12943E4E40027C8A2 /* ContactListModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactListModel.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -308,6 +310,7 @@ children = ( 98584B19277E60740028DBEA /* ContactListView.swift */, 98584B1A277E60740028DBEA /* ContactListViewController.swift */, + FBECEFF12943E4E40027C8A2 /* ContactListModel.swift */, ); path = ContactList; sourceTree = ""; @@ -499,6 +502,7 @@ 98906BF229392248001D1975 /* ActivityListView.swift in Sources */, 98584AED277E50430028DBEA /* UserProfileView.swift in Sources */, 98C8A4E127C8196100A630ED /* ActivityDetails.swift in Sources */, + FBECEFF22943E4E40027C8A2 /* ContactListModel.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/solutions/devsprint-pedro-alvarez-2/FinanceApp/AppDelegate/SceneDelegate.swift b/solutions/devsprint-pedro-alvarez-2/FinanceApp/AppDelegate/SceneDelegate.swift index 2b7e42f..6720d84 100644 --- a/solutions/devsprint-pedro-alvarez-2/FinanceApp/AppDelegate/SceneDelegate.swift +++ b/solutions/devsprint-pedro-alvarez-2/FinanceApp/AppDelegate/SceneDelegate.swift @@ -17,7 +17,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { guard let windowScene = (scene as? UIWindowScene) else { return } self.window = UIWindow(frame: UIScreen.main.bounds) - self.window?.rootViewController = UINavigationController(rootViewController: HomeViewController()) + self.window?.rootViewController = UINavigationController(rootViewController: ContactListViewController()) self.window?.windowScene = windowScene self.window?.makeKeyAndVisible() } diff --git a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Resources/Assets.xcassets/img.imageset/Contents.json b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Resources/Assets.xcassets/img.imageset/Contents.json new file mode 100644 index 0000000..aca8f0c --- /dev/null +++ b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Resources/Assets.xcassets/img.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "img.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Resources/Assets.xcassets/img.imageset/img.png b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Resources/Assets.xcassets/img.imageset/img.png new file mode 100644 index 0000000000000000000000000000000000000000..7ccbeb1bc19df33e9dc427b4006ecd5d2b0d6e2d GIT binary patch literal 6046 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 literal 0 HcmV?d00001 diff --git a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Resources/Assets.xcassets/img3.imageset/Contents.json b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Resources/Assets.xcassets/img3.imageset/Contents.json new file mode 100644 index 0000000..0a9a17f --- /dev/null +++ b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Resources/Assets.xcassets/img3.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "img3.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Resources/Assets.xcassets/img3.imageset/img3.png b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Resources/Assets.xcassets/img3.imageset/img3.png new file mode 100644 index 0000000000000000000000000000000000000000..49e775b0c4ac463b4fe1af20de4b85559b4e7f71 GIT binary patch literal 5938 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 literal 0 HcmV?d00001 diff --git a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Resources/Assets.xcassets/img4.imageset/Contents.json b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Resources/Assets.xcassets/img4.imageset/Contents.json new file mode 100644 index 0000000..2e42959 --- /dev/null +++ b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Resources/Assets.xcassets/img4.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "img4.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Resources/Assets.xcassets/img4.imageset/img4.png b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Resources/Assets.xcassets/img4.imageset/img4.png new file mode 100644 index 0000000000000000000000000000000000000000..74a302548589bdf912a324f18ede618823612281 GIT binary patch literal 5177 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
_<1SkSahoJt}?#LLs!ZMQcR6_pRTv$-RFd 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 literal 0 HcmV?d00001 diff --git a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/Components/ContactCellView.swift b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/Components/ContactCellView.swift index f0bd3ee..63af1d1 100644 --- a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/Components/ContactCellView.swift +++ b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/Components/ContactCellView.swift @@ -9,4 +9,9 @@ import UIKit class ContactCellView { + private lazy var contactListView: ContactListView = { + let contactListView = ContactListView() + return contactListView + }() + } diff --git a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ContactList/ContactListModel.swift b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ContactList/ContactListModel.swift new file mode 100644 index 0000000..c56391d --- /dev/null +++ b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ContactList/ContactListModel.swift @@ -0,0 +1,26 @@ +// +// ContactListModel.swift +// FinanceApp +// +// Created by Kleiton Mendes on 09/12/22. +// + +import Foundation + +struct ContactListModel { + let name: String + let phone: String + let image: String? +} + + + +let contactList: [ContactListModel] = [ + ContactListModel(name: "Ronald Robertson", phone: "+55 (11) 99999-9999", image: "img"), + ContactListModel(name: "Johnny Watson", phone: "+55 (11) 99999-9999", image: "img2"), + ContactListModel(name: "Annette Cooper", phone: "+55 (11) 99999-9999", image: "img3"), + ContactListModel(name: "Arthur Bell", phone: "+55 (11) 99999-9999", image: "img4"), + ContactListModel(name: "Jane Warren", phone: "+55 (11) 99999-9999", image: "img5"), + ContactListModel(name: "JMorris Henry", phone: "+55 (11) 99999-9999", image: "img6"), + ContactListModel(name: "Irma Flores", phone: "+55 (11) 99999-9999", image: "img7"), +] diff --git a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ContactList/ContactListView.swift b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ContactList/ContactListView.swift index 06a4708..182a23b 100644 --- a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ContactList/ContactListView.swift +++ b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ContactList/ContactListView.swift @@ -8,5 +8,82 @@ import UIKit class ContactListView: UIView { + +// private lazy var titleLabel: UILabel = { +// let label = UILabel() +// label.translatesAutoresizingMaskIntoConstraints = false +// label.numberOfLines = 0 +// label.textColor = .black +// label.font = .boldSystemFont(ofSize: 20) +// label.textAlignment = .left +// label.text = "Contact List" +// label.backgroundColor = .gray +// return label +// }() + + private let imagePerson: UIImageView = { + let image = UIImageView(frame: CGRect(x: 0, y: 0, width: 50, height: 50)) + image.translatesAutoresizingMaskIntoConstraints = false + image.layer.cornerRadius = 10 + image.clipsToBounds = true + image.layer.masksToBounds = true + image.backgroundColor = .gray + image.contentMode = .scaleToFill + return image + }() + + private lazy var nameLabel: UILabel = { + let label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + label.numberOfLines = 0 + label.textColor = .black + label.font = .boldSystemFont(ofSize: 15) + label.textAlignment = .left + label.text = "Ronald Robertson" + return label + }() + + private lazy var phoneLabel: UILabel = { + let label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + label.numberOfLines = 0 + label.textColor = .gray + label.font = .boldSystemFont(ofSize: 13) + label.textAlignment = .left + label.text = "+55 (11)99999-9999" + return label + }() + + private lazy var stackView: UIStackView = { + let stackView = UIStackView() + stackView.translatesAutoresizingMaskIntoConstraints = false + return stackView + }() + + private func confighierarchy() { +// addSubview(titleLabel) + addSubview(imagePerson) + stackView.addArrangedSubview(nameLabel) + stackView.addArrangedSubview(phoneLabel) + } + + + private func configConstraints() { + NSLayoutConstraint.activate([ + +// titleLabel.topAnchor.constraint(equalTo: self.safeAreaLayoutGuide.topAnchor, constant: 32.0), +// titleLabel.trailingAnchor.constraint(equalTo: self.trailingAnchor), +// titleLabel.leadingAnchor.constraint(equalTo: self.leadingAnchor), + + imagePerson.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 10.0), + imagePerson.trailingAnchor.constraint(equalTo: stackView.trailingAnchor, constant: -10), + + + stackView.topAnchor.constraint(equalTo: topAnchor, constant: 16.0), + stackView.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -16.0), + stackView.leadingAnchor.constraint(equalTo: imagePerson.leadingAnchor, constant: 24.0), + stackView.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -24.0), + ]) + } } diff --git a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ContactList/ContactListViewController.swift b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ContactList/ContactListViewController.swift index 19efab5..a53b9cc 100644 --- a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ContactList/ContactListViewController.swift +++ b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ContactList/ContactListViewController.swift @@ -11,5 +11,68 @@ class ContactListViewController: UIViewController { override func loadView() { self.view = ContactListView() + + confighierarchy() + configConstraints() + } + + + private lazy var contactCellView: ContactCellView = { + let contactCellView = ContactCellView() + return contactCellView + }() + + private lazy var titleLabel: UILabel = { + let label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + label.numberOfLines = 0 + label.textColor = .black + label.font = .boldSystemFont(ofSize: 20) + label.textAlignment = .left + label.text = "Contact List" + label.backgroundColor = .gray + return label + }() + + private lazy var contactTableView: UITableView = { + let tableView = UITableView(frame: .zero, style: .plain) + tableView.translatesAutoresizingMaskIntoConstraints = false + tableView.delegate = self + tableView.dataSource = self + tableView.backgroundColor = .clear + tableView.register(ContactCellView.self, forCellReuseIdentifier: "cell") + tableView.separatorStyle = .none + return tableView + }() + + + private func confighierarchy() { + view.addSubview(titleLabel) + view.addSubview(contactTableView) + } + + + private func configConstraints() { + NSLayoutConstraint.activate([ + + titleLabel.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), + titleLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor), + + contactTableView.topAnchor.constraint(equalTo: titleLabel.topAnchor), + contactTableView.centerXAnchor.constraint(equalTo: view.centerXAnchor), + contactTableView.centerYAnchor.constraint(equalTo: view.centerYAnchor), + contactTableView.bottomAnchor.constraint(equalTo: view.bottomAnchor) + ]) + } +} + +extension ContactListViewController: UITableViewDelegate, UITableViewDataSource { + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as UITableViewCell + cell.textLabel?.text = contactList[indexPath.row].name + return cell + } + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return contactList.count } } From c755d2734b34f478e61378ddd849cbf54d553782 Mon Sep 17 00:00:00 2001 From: Kleiton Mendes Date: Tue, 13 Dec 2022 11:04:17 -0300 Subject: [PATCH 2/4] ajustando elementos --- .../Screens/ContactList/ContactListView.swift | 74 +++++++++---------- .../ContactListViewController.swift | 45 ++++++----- 2 files changed, 61 insertions(+), 58 deletions(-) diff --git a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ContactList/ContactListView.swift b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ContactList/ContactListView.swift index 182a23b..f4fb9a9 100644 --- a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ContactList/ContactListView.swift +++ b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ContactList/ContactListView.swift @@ -9,20 +9,8 @@ import UIKit class ContactListView: UIView { -// private lazy var titleLabel: UILabel = { -// let label = UILabel() -// label.translatesAutoresizingMaskIntoConstraints = false -// label.numberOfLines = 0 -// label.textColor = .black -// label.font = .boldSystemFont(ofSize: 20) -// label.textAlignment = .left -// label.text = "Contact List" -// label.backgroundColor = .gray -// return label -// }() - private let imagePerson: UIImageView = { - let image = UIImageView(frame: CGRect(x: 0, y: 0, width: 50, height: 50)) + let image = UIImageView(frame: CGRect(x: 0, y: 0, width: 50, height: 50)) image.translatesAutoresizingMaskIntoConstraints = false image.layer.cornerRadius = 10 image.clipsToBounds = true @@ -39,7 +27,6 @@ class ContactListView: UIView { label.textColor = .black label.font = .boldSystemFont(ofSize: 15) label.textAlignment = .left - label.text = "Ronald Robertson" return label }() @@ -50,40 +37,49 @@ class ContactListView: UIView { label.textColor = .gray label.font = .boldSystemFont(ofSize: 13) label.textAlignment = .left - label.text = "+55 (11)99999-9999" return label }() private lazy var stackView: UIStackView = { let stackView = UIStackView() stackView.translatesAutoresizingMaskIntoConstraints = false + stackView.axis = .vertical return stackView }() - private func confighierarchy() { -// addSubview(titleLabel) - addSubview(imagePerson) - stackView.addArrangedSubview(nameLabel) - stackView.addArrangedSubview(phoneLabel) - } - - - private func configConstraints() { - NSLayoutConstraint.activate([ + private lazy var separatorView: UIView = { + let view = UIView(frame: CGRect(x: 0, y: 100, width: 320, height: 1.0)) + view.layer.borderWidth = 1.0 + view.layer.borderColor = UIColor.gray.cgColor + return view + }() +} + + extension ContactListView { + private func confighierarchy() { + addSubview(imagePerson) + addSubview(separatorView) + stackView.addArrangedSubview(nameLabel) + stackView.addArrangedSubview(phoneLabel) + } -// titleLabel.topAnchor.constraint(equalTo: self.safeAreaLayoutGuide.topAnchor, constant: 32.0), -// titleLabel.trailingAnchor.constraint(equalTo: self.trailingAnchor), -// titleLabel.leadingAnchor.constraint(equalTo: self.leadingAnchor), - - imagePerson.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 10.0), - imagePerson.trailingAnchor.constraint(equalTo: stackView.trailingAnchor, constant: -10), - + + private func configConstraints() { + NSLayoutConstraint.activate([ - stackView.topAnchor.constraint(equalTo: topAnchor, constant: 16.0), - stackView.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -16.0), - stackView.leadingAnchor.constraint(equalTo: imagePerson.leadingAnchor, constant: 24.0), - stackView.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -24.0), - ]) - } + // titleLabel.topAnchor.constraint(equalTo: self.safeAreaLayoutGuide.topAnchor, constant: 32.0), + // titleLabel.trailingAnchor.constraint(equalTo: self.trailingAnchor), + // titleLabel.leadingAnchor.constraint(equalTo: self.leadingAnchor), + + imagePerson.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 10.0), + imagePerson.trailingAnchor.constraint(equalTo: stackView.trailingAnchor, constant: -10), + + + stackView.topAnchor.constraint(equalTo: topAnchor, constant: 16.0), + stackView.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -16.0), + stackView.leadingAnchor.constraint(equalTo: imagePerson.leadingAnchor, constant: 24.0), + stackView.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -24.0), + ]) + } -} + } diff --git a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ContactList/ContactListViewController.swift b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ContactList/ContactListViewController.swift index a53b9cc..7c558fa 100644 --- a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ContactList/ContactListViewController.swift +++ b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ContactList/ContactListViewController.swift @@ -8,7 +8,7 @@ import UIKit class ContactListViewController: UIViewController { - + override func loadView() { self.view = ContactListView() @@ -16,7 +16,9 @@ class ContactListViewController: UIViewController { configConstraints() } - + override func viewDidLoad() { + super.viewDidLoad() + } private lazy var contactCellView: ContactCellView = { let contactCellView = ContactCellView() return contactCellView @@ -45,26 +47,31 @@ class ContactListViewController: UIViewController { return tableView }() - - private func confighierarchy() { - view.addSubview(titleLabel) - view.addSubview(contactTableView) - } - - - private func configConstraints() { - NSLayoutConstraint.activate([ +// required init?(coder: NSCoder) { +// fatalError("init(coder:) has not been implemented") +// } +} + + extension ContactListViewController { + + private func confighierarchy() { + view.addSubview(titleLabel) + view.addSubview(contactTableView) + } - titleLabel.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), - titleLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor), + private func configConstraints() { + NSLayoutConstraint.activate([ - contactTableView.topAnchor.constraint(equalTo: titleLabel.topAnchor), - contactTableView.centerXAnchor.constraint(equalTo: view.centerXAnchor), - contactTableView.centerYAnchor.constraint(equalTo: view.centerYAnchor), - contactTableView.bottomAnchor.constraint(equalTo: view.bottomAnchor) - ]) + titleLabel.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), + titleLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor), + + contactTableView.topAnchor.constraint(equalTo: titleLabel.topAnchor), + contactTableView.centerXAnchor.constraint(equalTo: view.centerXAnchor), + contactTableView.centerYAnchor.constraint(equalTo: view.centerYAnchor), + contactTableView.bottomAnchor.constraint(equalTo: view.bottomAnchor) + ]) + } } -} extension ContactListViewController: UITableViewDelegate, UITableViewDataSource { func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { From e65aa75fbeba3854bfa9690c89f6859d23e2a6b5 Mon Sep 17 00:00:00 2001 From: Kleiton Mendes Date: Tue, 13 Dec 2022 22:38:27 -0300 Subject: [PATCH 3/4] =?UTF-8?q?ajustando=20partes=20do=20c=C3=B3digo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Screens/Components/ContactCellView.swift | 4 ++ .../ContactList/ContactListModel.swift | 17 ++--- .../Screens/ContactList/ContactListView.swift | 32 ++++++++-- .../ContactListViewController.swift | 63 ++++++++++--------- 4 files changed, 75 insertions(+), 41 deletions(-) diff --git a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/Components/ContactCellView.swift b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/Components/ContactCellView.swift index 63af1d1..45f1e37 100644 --- a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/Components/ContactCellView.swift +++ b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/Components/ContactCellView.swift @@ -14,4 +14,8 @@ class ContactCellView { return contactListView }() +// private func loadView() { +// view = ContactListView() +// } + } diff --git a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ContactList/ContactListModel.swift b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ContactList/ContactListModel.swift index c56391d..479d392 100644 --- a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ContactList/ContactListModel.swift +++ b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ContactList/ContactListModel.swift @@ -6,21 +6,22 @@ // import Foundation +import UIKit struct ContactListModel { let name: String let phone: String - let image: String? + let image: UIImage? } let contactList: [ContactListModel] = [ - ContactListModel(name: "Ronald Robertson", phone: "+55 (11) 99999-9999", image: "img"), - ContactListModel(name: "Johnny Watson", phone: "+55 (11) 99999-9999", image: "img2"), - ContactListModel(name: "Annette Cooper", phone: "+55 (11) 99999-9999", image: "img3"), - ContactListModel(name: "Arthur Bell", phone: "+55 (11) 99999-9999", image: "img4"), - ContactListModel(name: "Jane Warren", phone: "+55 (11) 99999-9999", image: "img5"), - ContactListModel(name: "JMorris Henry", phone: "+55 (11) 99999-9999", image: "img6"), - ContactListModel(name: "Irma Flores", phone: "+55 (11) 99999-9999", image: "img7"), + ContactListModel(name: "Ronald Robertson", phone: "+55 (11) 99999-9999", image: UIImage(named: "img")), + ContactListModel(name: "Johnny Watson", phone: "+55 (11) 99999-9999", image: UIImage(named: "img2")), + ContactListModel(name: "Annette Cooper", phone: "+55 (11) 99999-9999", image: UIImage(named: "img3")), + ContactListModel(name: "Arthur Bell", phone: "+55 (11) 99999-9999", image: UIImage(named: "img4")), + ContactListModel(name: "Jane Warren", phone: "+55 (11) 99999-9999", image: UIImage(named: "img5")), + ContactListModel(name: "JMorris Henry", phone: "+55 (11) 99999-9999", image: UIImage(named: "img6")), + ContactListModel(name: "Irma Flores", phone: "+55 (11) 99999-9999", image: UIImage(named: "img7")), ] diff --git a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ContactList/ContactListView.swift b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ContactList/ContactListView.swift index f4fb9a9..597d533 100644 --- a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ContactList/ContactListView.swift +++ b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ContactList/ContactListView.swift @@ -9,6 +9,7 @@ import UIKit class ContactListView: UIView { + // MARK: - Private Properties UI private let imagePerson: UIImageView = { let image = UIImageView(frame: CGRect(x: 0, y: 0, width: 50, height: 50)) image.translatesAutoresizingMaskIntoConstraints = false @@ -53,9 +54,35 @@ class ContactListView: UIView { view.layer.borderColor = UIColor.gray.cgColor return view }() + + private let viewModel: ContactListModel + + // MARK: - Init + init(viewModel: ContactListModel) { + self.viewModel = viewModel + super.init(frame: .zero) + getPopularTableView() + confighierarchy() + configConstraints() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + + } + + private func getPopularTableView() { + imagePerson.image = viewModel.image + nameLabel.text = viewModel.name + phoneLabel.text = viewModel.phone + } + } + extension ContactListView { + // MARK: - Private Methods private func confighierarchy() { addSubview(imagePerson) addSubview(separatorView) @@ -66,15 +93,10 @@ class ContactListView: UIView { private func configConstraints() { NSLayoutConstraint.activate([ - - // titleLabel.topAnchor.constraint(equalTo: self.safeAreaLayoutGuide.topAnchor, constant: 32.0), - // titleLabel.trailingAnchor.constraint(equalTo: self.trailingAnchor), - // titleLabel.leadingAnchor.constraint(equalTo: self.leadingAnchor), imagePerson.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 10.0), imagePerson.trailingAnchor.constraint(equalTo: stackView.trailingAnchor, constant: -10), - stackView.topAnchor.constraint(equalTo: topAnchor, constant: 16.0), stackView.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -16.0), stackView.leadingAnchor.constraint(equalTo: imagePerson.leadingAnchor, constant: 24.0), diff --git a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ContactList/ContactListViewController.swift b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ContactList/ContactListViewController.swift index 7c558fa..008ec3e 100644 --- a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ContactList/ContactListViewController.swift +++ b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ContactList/ContactListViewController.swift @@ -9,32 +9,41 @@ import UIKit class ContactListViewController: UIViewController { - override func loadView() { - self.view = ContactListView() - - confighierarchy() - configConstraints() - } +// override func loadView() { +// self.view = ContactListView() +// } + +// private var contactListView = ContactListView() +// override func loadView() { +// view = ContactListView(viewModel: ContactListModel(name: "+55 (11) 99999-9999", +// phone: "Ronald Robertson", +// image: UIImage(named: "img"))) +// } + + override func viewDidLoad() { super.viewDidLoad() + navigationItem.title = "Contact List" + confighierarchy() + configConstraints() } private lazy var contactCellView: ContactCellView = { let contactCellView = ContactCellView() return contactCellView }() - - private lazy var titleLabel: UILabel = { - let label = UILabel() - label.translatesAutoresizingMaskIntoConstraints = false - label.numberOfLines = 0 - label.textColor = .black - label.font = .boldSystemFont(ofSize: 20) - label.textAlignment = .left - label.text = "Contact List" - label.backgroundColor = .gray - return label - }() + // MARK: - Private Properties UI +// private lazy var titleLabel: UILabel = { +// let label = UILabel() +// label.translatesAutoresizingMaskIntoConstraints = false +// label.numberOfLines = 0 +// label.textColor = .black +// label.font = .boldSystemFont(ofSize: 20) +// label.textAlignment = .left +// label.text = "Contact List" +// label.backgroundColor = .gray +// return label +// }() private lazy var contactTableView: UITableView = { let tableView = UITableView(frame: .zero, style: .plain) @@ -46,26 +55,22 @@ class ContactListViewController: UIViewController { tableView.separatorStyle = .none return tableView }() - -// required init?(coder: NSCoder) { -// fatalError("init(coder:) has not been implemented") -// } } extension ContactListViewController { - + // MARK: - Private Methods private func confighierarchy() { - view.addSubview(titleLabel) +// view.addSubview(titleLabel) view.addSubview(contactTableView) } private func configConstraints() { NSLayoutConstraint.activate([ - titleLabel.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), - titleLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor), +// titleLabel.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), +// titleLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor), - contactTableView.topAnchor.constraint(equalTo: titleLabel.topAnchor), + contactTableView.topAnchor.constraint(equalTo: view.topAnchor), contactTableView.centerXAnchor.constraint(equalTo: view.centerXAnchor), contactTableView.centerYAnchor.constraint(equalTo: view.centerYAnchor), contactTableView.bottomAnchor.constraint(equalTo: view.bottomAnchor) @@ -77,7 +82,9 @@ extension ContactListViewController: UITableViewDelegate, UITableViewDataSource func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as UITableViewCell cell.textLabel?.text = contactList[indexPath.row].name - return cell + cell.textLabel?.text = contactList[indexPath.row].phone + cell.imageView?.image = contactList[indexPath.row].image + return cell ?? UITableViewCell() } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return contactList.count From 55140f9c447688e576785656c473ed5dfa28415b Mon Sep 17 00:00:00 2001 From: Kleiton Mendes Date: Fri, 16 Dec 2022 11:17:22 -0300 Subject: [PATCH 4/4] ajustando SceneDelegate --- .../FinanceApp/AppDelegate/SceneDelegate.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solutions/devsprint-pedro-alvarez-2/FinanceApp/AppDelegate/SceneDelegate.swift b/solutions/devsprint-pedro-alvarez-2/FinanceApp/AppDelegate/SceneDelegate.swift index 6720d84..2b7e42f 100644 --- a/solutions/devsprint-pedro-alvarez-2/FinanceApp/AppDelegate/SceneDelegate.swift +++ b/solutions/devsprint-pedro-alvarez-2/FinanceApp/AppDelegate/SceneDelegate.swift @@ -17,7 +17,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { guard let windowScene = (scene as? UIWindowScene) else { return } self.window = UIWindow(frame: UIScreen.main.bounds) - self.window?.rootViewController = UINavigationController(rootViewController: ContactListViewController()) + self.window?.rootViewController = UINavigationController(rootViewController: HomeViewController()) self.window?.windowScene = windowScene self.window?.makeKeyAndVisible() }