separator

keys
clean up
This commit is contained in:
Pfeil, Scott Robert 2019-04-30 10:34:25 -04:00
parent 302a2f887f
commit 2d73f89fd4
7 changed files with 115 additions and 32 deletions

View File

@ -21,7 +21,7 @@ open class ThreeLayerTableViewController: MFProgrammaticTableViewController {
private var topViewBottomConstraint: NSLayoutConstraint? private var topViewBottomConstraint: NSLayoutConstraint?
private var bottomViewTopConstraint: NSLayoutConstraint? private var bottomViewTopConstraint: NSLayoutConstraint?
//MARK:-MVMCoreViewProtocol //MARK: - MVMCoreViewProtocol
open override func updateViews() { open override func updateViews() {
super.updateViews() super.updateViews()
let width = view.bounds.width let width = view.bounds.width
@ -37,7 +37,7 @@ open class ThreeLayerTableViewController: MFProgrammaticTableViewController {
self.tableView?.reloadData() self.tableView?.reloadData()
} }
//MARK:-MFViewController //MARK: - MFViewController
open override func newDataBuildScreen() { open override func newDataBuildScreen() {
super.newDataBuildScreen() super.newDataBuildScreen()
createViewForTableHeader() createViewForTableHeader()
@ -51,7 +51,7 @@ open class ThreeLayerTableViewController: MFProgrammaticTableViewController {
// Do any additional setup after loading the view. // Do any additional setup after loading the view.
} }
//MARK:-Spacing //MARK: - Spacing
// If both are subclassed to return a value, then the buttons will not be pinned towards the bottom because neither spacing would try to fill the screen. // If both are subclassed to return a value, then the buttons will not be pinned towards the bottom because neither spacing would try to fill the screen.
/// Space between the top view and the table sections, nil to fill. 0 default /// Space between the top view and the table sections, nil to fill. 0 default
open func spaceBelowTopView() -> CGFloat? { open func spaceBelowTopView() -> CGFloat? {
@ -127,7 +127,7 @@ open class ThreeLayerTableViewController: MFProgrammaticTableViewController {
} }
} }
//MARK:-Header Footer //MARK: - Header Footer
/// Gets the top view and adds it to a spacing view, headerView, and then calls showHeader. /// Gets the top view and adds it to a spacing view, headerView, and then calls showHeader.
open func createViewForTableHeader() { open func createViewForTableHeader() {
let topView = viewForTop() let topView = viewForTop()
@ -215,7 +215,7 @@ open class ThreeLayerTableViewController: MFProgrammaticTableViewController {
} }
} }
//MARK:-Functions to subclass //MARK: - Functions to subclass
/// Subclass for a top view. /// Subclass for a top view.
open func viewForTop() -> UIView { open func viewForTop() -> UIView {
let view = MVMCoreUICommonViewsUtility.commonView() let view = MVMCoreUICommonViewsUtility.commonView()
@ -230,7 +230,7 @@ open class ThreeLayerTableViewController: MFProgrammaticTableViewController {
return view return view
} }
//MARK:-Scrollview //MARK: - Scrollview
open override func scrollViewDidScroll(_ scrollView: UIScrollView) { open override func scrollViewDidScroll(_ scrollView: UIScrollView) {
// To stop handscroll animation if animating after scroll // To stop handscroll animation if animating after scroll
stopHandScrollAnimation(true) stopHandScrollAnimation(true)
@ -240,7 +240,7 @@ open class ThreeLayerTableViewController: MFProgrammaticTableViewController {
tableView?.delegate = nil tableView?.delegate = nil
} }
//MARK:-Animation //MARK: - Animation
open override func setupIntroAnimations() { open override func setupIntroAnimations() {
if let topView = topView, topView.subviews.count > 0 { if let topView = topView, topView.subviews.count > 0 {
introAnimationManager?.addAnimation(animation: MVMAnimations.fadeUpAnimation(view: topView)) introAnimationManager?.addAnimation(animation: MVMAnimations.fadeUpAnimation(view: topView))

View File

@ -13,6 +13,7 @@ public class MoleculeStackView: MFView {
var moleculesArray: [UIView]? var moleculesArray: [UIView]?
var useMargins: Bool = false var useMargins: Bool = false
// MARK: - Inits
public override init(frame: CGRect) { public override init(frame: CGRect) {
super.init(frame: frame) super.init(frame: frame)
} }
@ -31,6 +32,7 @@ public class MoleculeStackView: MFView {
fatalError("init(coder:) has not been implemented") fatalError("init(coder:) has not been implemented")
} }
// MARK: - MFViewProtocol
public override func setupView() { public override func setupView() {
super.setupView() super.setupView()
translatesAutoresizingMaskIntoConstraints = false translatesAutoresizingMaskIntoConstraints = false
@ -48,9 +50,10 @@ public class MoleculeStackView: MFView {
} }
} }
// MARK: - MVMCoreUIMoleculeViewProtocol
open override func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: DelegateObject?, additionalData: [AnyHashable: Any]?) { open override func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: DelegateObject?, additionalData: [AnyHashable: Any]?) {
super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData) super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData)
guard let molecules = json?.arrayForKey("molecules") as? [[String: Any]] else { guard let molecules = json?.arrayForKey(KeyMolecules) as? [[String: Any]] else {
return return
} }

View File

@ -9,8 +9,24 @@
import UIKit import UIKit
@objcMembers open class MoleculeTableViewCell: UITableViewCell, MVMCoreViewProtocol, MVMCoreUIMoleculeViewProtocol { @objcMembers open class MoleculeTableViewCell: UITableViewCell, MVMCoreViewProtocol, MVMCoreUIMoleculeViewProtocol {
var molecule: (UIView & MVMCoreUIMoleculeViewProtocol)? open var molecule: (UIView & MVMCoreUIMoleculeViewProtocol)?
// For the accessory view convenience.
public var caretView: CaretView?
private var caretViewWidthSizeObject: MFSizeObject?
private var caretViewHeightSizeObject: MFSizeObject?
// For separation between cells.
public var topSeparatorView: SeparatorView?
public var bottomSeparatorView: SeparatorView?
public enum SeparatorFrequency: String {
case All = "all"
case AllExceptTop = "allExceptTop"
case AllExceptBottom = "allExceptBottom"
case Between = "between"
}
// MARK: - Inits
public override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { public override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier) super.init(style: style, reuseIdentifier: reuseIdentifier)
setupView() setupView()
@ -21,17 +37,17 @@ import UIKit
setupView() setupView()
} }
// For the accessory view convenience. // MARK: - MFViewProtocol
var caretView: CaretView?
private var caretViewWidthSizeObject: MFSizeObject?
private var caretViewHeightSizeObject: MFSizeObject?
public func updateView(_ size: CGFloat) { public func updateView(_ size: CGFloat) {
MFStyler.setDefaultMarginsFor(self, size: size) MFStyler.setDefaultMarginsFor(self, size: size)
if #available(iOS 11.0, *) { if #available(iOS 11.0, *) {
contentView.directionalLayoutMargins = directionalLayoutMargins contentView.directionalLayoutMargins = directionalLayoutMargins
topSeparatorView?.setLeftAndRightPinConstant(directionalLayoutMargins.leading)
bottomSeparatorView?.setLeftAndRightPinConstant(directionalLayoutMargins.leading)
} else { } else {
contentView.layoutMargins = layoutMargins contentView.layoutMargins = layoutMargins
topSeparatorView?.setLeftAndRightPinConstant(layoutMargins.left)
bottomSeparatorView?.setLeftAndRightPinConstant(layoutMargins.left)
} }
if let molecule = molecule as? MVMCoreViewProtocol { if let molecule = molecule as? MVMCoreViewProtocol {
@ -40,6 +56,8 @@ import UIKit
if let _ = accessoryView, let caretView = caretView, let widthObject = caretViewWidthSizeObject, let heightObject = caretViewHeightSizeObject { if let _ = accessoryView, let caretView = caretView, let widthObject = caretViewWidthSizeObject, let heightObject = caretViewHeightSizeObject {
caretView.frame = CGRect(x: 0, y: 0, width: widthObject.getValueBased(onSize: size), height: heightObject.getValueBased(onSize: size)) caretView.frame = CGRect(x: 0, y: 0, width: widthObject.getValueBased(onSize: size), height: heightObject.getValueBased(onSize: size))
} }
topSeparatorView?.updateView(size)
bottomSeparatorView?.updateView(size)
} }
public func setupView() { public func setupView() {
@ -48,6 +66,7 @@ import UIKit
selectionStyle = .none selectionStyle = .none
} }
// MARK: - MVMCoreUIMoleculeViewProtocol
public func setWithJSON(_ json: [AnyHashable : Any]?, delegateObject: DelegateObject?, additionalData: [AnyHashable : Any]?) { public func setWithJSON(_ json: [AnyHashable : Any]?, delegateObject: DelegateObject?, additionalData: [AnyHashable : Any]?) {
guard let json = json else { guard let json = json else {
return return
@ -64,7 +83,8 @@ import UIKit
backgroundColor = molecule?.backgroundColor backgroundColor = molecule?.backgroundColor
} }
// MARK- Convenience // MARK: - Convenience
/// Adds the standard mvm style caret to the accessory view
public func addCaretViewAccessory() { public func addCaretViewAccessory() {
guard accessoryView == nil else { guard accessoryView == nil else {
return return
@ -77,4 +97,56 @@ import UIKit
caretViewHeightSizeObject = MFSizeObject(scalingStandardSize: height) caretViewHeightSizeObject = MFSizeObject(scalingStandardSize: height)
accessoryView = caretView accessoryView = caretView
} }
func addSeparatorsIfNeeded() {
if topSeparatorView == nil {
topSeparatorView = SeparatorView.separatorAdd(to: self, position: SeparatorPositionTop)
topSeparatorView?.hide()
}
if bottomSeparatorView == nil {
bottomSeparatorView = SeparatorView.separatorAdd(to: self, position: SeparatorPositionBot)
bottomSeparatorView?.hide()
}
}
/// For when the separator between cells shows using json and frequency.
public func setSeparatorWithJSON(_ json: [AnyHashable : Any]?, delegateObject: DelegateObject?, additionalData: [AnyHashable : Any]?, indexPath: IndexPath) {
guard let json = json else {
return
}
addSeparatorsIfNeeded()
topSeparatorView?.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData)
bottomSeparatorView?.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData)
if let separatorFrequencyString = json.optionalStringForKey("frequency"), let separatorFrequency = SeparatorFrequency(rawValue: separatorFrequencyString) {
setSeparatorFrequency(separatorFrequency, indexPath: indexPath)
}
}
/// For when the separator between cells shows.
public func setSeparatorFrequency(_ separatorFrequency: SeparatorFrequency, indexPath: IndexPath) {
switch separatorFrequency {
case .All:
if indexPath.row == 0 {
topSeparatorView?.show()
} else {
topSeparatorView?.hide()
}
bottomSeparatorView?.show()
case .AllExceptBottom:
topSeparatorView?.show()
bottomSeparatorView?.hide()
case .Between:
if indexPath.row == 0 {
topSeparatorView?.hide()
} else {
topSeparatorView?.show()
}
bottomSeparatorView?.hide()
case .AllExceptTop:
fallthrough
default:
topSeparatorView?.hide()
bottomSeparatorView?.show()
}
}
} }

View File

@ -56,7 +56,7 @@
} }
- (nullable UIView <MVMCoreUIMoleculeViewProtocol>*)getMoleculeForJSON:(nonnull NSDictionary *)json delegateObject:(nullable DelegateObject *)delegateObject { - (nullable UIView <MVMCoreUIMoleculeViewProtocol>*)getMoleculeForJSON:(nonnull NSDictionary *)json delegateObject:(nullable DelegateObject *)delegateObject {
NSString *moleculeName = [json string:@"moleculeName"]; NSString *moleculeName = [json string:KeyMoleculeName];
if (!moleculeName) { if (!moleculeName) {
return nil; return nil;
} }
@ -67,7 +67,7 @@
- (nullable UIView <MVMCoreUIMoleculeViewProtocol>*)getMoleculeForStackWithJSON:(nonnull NSDictionary *)json delegateObject:(nullable DelegateObject *)delegateObject { - (nullable UIView <MVMCoreUIMoleculeViewProtocol>*)getMoleculeForStackWithJSON:(nonnull NSDictionary *)json delegateObject:(nullable DelegateObject *)delegateObject {
NSString *moleculeName = [json string:@"moleculeName"]; NSString *moleculeName = [json string:KeyMoleculeName];
if (!moleculeName) { if (!moleculeName) {
return nil; return nil;
} }

View File

@ -8,58 +8,60 @@
import UIKit import UIKit
public class MoleculeListTemplate: ThreeLayerTableViewController { open class MoleculeListTemplate: ThreeLayerTableViewController {
public override func registerWithTable() { open override func registerWithTable() {
super.registerWithTable() super.registerWithTable()
guard let molecules = loadObject?.pageJSON?.arrayForKey("molecules") else { guard let molecules = loadObject?.pageJSON?.arrayForKey(KeyMolecules) else {
return return
} }
for case let molecule as Dictionary<AnyHashable, Any> in molecules { for case let molecule as Dictionary<AnyHashable, Any> in molecules {
if let moleculeName = molecule.optionalStringForKey("moleculeName") { if let moleculeName = molecule.optionalStringForKey(KeyMoleculeName) {
tableView?.register(MoleculeTableViewCell.self, forCellReuseIdentifier: moleculeName) tableView?.register(MoleculeTableViewCell.self, forCellReuseIdentifier: moleculeName)
} }
} }
} }
public override func viewForTop() -> UIView { open override func viewForTop() -> UIView {
guard let moleculeJSON = loadObject?.pageJSON?.optionalDictionaryForKey("header"), let molecule = MVMCoreUIMoleculeMappingObject.shared()?.getMoleculeForStack(withJSON: moleculeJSON, delegateObject: delegateObject()) else { guard let moleculeJSON = loadObject?.pageJSON?.optionalDictionaryForKey("header"), let molecule = MVMCoreUIMoleculeMappingObject.shared()?.getMoleculeForStack(withJSON: moleculeJSON, delegateObject: delegateObject()) else {
return super.viewForTop() return super.viewForTop()
} }
return molecule return molecule
} }
override public func viewForBottom() -> UIView { override open func viewForBottom() -> UIView {
guard let moleculeJSON = loadObject?.pageJSON?.optionalDictionaryForKey("footer"), let molecule = MVMCoreUIMoleculeMappingObject.shared()?.getMoleculeForStack(withJSON: moleculeJSON, delegateObject: delegateObject()) else { guard let moleculeJSON = loadObject?.pageJSON?.optionalDictionaryForKey("footer"), let molecule = MVMCoreUIMoleculeMappingObject.shared()?.getMoleculeForStack(withJSON: moleculeJSON, delegateObject: delegateObject()) else {
return viewForBottom() return viewForBottom()
} }
return molecule return molecule
} }
public override func newDataBuildScreen() { open override func newDataBuildScreen() {
super.newDataBuildScreen() super.newDataBuildScreen()
registerWithTable() registerWithTable()
} }
public override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { open override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
if let moleculeName = loadObject?.pageJSON?.stringOptionalWithChainOfKeysOrIndexes(["molecules",indexPath.row,"moleculeName"]), let theClass = MVMCoreUIMoleculeMappingObject.shared()?.moleculeMapping?[moleculeName] as? MVMCoreUIMoleculeViewProtocol.Type, if let moleculeName = loadObject?.pageJSON?.stringOptionalWithChainOfKeysOrIndexes([KeyMolecules,indexPath.row,KeyMoleculeName]), let theClass = MVMCoreUIMoleculeMappingObject.shared()?.moleculeMapping?[moleculeName] as? MVMCoreUIMoleculeViewProtocol.Type,
let estimatedHeightForRow = theClass.estimatedHeightForRow { let estimatedHeightForRow = theClass.estimatedHeightForRow {
return estimatedHeightForRow() return estimatedHeightForRow()
} }
return 0 return 0
} }
public override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { open override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return loadObject?.pageJSON?.arrayForKey("molecules").count ?? 0 return loadObject?.pageJSON?.arrayForKey(KeyMolecules).count ?? 0
} }
public override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { open override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let molecule = loadObject?.pageJSON?.optionalDictionaryWithChainOfKeysOrIndexes(["molecules",indexPath.row]), guard let molecule = loadObject?.pageJSON?.optionalDictionaryWithChainOfKeysOrIndexes([KeyMolecules,indexPath.row]),
let moleculeName = molecule.optionalStringForKey("moleculeName"), let moleculeName = molecule.optionalStringForKey(KeyMoleculeName),
let cell = tableView.dequeueReusableCell(withIdentifier: moleculeName) as? MoleculeTableViewCell else { let cell = tableView.dequeueReusableCell(withIdentifier: moleculeName) as? MoleculeTableViewCell else {
return UITableViewCell() return UITableViewCell()
} }
cell.setWithJSON(molecule, delegateObject: delegateObject(), additionalData: nil) let delegate = delegateObject()
cell.setWithJSON(molecule, delegateObject: delegate, additionalData: nil)
cell.setSeparatorWithJSON(loadObject?.pageJSON?.optionalDictionaryForKey("separator"), delegateObject: delegate, additionalData: nil, indexPath: indexPath)
cell.updateView(tableView.bounds.width) cell.updateView(tableView.bounds.width)
return cell return cell
} }

View File

@ -13,6 +13,9 @@
extern NSString * const KeyScreenHeading; extern NSString * const KeyScreenHeading;
extern NSString * const KeyMolecules;
extern NSString * const KeyMoleculeName;
extern NSString * const KeyDisableButton; extern NSString * const KeyDisableButton;
extern NSString * const KeyValue; extern NSString * const KeyValue;

View File

@ -12,6 +12,9 @@
NSString * const KeyScreenHeading = @"screenHeading"; NSString * const KeyScreenHeading = @"screenHeading";
NSString * const KeyMolecules = @"molecules";
NSString * const KeyMoleculeName = @"moleculeName";
NSString * const KeyDisableButton = @"disableAction"; NSString * const KeyDisableButton = @"disableAction";
NSString * const KeyValue = @"value"; NSString * const KeyValue = @"value";