Implemented the FeedItemViewController view controller in the Feed framework.
This commit is contained in:
parent
ca50f5ff3a
commit
d29dae5c79
@ -6,6 +6,8 @@
|
|||||||
// Copyright © 2020 ING. All rights reserved.
|
// Copyright © 2020 ING. All rights reserved.
|
||||||
//
|
//
|
||||||
|
|
||||||
|
import ReviewsUIKit
|
||||||
|
import SwiftUI
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
final class FeedItemViewController: UIViewController {
|
final class FeedItemViewController: UIViewController {
|
||||||
@ -13,29 +15,49 @@ final class FeedItemViewController: UIViewController {
|
|||||||
// MARK: Constants
|
// MARK: Constants
|
||||||
private let item: Review
|
private let item: Review
|
||||||
|
|
||||||
|
// MARK: Properties
|
||||||
|
private lazy var appVersionController = {
|
||||||
|
UIHostingController(rootView: FakeLabel(
|
||||||
|
systemIcon: .Icon.info,
|
||||||
|
title: item.rating.appVersion
|
||||||
|
))
|
||||||
|
}()
|
||||||
|
|
||||||
|
private lazy var authorController = {
|
||||||
|
UIHostingController(rootView: FakeLabel(
|
||||||
|
systemIcon: .Icon.person,
|
||||||
|
title: item.author
|
||||||
|
))
|
||||||
|
}()
|
||||||
|
|
||||||
|
private lazy var starRatingController = {
|
||||||
|
UIHostingController(rootView: StarRating(
|
||||||
|
item.rating.stars,
|
||||||
|
of: .Rating.total
|
||||||
|
))
|
||||||
|
}()
|
||||||
|
|
||||||
// MARK: Outlets
|
// MARK: Outlets
|
||||||
private lazy var titleLabel = {
|
private lazy var appVersionView = {
|
||||||
let label = UILabel()
|
guard let view = appVersionController.view else {
|
||||||
|
fatalError("The StarRating component must be initialised")
|
||||||
label.font = UIFont.preferredFont(forTextStyle: .title3)
|
}
|
||||||
label.numberOfLines = 0
|
|
||||||
label.translatesAutoresizingMaskIntoConstraints = false
|
|
||||||
label.text = item.title
|
|
||||||
|
|
||||||
return label
|
|
||||||
}()
|
|
||||||
|
|
||||||
private lazy var authorLabel = {
|
|
||||||
let label = UILabel()
|
|
||||||
|
|
||||||
label.font = UIFont.preferredFont(forTextStyle: .headline)
|
view.translatesAutoresizingMaskIntoConstraints = false
|
||||||
label.numberOfLines = 1
|
|
||||||
label.translatesAutoresizingMaskIntoConstraints = false
|
return view
|
||||||
label.text = item.author
|
|
||||||
|
|
||||||
return label
|
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
private lazy var authorView = {
|
||||||
|
guard let view = authorController.view else {
|
||||||
|
fatalError("The StarRating component must be initialised")
|
||||||
|
}
|
||||||
|
|
||||||
|
view.translatesAutoresizingMaskIntoConstraints = false
|
||||||
|
|
||||||
|
return view
|
||||||
|
}()
|
||||||
|
|
||||||
private lazy var commentLabel = {
|
private lazy var commentLabel = {
|
||||||
let label = UILabel()
|
let label = UILabel()
|
||||||
|
|
||||||
@ -46,18 +68,65 @@ final class FeedItemViewController: UIViewController {
|
|||||||
|
|
||||||
return label
|
return label
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
private lazy var ratingView = {
|
||||||
|
let stack = UIStackView()
|
||||||
|
|
||||||
|
stack.axis = .horizontal
|
||||||
|
stack.backgroundColor = .clear
|
||||||
|
stack.distribution = .fillProportionally
|
||||||
|
stack.translatesAutoresizingMaskIntoConstraints = false
|
||||||
|
|
||||||
|
stack.addArrangedSubview(starRatingView)
|
||||||
|
stack.addArrangedSubview(appVersionView)
|
||||||
|
|
||||||
private lazy var ratingVersionLabel = {
|
return stack
|
||||||
let label = UILabel()
|
}()
|
||||||
|
|
||||||
|
private lazy var scrollView = {
|
||||||
|
let scroll = UIScrollView()
|
||||||
|
|
||||||
label.font = UIFont.preferredFont(forTextStyle: .subheadline)
|
scroll.backgroundColor = .clear
|
||||||
label.numberOfLines = 1
|
scroll.showsVerticalScrollIndicator = true
|
||||||
label.translatesAutoresizingMaskIntoConstraints = false
|
scroll.translatesAutoresizingMaskIntoConstraints = false
|
||||||
label.text = item.rating.appVersion
|
|
||||||
|
|
||||||
return label
|
return scroll
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
private lazy var stackView = {
|
||||||
|
let stack = UIStackView()
|
||||||
|
|
||||||
|
stack.axis = .vertical
|
||||||
|
stack.alignment = .leading
|
||||||
|
stack.backgroundColor = .clear
|
||||||
|
stack.distribution = .fill
|
||||||
|
stack.spacing = 16
|
||||||
|
stack.translatesAutoresizingMaskIntoConstraints = false
|
||||||
|
|
||||||
|
return stack
|
||||||
|
}()
|
||||||
|
|
||||||
|
private lazy var starRatingView = {
|
||||||
|
guard let view = starRatingController.view else {
|
||||||
|
fatalError("The StarRating component must be initialised")
|
||||||
|
}
|
||||||
|
|
||||||
|
view.translatesAutoresizingMaskIntoConstraints = false
|
||||||
|
|
||||||
|
return view
|
||||||
|
}()
|
||||||
|
|
||||||
|
private lazy var titleLabel = {
|
||||||
|
let label = UILabel()
|
||||||
|
|
||||||
|
label.font = UIFont.preferredFont(forTextStyle: .headline)
|
||||||
|
label.numberOfLines = 0
|
||||||
|
label.translatesAutoresizingMaskIntoConstraints = false
|
||||||
|
label.text = item.title
|
||||||
|
|
||||||
|
return label
|
||||||
|
}()
|
||||||
|
|
||||||
// MARK: Initialisers
|
// MARK: Initialisers
|
||||||
init(_ item: Review) {
|
init(_ item: Review) {
|
||||||
self.item = item
|
self.item = item
|
||||||
@ -68,14 +137,22 @@ final class FeedItemViewController: UIViewController {
|
|||||||
required init?(coder aDecoder: NSCoder) {
|
required init?(coder aDecoder: NSCoder) {
|
||||||
fatalError("init(coder:) has not been implemented")
|
fatalError("init(coder:) has not been implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: UIViewController
|
// MARK: UIViewController
|
||||||
override func viewDidLoad() {
|
override func viewDidLoad() {
|
||||||
super.viewDidLoad()
|
super.viewDidLoad()
|
||||||
|
|
||||||
|
addChild(appVersionController)
|
||||||
|
addChild(authorController)
|
||||||
|
addChild(starRatingController)
|
||||||
|
|
||||||
setView()
|
setView()
|
||||||
setNavigationBar()
|
setNavigationBar()
|
||||||
setLayout()
|
setLayout()
|
||||||
|
|
||||||
|
appVersionController.didMove(toParent: self)
|
||||||
|
authorController.didMove(toParent: self)
|
||||||
|
starRatingController.didMove(toParent: self)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -85,23 +162,31 @@ private extension FeedItemViewController {
|
|||||||
|
|
||||||
// MARK: Functions
|
// MARK: Functions
|
||||||
func setLayout() {
|
func setLayout() {
|
||||||
|
let scrollContentGuide = scrollView.contentLayoutGuide
|
||||||
|
let scrollFrameGuide = scrollView.frameLayoutGuide
|
||||||
|
|
||||||
NSLayoutConstraint.activate([
|
NSLayoutConstraint.activate([
|
||||||
authorLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 8),
|
scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
|
||||||
authorLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -8),
|
scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
|
||||||
authorLabel.topAnchor.constraint(equalTo: ratingVersionLabel.bottomAnchor, constant: 8),
|
scrollView.topAnchor.constraint(equalTo: view.topAnchor),
|
||||||
authorLabel.heightAnchor.constraint(equalToConstant: 24),
|
scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
|
||||||
commentLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 8),
|
|
||||||
commentLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -8),
|
stackView.bottomAnchor.constraint(equalTo: scrollContentGuide.bottomAnchor, constant: -16),
|
||||||
commentLabel.topAnchor.constraint(equalTo: titleLabel.bottomAnchor, constant: 8),
|
stackView.leadingAnchor.constraint(equalTo: scrollContentGuide.leadingAnchor),
|
||||||
commentLabel.heightAnchor.constraint(greaterThanOrEqualToConstant: 24),
|
stackView.topAnchor.constraint(equalTo: scrollContentGuide.topAnchor, constant: 8),
|
||||||
ratingVersionLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 8),
|
stackView.trailingAnchor.constraint(equalTo: scrollContentGuide.trailingAnchor),
|
||||||
ratingVersionLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -8),
|
stackView.leadingAnchor.constraint(equalTo: scrollFrameGuide.leadingAnchor),
|
||||||
ratingVersionLabel.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 8),
|
stackView.trailingAnchor.constraint(equalTo: scrollFrameGuide.trailingAnchor),
|
||||||
ratingVersionLabel.heightAnchor.constraint(equalToConstant: 24),
|
|
||||||
titleLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 8),
|
authorView.leadingAnchor.constraint(equalTo: stackView.leadingAnchor, constant: 16),
|
||||||
titleLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -8),
|
|
||||||
titleLabel.topAnchor.constraint(equalTo: authorLabel.bottomAnchor, constant: 8),
|
ratingView.leadingAnchor.constraint(equalTo: stackView.leadingAnchor, constant: 16),
|
||||||
titleLabel.heightAnchor.constraint(lessThanOrEqualToConstant: 72),
|
|
||||||
|
titleLabel.leadingAnchor.constraint(equalTo: stackView.leadingAnchor, constant: 16),
|
||||||
|
titleLabel.trailingAnchor.constraint(equalTo: stackView.trailingAnchor, constant: -16),
|
||||||
|
|
||||||
|
commentLabel.leadingAnchor.constraint(equalTo: stackView.leadingAnchor, constant: 16),
|
||||||
|
commentLabel.trailingAnchor.constraint(equalTo: stackView.trailingAnchor, constant: -16),
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -109,16 +194,20 @@ private extension FeedItemViewController {
|
|||||||
navigationController?.navigationBar.prefersLargeTitles = true
|
navigationController?.navigationBar.prefersLargeTitles = true
|
||||||
navigationController?.navigationBar.isTranslucent = true
|
navigationController?.navigationBar.isTranslucent = true
|
||||||
|
|
||||||
navigationItem.title = "#\(String(item.id))"
|
navigationItem.title = "# \(String(item.id))"
|
||||||
}
|
}
|
||||||
|
|
||||||
func setView() {
|
func setView() {
|
||||||
view.backgroundColor = .white
|
view.backgroundColor = .systemBackground
|
||||||
|
|
||||||
|
view.addSubview(scrollView)
|
||||||
|
|
||||||
view.addSubview(ratingVersionLabel)
|
scrollView.addSubview(stackView)
|
||||||
view.addSubview(authorLabel)
|
|
||||||
view.addSubview(titleLabel)
|
stackView.addArrangedSubview(authorView)
|
||||||
view.addSubview(commentLabel)
|
stackView.addArrangedSubview(ratingView)
|
||||||
|
stackView.addArrangedSubview(titleLabel)
|
||||||
|
stackView.addArrangedSubview(commentLabel)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user