From 24ba05927d7c7030aeda561970c7844292d89232 Mon Sep 17 00:00:00 2001 From: Kleiton Mendes Date: Mon, 12 Dec 2022 15:57:58 -0300 Subject: [PATCH 1/6] Implementando a esrutura Basica View Code --- .../FinanceApp.xcodeproj/project.pbxproj | 16 ++++++ .../FinanceApp/Models/BaseViewHierarchy.swift | 30 +++++++++++ .../Screens/Components/Base/BaseView.swift | 53 +++++++++++++++++++ 3 files changed, 99 insertions(+) create mode 100644 solutions/devsprint-pedro-alvarez-2/FinanceApp/Models/BaseViewHierarchy.swift create mode 100644 solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/Components/Base/BaseView.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..43c048f 100644 --- a/solutions/devsprint-pedro-alvarez-2/FinanceApp.xcodeproj/project.pbxproj +++ b/solutions/devsprint-pedro-alvarez-2/FinanceApp.xcodeproj/project.pbxproj @@ -50,6 +50,8 @@ 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 */; }; + FBB56216294777360060278D /* BaseViewHierarchy.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBB56215294777360060278D /* BaseViewHierarchy.swift */; }; + FBB56219294778320060278D /* BaseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBB56218294778320060278D /* BaseView.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -117,6 +119,8 @@ 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 = ""; }; + FBB56215294777360060278D /* BaseViewHierarchy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseViewHierarchy.swift; sourceTree = ""; }; + FBB56218294778320060278D /* BaseView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseView.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -263,6 +267,7 @@ 98C8A4E227C819DE00A630ED /* Contact.swift */, 98C8A4E427C81A3F00A630ED /* TransferResult.swift */, 98C8A4E627C81A9C00A630ED /* UserProfile.swift */, + FBB56215294777360060278D /* BaseViewHierarchy.swift */, ); path = Models; sourceTree = ""; @@ -315,6 +320,7 @@ 98906BEC29392209001D1975 /* Components */ = { isa = PBXGroup; children = ( + FBB56217294778170060278D /* Base */, 98906BED2939221B001D1975 /* AccountSummaryView.swift */, 98906BEF2939223C001D1975 /* ActivityCellView.swift */, 98906BF129392248001D1975 /* ActivityListView.swift */, @@ -341,6 +347,14 @@ path = Extensions; sourceTree = ""; }; + FBB56217294778170060278D /* Base */ = { + isa = PBXGroup; + children = ( + FBB56218294778320060278D /* BaseView.swift */, + ); + path = Base; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -482,6 +496,7 @@ 98C8A4E327C819DE00A630ED /* Contact.swift in Sources */, 98C8A4E527C81A3F00A630ED /* TransferResult.swift in Sources */, 98584AE8277E50430028DBEA /* TransfersViewController.swift in Sources */, + FBB56216294777360060278D /* BaseViewHierarchy.swift in Sources */, 98906BF42939225B001D1975 /* ContactCellView.swift in Sources */, 98584B14277E605F0028DBEA /* ActivityDetailsView.swift in Sources */, 98584AE7277E50430028DBEA /* TransfersView.swift in Sources */, @@ -497,6 +512,7 @@ 989627E027ADC2F60009A07F /* DebugViewController.swift in Sources */, 98584AA5277E35E90028DBEA /* HomeViewController.swift in Sources */, 98906BF229392248001D1975 /* ActivityListView.swift in Sources */, + FBB56219294778320060278D /* BaseView.swift in Sources */, 98584AED277E50430028DBEA /* UserProfileView.swift in Sources */, 98C8A4E127C8196100A630ED /* ActivityDetails.swift in Sources */, ); diff --git a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Models/BaseViewHierarchy.swift b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Models/BaseViewHierarchy.swift new file mode 100644 index 0000000..7c6d033 --- /dev/null +++ b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Models/BaseViewHierarchy.swift @@ -0,0 +1,30 @@ +// +// BaseViewHierarchy.swift +// FinanceApp +// +// Created by Kleiton Mendes on 12/12/22. +// + +import UIKit + +public struct BaseViewHierarchy { + let parentView: UIView + let subViews: [UIView] + + init(parentView: UIView, subViews: [UIView]) { + self.parentView = parentView + self.subViews = subViews + } + + func makeHierarchy() { + if let stackView = parentView as? UIStackView { + for view in subViews { + stackView.addArrangedSubview(view) + } + } else { + for view in subViews { + parentView.addSubview(view) + } + } + } +} diff --git a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/Components/Base/BaseView.swift b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/Components/Base/BaseView.swift new file mode 100644 index 0000000..173aa0e --- /dev/null +++ b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/Components/Base/BaseView.swift @@ -0,0 +1,53 @@ +// +// BaseView.swift +// FinanceApp +// +// Created by Kleiton Mendes on 12/12/22. +// + +import UIKit + +public class BaseView: UIView { + open var hierarchies: [BaseViewHierarchy] { [] } + + override init(frame: CGRect) { + super.init(frame: frame) + setupHierarchy() + setupConstraints() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +// public var viewModel: ViewModel? { +// didSet { +// configureView(viewModel) +// } +// } + + private func setupHierarchy() { + for relation in hierarchies { + for subView in relation.subViews { + if let stackView = relation.parentView as? UIStackView { + stackView.addArrangedSubview(subView) + } else { + relation.parentView.addSubview(subView) + } + } + } + } + + private func setupConstraints() { + NSLayoutConstraint.activate(constraints) + } + +// open func configureView(_ viewModel: ViewModel?) { } + + private func setupView() { + for relation in hierarchies { + relation.makeHierarchy() + } + } + +} From 7d252adb72e285f3dbe4e02fc1a1f0e97ef3881c Mon Sep 17 00:00:00 2001 From: Kleiton Mendes Date: Mon, 12 Dec 2022 17:03:27 -0300 Subject: [PATCH 2/6] retirando comentarios e espacos --- .../FinanceApp/Screens/Components/Base/BaseView.swift | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/Components/Base/BaseView.swift b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/Components/Base/BaseView.swift index 173aa0e..1e0da3f 100644 --- a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/Components/Base/BaseView.swift +++ b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/Components/Base/BaseView.swift @@ -7,7 +7,7 @@ import UIKit -public class BaseView: UIView { +public class BaseView: UIView { open var hierarchies: [BaseViewHierarchy] { [] } override init(frame: CGRect) { @@ -20,12 +20,6 @@ public class BaseView: UIView { fatalError("init(coder:) has not been implemented") } -// public var viewModel: ViewModel? { -// didSet { -// configureView(viewModel) -// } -// } - private func setupHierarchy() { for relation in hierarchies { for subView in relation.subViews { @@ -42,12 +36,9 @@ public class BaseView: UIView { NSLayoutConstraint.activate(constraints) } -// open func configureView(_ viewModel: ViewModel?) { } - private func setupView() { for relation in hierarchies { relation.makeHierarchy() } } - } From 3c3f397d7d10b7360a809d133729f9b28e59aa60 Mon Sep 17 00:00:00 2001 From: Brun41v35 Date: Mon, 12 Dec 2022 17:21:13 -0300 Subject: [PATCH 3/6] Adicionando layout de compra do produto --- .../FinanceApp.xcodeproj/project.pbxproj | 4 + .../mall.imageset/Contents.json | 15 ++ .../ActivityDetails/ActivityDetailsView.swift | 154 +++++++++++++++++- .../ActivityDetailsViewController.swift | 17 +- .../ActivityDetailsViewModel.swift | 9 + 5 files changed, 181 insertions(+), 18 deletions(-) create mode 100644 solutions/devsprint-pedro-alvarez-2/FinanceApp/Resources/Assets.xcassets/mall.imageset/Contents.json create mode 100644 solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ActivityDetails/ActivityDetailsViewModel.swift diff --git a/solutions/devsprint-pedro-alvarez-2/FinanceApp.xcodeproj/project.pbxproj b/solutions/devsprint-pedro-alvarez-2/FinanceApp.xcodeproj/project.pbxproj index c80625f..00bca57 100644 --- a/solutions/devsprint-pedro-alvarez-2/FinanceApp.xcodeproj/project.pbxproj +++ b/solutions/devsprint-pedro-alvarez-2/FinanceApp.xcodeproj/project.pbxproj @@ -8,6 +8,7 @@ /* Begin PBXBuildFile section */ 1DBC0432294176F6000501FA /* TabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DBC0431294176F6000501FA /* TabBarController.swift */; }; + 7EFE570B2947C06900CEB30C /* ActivityDetailsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7EFE570A2947C06900CEB30C /* ActivityDetailsViewModel.swift */; }; 98584A6D277E32C30028DBEA /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98584A6C277E32C30028DBEA /* AppDelegate.swift */; }; 98584A6F277E32C30028DBEA /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98584A6E277E32C30028DBEA /* SceneDelegate.swift */; }; 98584A76277E32C50028DBEA /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 98584A75277E32C50028DBEA /* Assets.xcassets */; }; @@ -72,6 +73,7 @@ /* Begin PBXFileReference section */ 1DBC0431294176F6000501FA /* TabBarController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabBarController.swift; sourceTree = ""; }; + 7EFE570A2947C06900CEB30C /* ActivityDetailsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivityDetailsViewModel.swift; sourceTree = ""; }; 98584A69277E32C30028DBEA /* FinanceApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FinanceApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; 98584A6C277E32C30028DBEA /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 98584A6E277E32C30028DBEA /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; @@ -310,6 +312,7 @@ children = ( 98584B0E277E605F0028DBEA /* ActivityDetailsView.swift */, 98584B0A277E605F0028DBEA /* ActivityDetailsViewController.swift */, + 7EFE570A2947C06900CEB30C /* ActivityDetailsViewModel.swift */, ); path = ActivityDetails; sourceTree = ""; @@ -510,6 +513,7 @@ 98584AA5277E35E90028DBEA /* HomeViewController.swift in Sources */, 98906BF229392248001D1975 /* ActivityListView.swift in Sources */, 98584AED277E50430028DBEA /* UserProfileView.swift in Sources */, + 7EFE570B2947C06900CEB30C /* ActivityDetailsViewModel.swift in Sources */, 98C8A4E127C8196100A630ED /* ActivityDetails.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Resources/Assets.xcassets/mall.imageset/Contents.json b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Resources/Assets.xcassets/mall.imageset/Contents.json new file mode 100644 index 0000000..fbe6609 --- /dev/null +++ b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Resources/Assets.xcassets/mall.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "mall.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ActivityDetails/ActivityDetailsView.swift b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ActivityDetails/ActivityDetailsView.swift index a1656e1..cfecbe8 100644 --- a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ActivityDetails/ActivityDetailsView.swift +++ b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ActivityDetails/ActivityDetailsView.swift @@ -1,12 +1,148 @@ -// -// ActivityDetailsView.swift -// FinanceApp -// -// Created by Rodrigo Borges on 30/12/21. -// - import UIKit -class ActivityDetailsView: UIView { - +final class ActivityDetailsView: UIView { + + // MARK: - Private Properties UI + + private lazy var mainStack: UIStackView = { + let stack = UIStackView() + stack.axis = .vertical + stack.distribution = .fillEqually + stack.translatesAutoresizingMaskIntoConstraints = false + + return stack + }() + + private lazy var productView: UIView = { + let view = UIView() + + return view + }() + + private lazy var productValueView: UIView = { + let view = UIView() + + return view + }() + + private lazy var productImage: UIImageView = { + let imageView = UIImageView() + imageView.translatesAutoresizingMaskIntoConstraints = false + + return imageView + }() + + private lazy var productNameLabel: UILabel = { + let label = UILabel() + label.textAlignment = .center + label.font = UIFont.boldSystemFont(ofSize: 17) + label.translatesAutoresizingMaskIntoConstraints = false + + return label + }() + + private lazy var categoryNameLabel: UILabel = { + let label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + + return label + }() + + private lazy var productValue: UILabel = { + let label = UILabel() + label.font = UIFont.boldSystemFont(ofSize: 34) + label.translatesAutoresizingMaskIntoConstraints = false + + return label + }() + + private lazy var purchaseTime: UILabel = { + let label = UILabel() + label.textAlignment = .center + label.translatesAutoresizingMaskIntoConstraints = false + + return label + }() + + private lazy var reportButton: UIButton = { + let button = UIButton() + button.layer.cornerRadius = 14 + button.backgroundColor = .systemBlue + button.setTitle("Report a issue", for: .normal) + button.translatesAutoresizingMaskIntoConstraints = false + + return button + }() + + private let viewModel: ActivityDetailsViewModel + + // MARK: - Init + + init(viewModel: ActivityDetailsViewModel) { + self.viewModel = viewModel + super.init(frame: .zero) + setup() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - Private Methods + + private func setup() { + setupHierarchy() + setupConstraints() + setupExtra() + } + + private func setupHierarchy() { + addSubview(mainStack) + mainStack.addArrangedSubview(productView) + productView.addSubview(productImage) + productView.addSubview(productNameLabel) + productView.addSubview(categoryNameLabel) + + mainStack.addArrangedSubview(productValueView) + productValueView.addSubview(productValue) + productValueView.addSubview(purchaseTime) + + addSubview(reportButton) + } + + private func setupConstraints() { + NSLayoutConstraint.activate([ + mainStack.topAnchor.constraint(equalTo: safeAreaLayoutGuide.topAnchor), + mainStack.leadingAnchor.constraint(equalTo: leadingAnchor), + mainStack.trailingAnchor.constraint(equalTo: trailingAnchor), + mainStack.bottomAnchor.constraint(equalTo: reportButton.topAnchor, constant: -50), + + productImage.centerXAnchor.constraint(equalTo: centerXAnchor), + + productNameLabel.centerXAnchor.constraint(equalTo: centerXAnchor), + productNameLabel.topAnchor.constraint(equalTo: productImage.bottomAnchor, constant: 8), + + categoryNameLabel.centerXAnchor.constraint(equalTo: centerXAnchor), + categoryNameLabel.topAnchor.constraint(equalTo: productNameLabel.bottomAnchor, constant: 8), + + productValue.centerXAnchor.constraint(equalTo: centerXAnchor), + purchaseTime.centerXAnchor.constraint(equalTo: centerXAnchor), + purchaseTime.topAnchor.constraint(equalTo: productValue.bottomAnchor, constant: 8), + + reportButton.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 20), + reportButton.bottomAnchor.constraint(equalTo: safeAreaLayoutGuide.bottomAnchor, constant: -15), + reportButton.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -20), + reportButton.heightAnchor.constraint(equalToConstant: 56) + ]) + } + + private func setupExtra() { + backgroundColor = .systemBackground + productImage.image = viewModel.image + productNameLabel.text = viewModel.name + categoryNameLabel.text = viewModel.category + productValue.text = viewModel.value + purchaseTime.text = viewModel.purchaseTime + } } diff --git a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ActivityDetails/ActivityDetailsViewController.swift b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ActivityDetails/ActivityDetailsViewController.swift index 1ba1558..3ebebce 100644 --- a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ActivityDetails/ActivityDetailsViewController.swift +++ b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ActivityDetails/ActivityDetailsViewController.swift @@ -1,15 +1,14 @@ -// -// ActivityDetailsViewController.swift -// FinanceApp -// -// Created by Rodrigo Borges on 30/12/21. -// - import UIKit -class ActivityDetailsViewController: UIViewController { +final class ActivityDetailsViewController: UIViewController { + // MARK: - Life Cycle + override func loadView() { - self.view = ActivityDetailsView() + view = ActivityDetailsView(viewModel: ActivityDetailsViewModel(image: UIImage(named: "mall"), + name: "Mall", + category: "Shopping", + value: "$1000.0", + purchaseTime: "8:40")) } } diff --git a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ActivityDetails/ActivityDetailsViewModel.swift b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ActivityDetails/ActivityDetailsViewModel.swift new file mode 100644 index 0000000..32e3aa6 --- /dev/null +++ b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ActivityDetails/ActivityDetailsViewModel.swift @@ -0,0 +1,9 @@ +import UIKit + +struct ActivityDetailsViewModel { + let image: UIImage? + let name: String + let category: String + let value: String + let purchaseTime: String +} From f67fa1a57dfad08e83fe69a95a06ef9c15084b2a Mon Sep 17 00:00:00 2001 From: Kleiton Mendes Date: Tue, 13 Dec 2022 12:06:54 -0300 Subject: [PATCH 4/6] =?UTF-8?q?Efetuando=20ajuste=20seguindo=20coment?= =?UTF-8?q?=C3=A1rios=20do=20CR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FinanceApp/Models/BaseViewHierarchy.swift | 2 +- .../Screens/Components/Base/BaseView.swift | 15 +-------------- 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Models/BaseViewHierarchy.swift b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Models/BaseViewHierarchy.swift index 7c6d033..324b561 100644 --- a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Models/BaseViewHierarchy.swift +++ b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Models/BaseViewHierarchy.swift @@ -7,7 +7,7 @@ import UIKit -public struct BaseViewHierarchy { +struct BaseViewHierarchy { let parentView: UIView let subViews: [UIView] diff --git a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/Components/Base/BaseView.swift b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/Components/Base/BaseView.swift index 1e0da3f..c022a5d 100644 --- a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/Components/Base/BaseView.swift +++ b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/Components/Base/BaseView.swift @@ -7,12 +7,11 @@ import UIKit -public class BaseView: UIView { +class BaseView: UIView { open var hierarchies: [BaseViewHierarchy] { [] } override init(frame: CGRect) { super.init(frame: frame) - setupHierarchy() setupConstraints() } @@ -20,18 +19,6 @@ public class BaseView: UIView { fatalError("init(coder:) has not been implemented") } - private func setupHierarchy() { - for relation in hierarchies { - for subView in relation.subViews { - if let stackView = relation.parentView as? UIStackView { - stackView.addArrangedSubview(subView) - } else { - relation.parentView.addSubview(subView) - } - } - } - } - private func setupConstraints() { NSLayoutConstraint.activate(constraints) } From 94ff6c1ffce1b71d7654243366d48bd3dc6082cd Mon Sep 17 00:00:00 2001 From: Brun41v35 Date: Tue, 13 Dec 2022 18:30:51 -0300 Subject: [PATCH 5/6] pdf image --- .../Assets.xcassets/mall.imageset/mall.pdf | Bin 0 -> 3028 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 solutions/devsprint-pedro-alvarez-2/FinanceApp/Resources/Assets.xcassets/mall.imageset/mall.pdf diff --git a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Resources/Assets.xcassets/mall.imageset/mall.pdf b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Resources/Assets.xcassets/mall.imageset/mall.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d4780fca54e02ea1d8f56bbc76df59fc651eac47 GIT binary patch literal 3028 zcmbtWO>f&q5WVlO*h>KC;N^ZV7cdOOQdGE&8&_7*Lz)9kQ8o*SR7tu>`s+Kh{8&nH za;X3b)Z5wFnK!d<_~w4Ox)jV2A}FWz<6nf*t1Fs(D5|IKnMwfH^!l2#T~lNSBA9SI z^(nxd@ziN9=_O}E8}BU@04Y6x*a||5YCG(PCp>|m*ZwFYa5;c#0zZMH;h4|UvYwV_ z;TZtu;U$aP{P4By zioUg`P`rNqeFYgJr|2P2lZ;UBA()Ln$+Fz-Am%DB zTKWk*CE)S%xgj)e@BEK)+da1wdu%;GtGeoLZt5?%oAL1Z(Zk?7!EJY0*Oa&s8vc75 zf3P&V>XSr=Lr9zY_o~D?Q|$IB(6VVeWDk0(&*npR2CRn;58Q^N;b**94t(_$LuT=~ zK=DdYtQuATFZgJUS36n{GT;ZpQ3jG_@lTl->z{7u;(^TmK9@(*qY zZwKNWlNzivO4NXQ&r+@}_>+Pen=0dJ#B|D1p|w#oClPg)aUq=W6g&#=q_xzi%nC2G zpxQHUU|G(voJh%>QJ&8&r;MY+37VfgfiXmImvZTVq?pQUN#{U@GC;O>5Tw)$s53yo zfk@AQIDv^zsI)Aoxu*D}HKr3WC7BQ=6oy39cm_o?oYVabwVF94H54YEV;xgAP!uDI zSWc8@!g44wjp!axXoJ4ewXev0e3+KAj3GS&;a3wowzf z!g8W5(|v8CC7do&kC!KUd@UmE(H*JCZ~sp!ZZ<^l>E3_)Fk5_0HZ}*6fCNr@wAqnQ z^x{vDskihq-TX}6Zy-XH#j^p3TG$IDTmv`hrhqr1nQ*?Vs=9;8bgK3D8BFzF!|#f1 znSF2kfc6aP7N15>QR`9I$04x*S%<0KQq=Deyw7mbQxPUDoI8{GfJL4ErQG5e4N0uW zIhri$7u-Hhr!dknh4#!>e4oP!6D;DPknS+f7g?9>>!;JrUmAG*ftLYA`U!!*)Ec7< z1$_8mT==2Y2!Y^!11ZS;%nAp{DP%0LaR#OEUT_L|4~`VVc`w4?w4 literal 0 HcmV?d00001 From c61d9bd724811cdf20cc7469ccc150eda171c80e Mon Sep 17 00:00:00 2001 From: Brun41v35 Date: Tue, 13 Dec 2022 19:09:25 -0300 Subject: [PATCH 6/6] Utilizando o BaseView --- .../ActivityDetails/ActivityDetailsView.swift | 65 ++++++++----------- .../Screens/Components/Base/BaseView.swift | 1 + 2 files changed, 27 insertions(+), 39 deletions(-) diff --git a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ActivityDetails/ActivityDetailsView.swift b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ActivityDetails/ActivityDetailsView.swift index cfecbe8..47fc3cd 100644 --- a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ActivityDetails/ActivityDetailsView.swift +++ b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/ActivityDetails/ActivityDetailsView.swift @@ -1,6 +1,6 @@ import UIKit -final class ActivityDetailsView: UIView { +final class ActivityDetailsView: BaseView { // MARK: - Private Properties UI @@ -74,45 +74,15 @@ final class ActivityDetailsView: UIView { return button }() - private let viewModel: ActivityDetailsViewModel - - // MARK: - Init - - init(viewModel: ActivityDetailsViewModel) { - self.viewModel = viewModel - super.init(frame: .zero) - setup() - } - - @available(*, unavailable) - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - // MARK: - Private Methods - - private func setup() { - setupHierarchy() - setupConstraints() - setupExtra() - } - - private func setupHierarchy() { - addSubview(mainStack) - mainStack.addArrangedSubview(productView) - productView.addSubview(productImage) - productView.addSubview(productNameLabel) - productView.addSubview(categoryNameLabel) - - mainStack.addArrangedSubview(productValueView) - productValueView.addSubview(productValue) - productValueView.addSubview(purchaseTime) - - addSubview(reportButton) + override var hierarchies: [BaseViewHierarchy] { + return [BaseViewHierarchy.init(parentView: self, subViews: [mainStack, reportButton]), + BaseViewHierarchy.init(parentView: mainStack, subViews: [productView, productValueView]), + BaseViewHierarchy.init(parentView: productView, subViews: [productImage, productNameLabel,categoryNameLabel]), + BaseViewHierarchy.init(parentView: productValueView, subViews: [productValue, purchaseTime])] } - private func setupConstraints() { - NSLayoutConstraint.activate([ + override var constraints: [NSLayoutConstraint] { + [ mainStack.topAnchor.constraint(equalTo: safeAreaLayoutGuide.topAnchor), mainStack.leadingAnchor.constraint(equalTo: leadingAnchor), mainStack.trailingAnchor.constraint(equalTo: trailingAnchor), @@ -134,9 +104,26 @@ final class ActivityDetailsView: UIView { reportButton.bottomAnchor.constraint(equalTo: safeAreaLayoutGuide.bottomAnchor, constant: -15), reportButton.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -20), reportButton.heightAnchor.constraint(equalToConstant: 56) - ]) + ] } + private let viewModel: ActivityDetailsViewModel + + // MARK: - Init + + init(viewModel: ActivityDetailsViewModel) { + self.viewModel = viewModel + super.init(frame: .zero) + setupExtra() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - Private Methods + private func setupExtra() { backgroundColor = .systemBackground productImage.image = viewModel.image diff --git a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/Components/Base/BaseView.swift b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/Components/Base/BaseView.swift index c022a5d..366b6b5 100644 --- a/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/Components/Base/BaseView.swift +++ b/solutions/devsprint-pedro-alvarez-2/FinanceApp/Screens/Components/Base/BaseView.swift @@ -12,6 +12,7 @@ class BaseView: UIView { override init(frame: CGRect) { super.init(frame: frame) + setupView() setupConstraints() }