From 62ee98c34e44ada0381e6897a6637237cbeff416 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Fri, 11 Aug 2023 16:32:28 -0500 Subject: [PATCH] added sample Signed-off-by: Matt Bruce --- VDSSample.xcodeproj/project.pbxproj | 4 +- .../ViewControllers/BadgeViewController.swift | 11 ++ .../ViewControllers/BaseViewController.swift | 4 + .../ViewControllers/MenuViewController.swift | 31 ++--- .../TableViewTestController.swift | 110 +++++++++--------- 5 files changed, 87 insertions(+), 73 deletions(-) diff --git a/VDSSample.xcodeproj/project.pbxproj b/VDSSample.xcodeproj/project.pbxproj index 4809ce8..6bb1d06 100644 --- a/VDSSample.xcodeproj/project.pbxproj +++ b/VDSSample.xcodeproj/project.pbxproj @@ -306,6 +306,7 @@ EA89203E28B66CE2006B9984 /* ScrollViewController */, EA3C3BB228996775000CA526 /* MenuViewController.swift */, EAD062A22A3913920015965D /* DropShawdowViewController.swift */, + EA297A672A02F5320031ED56 /* TableViewTestController.swift */, EAB1D2C828AAAA1D00DAE764 /* BaseViewController.swift */, EA4DB30328DCD25B00103EE3 /* BadgeViewController.swift */, EAD062AC2A3B86950015965D /* BadgeIndicatorViewController.swift */, @@ -336,8 +337,7 @@ EA5E30542950EA6E0082B959 /* TitleLockupViewController.swift */, EA3C3BB328996775000CA526 /* ToggleViewController.swift */, EAB2375F29E88D5D00AABE9A /* TooltipViewController.swift */, - EAB2376B29E9E74900AABE9A /* TrailingTooltipLabel.swift */, - EA297A672A02F5320031ED56 /* TableViewTestController.swift */, + EAB2376B29E9E74900AABE9A /* TrailingTooltipLabelViewController.swift */, ); path = ViewControllers; sourceTree = ""; diff --git a/VDSSample/ViewControllers/BadgeViewController.swift b/VDSSample/ViewControllers/BadgeViewController.swift index 367c89b..7025673 100644 --- a/VDSSample/ViewControllers/BadgeViewController.swift +++ b/VDSSample/ViewControllers/BadgeViewController.swift @@ -107,3 +107,14 @@ class BadgeViewController: BaseViewController { } } } + +extension BadgeViewController: Componentable { + static func getComponent() -> TestViewWrapper { + let component = Self.makeComponent() + component.fillColor = .red + component.text = "Terms and conditions" + component.maxWidth = 70 + component.numberOfLines = 3 + return TestViewWrapper(component: component, isTrailing: true) + } +} diff --git a/VDSSample/ViewControllers/BaseViewController.swift b/VDSSample/ViewControllers/BaseViewController.swift index 8114c1b..3aadef4 100644 --- a/VDSSample/ViewControllers/BaseViewController.swift +++ b/VDSSample/ViewControllers/BaseViewController.swift @@ -71,6 +71,10 @@ public class BaseViewController: UIViewController, Initable { print("\(Self.self) deinit") } + static func makeComponent() -> Component { + Component() + } + private let edgeSpacing = 16.0 //-------------------------------------------------- diff --git a/VDSSample/ViewControllers/MenuViewController.swift b/VDSSample/ViewControllers/MenuViewController.swift index a1de6f8..9cff982 100644 --- a/VDSSample/ViewControllers/MenuViewController.swift +++ b/VDSSample/ViewControllers/MenuViewController.swift @@ -64,19 +64,7 @@ class MenuCell: UITableViewCell { } class MenuViewController: UITableViewController, TooltipLaunchable { - override func viewDidLoad() { - title = "VDS Sample: Build \(Bundle.main.build ?? "none")" - let tooltip = VDS.Tooltip() - let bundle = VDS.Bundle(for: VDS.Badge.self) - tooltip.title = "Release Notes: \(bundle.build ?? "")" - tooltip.content = bundle.contents("ReleaseNotes") - navigationItem.rightBarButtonItem = UIBarButtonItem(customView: tooltip) // UIBarButtonItem(barButtonSystemItem: .compose, target: self, action: #selector(buildInfoTapped)) - super.viewDidLoad() - overrideUserInterfaceStyle = .light - tableView.register(MenuCell.self, forCellReuseIdentifier: "cell") - } - - let items: [MenuComponent] = [ + static let items: [MenuComponent] = [ MenuComponent(title: "DropShadow Tester", completed: true, viewController: DropShadowViewController.self), MenuComponent(title: "TableView Tester", completed: true, viewController: TableViewTestController.self), MenuComponent(title: "Badge", completed: true, viewController: BadgeViewController.self), @@ -109,9 +97,24 @@ class MenuViewController: UITableViewController, TooltipLaunchable { MenuComponent(title: "Toggle", completed: true, viewController: ToggleViewController.self), MenuComponent(title: "Tooltip", completed: true, viewController: TooltipViewController.self), MenuComponent(title: "TrailingTooltipLabel", completed: true, viewController: TrailingTooltipLabelViewController.self), - ] + + var items: [MenuComponent] { + Self.items + } + override func viewDidLoad() { + title = "VDS Sample: Build \(Bundle.main.build ?? "none")" + let tooltip = VDS.Tooltip() + let bundle = VDS.Bundle(for: VDS.Badge.self) + tooltip.title = "Release Notes: \(bundle.build ?? "")" + tooltip.content = bundle.contents("ReleaseNotes") + navigationItem.rightBarButtonItem = UIBarButtonItem(customView: tooltip) // UIBarButtonItem(barButtonSystemItem: .compose, target: self, action: #selector(buildInfoTapped)) + super.viewDidLoad() + overrideUserInterfaceStyle = .light + tableView.register(MenuCell.self, forCellReuseIdentifier: "cell") + } + override func numberOfSections(in tableView: UITableView) -> Int { 1 } diff --git a/VDSSample/ViewControllers/TableViewTestController.swift b/VDSSample/ViewControllers/TableViewTestController.swift index 6d48cd3..e8be50c 100644 --- a/VDSSample/ViewControllers/TableViewTestController.swift +++ b/VDSSample/ViewControllers/TableViewTestController.swift @@ -8,49 +8,17 @@ import Foundation import UIKit import VDS +import VDSColorTokens +public typealias TestView = UIView +public typealias TestViewWrapper = (component: TestView, isTrailing: Bool) protocol Componentable { - func getCompontent() -> UIView + static func getComponent() -> TestViewWrapper } -extension BaseViewController: Componentable { - func getCompontent() -> UIView { contentTopView.removeFromSuperview(); return contentTopView } -} - -//public class TableViewTestController: UIViewController, Initable { -// let component = TrailingTooltipLabel() -// -// public override func viewDidLoad() { -// super.viewDidLoad() -// -// component.layer.borderColor = UIColor.red.cgColor -// component.label.layer.borderWidth = 1 -// component.labelText = "Label Component" -// component.labelTextStyle = .titleLarge -// component.tooltipTitle = "5G Ultra Wideband is available in your area." -// component.tooltipContent = "$799.99 (128 GB only) device payment purchase w/new or upgrade smartphone line on postpaid 5G Unlimited plans only req'd. Less up to $800 trade-in/promo credit applied over 36 mos.; promo credit ends if eligibility req’s are no longer met; 0% APR. Trade-in conditions apply.$799.99 (128 GB only) device payment purchase w/new or upgrade smartphone line on postpaid 5G Unlimited plans only req'd. Less up to $800 trade-in." -// -// view.addSubview(component) -// view.backgroundColor = .white -// NSLayoutConstraint.activate([ -// component.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 16), -// component.leftAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leftAnchor, constant: 16), -// component.rightAnchor.constraint(equalTo: view.safeAreaLayoutGuide.rightAnchor) -// ]) -// } -// -// public override func viewDidAppear(_ animated: Bool) { -// super.viewDidAppear(animated) -// -// DispatchQueue.main.asyncAfter(deadline: .now() + 1) { -// self.component.tooltipTitle = "q234" -// } -// } -//} - public class TableViewTestController: UITableViewController, Initable { - var controllers:[UIViewController] = [] + var components:[TestViewWrapper] = [] //-------------------------------------------------- // MARK: - Initializers @@ -65,49 +33,77 @@ public class TableViewTestController: UITableViewController, Initable { public override func viewDidLoad() { super.viewDidLoad() - let menus = MenuViewController() - controllers = menus.items.compactMap({ menuItem in - guard let vc = menuItem.viewController as? Initable.Type, - let controller = vc.init() as? UIViewController, - menuItem.viewController != Self.self else { return nil } - - controller.title = menuItem.title - controller.viewDidLoad() - return controller - }) + MenuViewController.items.forEach { menuItem in + if let componentable = menuItem.viewController as? Componentable.Type { + components.append(componentable.getComponent()) + } + } tableView.register(VDSCell.self, forCellReuseIdentifier: "cell") tableView.allowsSelection = false tableView.estimatedRowHeight = 100 + tableView.separatorStyle = .none tableView.rowHeight = UITableView.automaticDimension tableView.reloadData() } public override func numberOfSections(in tableView: UITableView) -> Int { - controllers.count + components.count } - public override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { - let vc = controllers[section] - return vc.title + public override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { + let header = UIView().with { $0.backgroundColor = VDSColor.paletteGray44 } + let label = Label().with { + $0.text = "\(type(of: components[section].component))" + $0.surface = .dark + $0.textStyle = .boldTitleSmall + } + header.addSubview(label) + label.pinTrailing(16) + label.pinLeading(16) + label.centerYAnchor.constraint(equalTo: header.centerYAnchor).activate() + return header } - + + public override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { + 40 + } + public override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 1 } public override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - guard let vc = controllers[indexPath.section] as? Componentable, let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as? VDSCell else { return UITableViewCell() } - let component = vc.getCompontent() - cell.subviews.forEach { $0.removeFromSuperview() } - cell.addSubview(component) - component.pinToSuperView() + guard let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as? VDSCell else { return UITableViewCell() } + let wrapper = components[indexPath.row] + cell.component = wrapper.component + cell.isTrailing = wrapper.isTrailing return cell } + } public class VDSCell: UITableViewCell, AppleGuidlinesTouchable { + public var isTrailing: Bool = true + public var component: TestView? { + didSet { + guard let component else { return } + contentView.addSubview(.makeWrapper(for: component, edgeSpacing: 16, isTrailing: isTrailing)) + } + } + override open func point(inside point: CGPoint, with event: UIEvent?) -> Bool { Self.acceptablyOutsideBounds(point: point, bounds: bounds) } + + public override var intrinsicContentSize: CGSize { + guard let component else { return .zero } + return component.intrinsicContentSize + } + + public override func prepareForReuse() { + super.prepareForReuse() + contentView.subviews.forEach { $0.removeFromSuperview() } + } + }