From abb8f691fe6f276205d1cea655ee9938194d1e67 Mon Sep 17 00:00:00 2001 From: Nicholas Tay Date: Thu, 24 Mar 2022 15:46:13 +1100 Subject: Split details view into separate View and VC Also fixed the scrollview margins while I was at it - it looked weird being so inside --- foray/ForayDetailView.swift | 96 +++++++++++++++++++++++++++++++++ foray/ForayDetailViewController.swift | 78 +++------------------------ foray/UIViewController+Extensions.swift | 23 ++++++++ 3 files changed, 125 insertions(+), 72 deletions(-) create mode 100644 foray/ForayDetailView.swift create mode 100644 foray/UIViewController+Extensions.swift (limited to 'foray') diff --git a/foray/ForayDetailView.swift b/foray/ForayDetailView.swift new file mode 100644 index 0000000..5997016 --- /dev/null +++ b/foray/ForayDetailView.swift @@ -0,0 +1,96 @@ +// +// ForayDetailView.swift +// foray +// +// Created by Nicholas Tay on 24/3/2022. +// + +import UIKit + +class ForayDetailView: UIView { + + let scrollView: UIScrollView = { + let sv = UIScrollView() + sv.alwaysBounceVertical = true // just for fun + return sv + }() + let container = UIView() + + let nameLabel: UILabel = { + let l = UILabel() + l.font = UIFont.preferredFont(forTextStyle: .largeTitle) + l.adjustsFontForContentSizeCategory = true + l.numberOfLines = 3 + l.textAlignment = .center + return l + }() + + let itemImageView: UIImageView = { + let iv = UIImageView() + iv.contentMode = .scaleAspectFit + return iv + }() + + let descLabel: UILabel = { + let l = UILabel() + l.font = UIFont.preferredFont(forTextStyle: .body) + l.adjustsFontForContentSizeCategory = true + l.numberOfLines = 10 + return l + }() + + override init(frame: CGRect) { + super.init(frame: frame) + initialiseViews() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func initialiseViews() { + backgroundColor = .systemBackground + + addSubview(scrollView) + scrollView.addSubview(container) + + container.addSubview(nameLabel) + container.addSubview(itemImageView) + container.addSubview(descLabel) + + setupConstraints() + } + + private func setupConstraints() { + scrollView.snp.makeConstraints { (make) in + make.edges.equalToSuperview() + } + container.snp.makeConstraints { (make) in + make.top.bottom.equalToSuperview() + make.leading.equalTo(snp.leadingMargin) + make.trailing.equalTo(snp.trailingMargin) + } + + nameLabel.snp.makeConstraints { (make) in + make.top.equalToSuperview().inset(16) + make.leading.trailing.equalToSuperview().inset(8) + } + itemImageView.snp.makeConstraints { (make) in + make.top.equalTo(nameLabel.snp.bottom).offset(32) + make.leading.trailing.equalToSuperview() + make.height.equalTo(150) + } + descLabel.snp.makeConstraints { (make) in + make.top.equalTo(itemImageView.snp.bottom).offset(32) + make.leading.trailing.equalToSuperview() + make.bottom.equalTo(container.snp.bottom).inset(16) + } + } + + public func setDetails(name: String, description: String, image: UIImage) { + nameLabel.text = name + descLabel.text = description + itemImageView.image = image + } + +} diff --git a/foray/ForayDetailViewController.swift b/foray/ForayDetailViewController.swift index f87e4b0..c676df6 100644 --- a/foray/ForayDetailViewController.swift +++ b/foray/ForayDetailViewController.swift @@ -7,89 +7,23 @@ import UIKit -class ForayDetailViewController: UIViewController, ForayCoordinated { +class ForayDetailViewController: UIViewController, HasCustomView, ForayCoordinated { - var coordinator: ForayCoordinator? - - let scrollView: UIScrollView = { - let sv = UIScrollView() - sv.alwaysBounceVertical = true // just for fun - return sv - }() - let container = UIView() - - let nameLabel: UILabel = { - let l = UILabel() - l.font = UIFont.preferredFont(forTextStyle: .largeTitle) - l.adjustsFontForContentSizeCategory = true - l.numberOfLines = 3 - l.textAlignment = .center - return l - }() - - let itemImageView: UIImageView = { - let iv = UIImageView() - iv.contentMode = .scaleAspectFit - return iv - }() + typealias CustomView = ForayDetailView - let descLabel: UILabel = { - let l = UILabel() - l.font = UIFont.preferredFont(forTextStyle: .body) - l.adjustsFontForContentSizeCategory = true - l.numberOfLines = 10 - return l - }() + var coordinator: ForayCoordinator? override func viewDidLoad() { super.viewDidLoad() - self.title = "Details" - self.view.backgroundColor = .systemBackground - - initialiseViews() - } - - private func initialiseViews() { - self.view.addSubview(scrollView) - scrollView.addSubview(container) - - container.addSubview(nameLabel) - container.addSubview(itemImageView) - container.addSubview(descLabel) - - setupConstraints() } - private func setupConstraints() { - scrollView.snp.makeConstraints { (make) in - make.edges.equalTo(self.view.snp.margins) - } - container.snp.makeConstraints { (make) in - make.edges.equalToSuperview() - make.width.equalTo(scrollView.snp.width) - } - - nameLabel.snp.makeConstraints { (make) in - make.top.equalToSuperview().inset(16) - make.leading.trailing.equalToSuperview().inset(8) - } - itemImageView.snp.makeConstraints { (make) in - make.top.equalTo(nameLabel.snp.bottom).offset(32) - make.leading.trailing.equalToSuperview() - make.height.equalTo(150) - } - descLabel.snp.makeConstraints { (make) in - make.top.equalTo(itemImageView.snp.bottom).offset(32) - make.leading.trailing.equalToSuperview() - make.bottom.equalTo(container.snp.bottom).inset(16) - } + override func loadView() { + view = ForayDetailView() } public func setDetails(name: String, description: String, image: UIImage) { - nameLabel.text = name - descLabel.text = description - itemImageView.image = image + self.customView.setDetails(name: name, description: description, image: image) } } diff --git a/foray/UIViewController+Extensions.swift b/foray/UIViewController+Extensions.swift new file mode 100644 index 0000000..ee2c436 --- /dev/null +++ b/foray/UIViewController+Extensions.swift @@ -0,0 +1,23 @@ +// +// UIViewController+Extensions.swift +// foray +// +// Created by Nicholas Tay on 24/3/2022. +// + +import Foundation +import UIKit + +protocol HasCustomView { + associatedtype CustomView: UIView +} + +extension HasCustomView where Self: UIViewController { + internal var customView: CustomView { + guard let view = self.view as? CustomView else { + fatalError("Could not cast custom view") + } + + return view + } +} -- cgit