From 8832bbd0b77a6ec1b3b29aef0828099bb27cee45 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Fri, 31 Jan 2020 14:26:37 -0500 Subject: [PATCH 01/78] shaping up the page control (carouselIndicator) --- MVMCoreUI.xcodeproj/project.pbxproj | 12 + MVMCoreUI/Atoms/Views/CarouselIndicator.swift | 15 + MVMCoreUI/Atoms/Views/PageControl.swift | 323 ++++++++++++++++++ MVMCoreUI/BaseClasses/Control.swift | 1 + MVMCoreUI/BaseClasses/StackView.swift | 97 ++++++ 5 files changed, 448 insertions(+) create mode 100644 MVMCoreUI/Atoms/Views/CarouselIndicator.swift create mode 100644 MVMCoreUI/Atoms/Views/PageControl.swift create mode 100644 MVMCoreUI/BaseClasses/StackView.swift diff --git a/MVMCoreUI.xcodeproj/project.pbxproj b/MVMCoreUI.xcodeproj/project.pbxproj index 94de6eb8..1e5ca199 100644 --- a/MVMCoreUI.xcodeproj/project.pbxproj +++ b/MVMCoreUI.xcodeproj/project.pbxproj @@ -60,6 +60,9 @@ 01EB369423609801006832FA /* HeadlineBodyModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01EB368D23609801006832FA /* HeadlineBodyModel.swift */; }; 01F2A03223A4498200D954D8 /* CaretLinkModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01F2A03123A4498200D954D8 /* CaretLinkModel.swift */; }; 0A1214A022C11A18007C7030 /* ActionDetailWithImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A12149F22C11A17007C7030 /* ActionDetailWithImage.swift */; }; + 0A14F69323E349EF00EDF7F7 /* PageControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A14F69223E349EF00EDF7F7 /* PageControl.swift */; }; + 0A14F6A523E4803A00EDF7F7 /* StackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A14F6A423E4803A00EDF7F7 /* StackView.swift */; }; + 0A14F6A723E4AB6E00EDF7F7 /* CarouselIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A14F6A623E4AB6E00EDF7F7 /* CarouselIndicator.swift */; }; 0A1B4A96233BB18F005B3FB4 /* CheckboxLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7BAFA2232BE63400FB8E22 /* CheckboxLabel.swift */; }; 0A21DB7F235DECC500C160A2 /* EntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A21DB7E235DECC500C160A2 /* EntryField.swift */; }; 0A21DB83235DFBC500C160A2 /* MdnEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A21DB82235DFBC500C160A2 /* MdnEntryField.swift */; }; @@ -377,6 +380,9 @@ 01EB368D23609801006832FA /* HeadlineBodyModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeadlineBodyModel.swift; sourceTree = ""; }; 01F2A03123A4498200D954D8 /* CaretLinkModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaretLinkModel.swift; sourceTree = ""; }; 0A12149F22C11A17007C7030 /* ActionDetailWithImage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActionDetailWithImage.swift; sourceTree = ""; }; + 0A14F69223E349EF00EDF7F7 /* PageControl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PageControl.swift; sourceTree = ""; }; + 0A14F6A423E4803A00EDF7F7 /* StackView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StackView.swift; sourceTree = ""; }; + 0A14F6A623E4AB6E00EDF7F7 /* CarouselIndicator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarouselIndicator.swift; sourceTree = ""; }; 0A209CD223A7E2810068F8B0 /* UIStackViewAlignment+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIStackViewAlignment+Extension.swift"; sourceTree = ""; }; 0A21DB7E235DECC500C160A2 /* EntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EntryField.swift; sourceTree = ""; }; 0A21DB82235DFBC500C160A2 /* MdnEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MdnEntryField.swift; sourceTree = ""; }; @@ -1185,6 +1191,8 @@ 0AA33B392398524F0067DD0F /* Toggle.swift */, D260105423CEA7DC00764D80 /* MVMCoreUISwitch+Model.swift */, 012CA99D2385A2D3003F810F /* MFView+ModelExtension.swift */, + 0A14F69223E349EF00EDF7F7 /* PageControl.swift */, + 0A14F6A623E4AB6E00EDF7F7 /* CarouselIndicator.swift */, ); path = Views; sourceTree = ""; @@ -1351,6 +1359,7 @@ D2B18B802360945C00A9AEDC /* View.swift */, 0AE14F63238315D2005417F8 /* TextField.swift */, 0A5D59C323AD488600EFD9E9 /* Protocols */, + 0A14F6A423E4803A00EDF7F7 /* StackView.swift */, ); path = BaseClasses; sourceTree = ""; @@ -1645,6 +1654,7 @@ 017BEB7F23676E870024EF95 /* MoleculeObjectMapping.swift in Sources */, D274CA332236A78900B01B62 /* FooterView.swift in Sources */, D29DF2BF21E7BEA4003B2FB9 /* MVMCoreUITabBarPageControlViewController.m in Sources */, + 0A14F69323E349EF00EDF7F7 /* PageControl.swift in Sources */, 014AA72423C501E2006F3E93 /* MoleculeContainerModel.swift in Sources */, D29DF28321E7AB24003B2FB9 /* MVMCoreUICommonViewsUtility.m in Sources */, 011B58F223A2AE2C0085F53C /* DropDownListItemModel.swift in Sources */, @@ -1683,6 +1693,7 @@ 01EB3684236097C0006832FA /* MoleculeModelProtocol.swift in Sources */, D27CD4102339057800C1DC07 /* EyebrowHeadlineBodyLink.swift in Sources */, D29DF11D21E684A9003B2FB9 /* MVMCoreUISplitViewController.m in Sources */, + 0A14F6A723E4AB6E00EDF7F7 /* CarouselIndicator.swift in Sources */, 0198F79F225679880066C936 /* FormValidationProtocol.swift in Sources */, D243859923A16B1800332775 /* Container.swift in Sources */, D260105B23D0BB7100764D80 /* StackModelProtocol.swift in Sources */, @@ -1714,6 +1725,7 @@ 012A889C23889E8400FE3DA1 /* TemplateModelProtocol.swift in Sources */, D29770FC21F7C77400B2F0D0 /* MVMCoreUITextFieldView.m in Sources */, C003506123AA94CD00B6AC29 /* Button.swift in Sources */, + 0A14F6A523E4803A00EDF7F7 /* StackView.swift in Sources */, DBC4391B224421A0001AB423 /* CaretButton.swift in Sources */, 0198F7A82256A80B0066C936 /* MFRadioButton.m in Sources */, 0A6BF4722360C56C0028F841 /* BaseDropdownEntryField.swift in Sources */, diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator.swift new file mode 100644 index 00000000..686b1109 --- /dev/null +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator.swift @@ -0,0 +1,15 @@ +// +// CarouselIndicator.swift +// MVMCoreUI +// +// Created by Kevin Christiano on 1/31/20. +// Copyright © 2020 Verizon Wireless. All rights reserved. +// + +import Foundation + + +open class CarouselIndicator: PageControl { + + +} diff --git a/MVMCoreUI/Atoms/Views/PageControl.swift b/MVMCoreUI/Atoms/Views/PageControl.swift new file mode 100644 index 00000000..2f3dada4 --- /dev/null +++ b/MVMCoreUI/Atoms/Views/PageControl.swift @@ -0,0 +1,323 @@ +// +// PageControl.swift +// MVMCoreUI +// +// Created by Kevin Christiano on 1/30/20. +// Copyright © 2020 Verizon Wireless. All rights reserved. +// + +import Foundation + +public protocol PagingIndicatorProtocol: class { + typealias PagingTouchBlock = (PagingIndicatorProtocol) -> () + var currentPage: Int { get } + var numberOfPages: Int { get } + // func setPagingTouchBlock(_ pagingTouchBlock: PagingTouchBlock?) + // func scrollViewDidScroll(_ collectionView: UICollectionView) +} + + +open class PageControl: Control, PagingIndicatorProtocol { + //-------------------------------------------------- + // MARK: - Constraints + //-------------------------------------------------- + + public var topConstraint: NSLayoutConstraint? + public var bottomConstraint: NSLayoutConstraint? + + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + + public enum IndicatorType { + case bar + case numeric + case hybrid // bar & numeric + } + + public var indicatorType: IndicatorType = .hybrid + + public var indicatorSpacing: CGFloat { + get { return containerStack.spacing } + set { + containerStack.spacing = newValue + containerStack.layoutIfNeeded() + } + } + public let indicatorBarWidth: CGFloat = 24 + public let indicatorBarHeight: (selected: CGFloat, unselected: CGFloat) = (selected: 4, unselected: 1) + + private(set) var indicators = [BarIndicator]() + + var containerStack: StackView = { + let stack = StackView() + stack.axis = .horizontal + stack.distribution = .equalSpacing + stack.spacing = 6 + return stack + }() + + public var pagingTouchBlock: PagingIndicatorProtocol.PagingTouchBlock? + + // a flag to allow to send UIControlEventValueChanged actions all the time + // e.g. going to previous element at first place and going to next at last place + // While current rectangle won't change, need update current page + public var alwaysSendingControlEvent = false + + /// Set true to make the accessibility value as "Slide #currentPage of #totalPage", otherwise will be "Page #currentPage of #totalPage", default is false + public var isSlidesAccessibile = false + public var isAnimated = false + public var hidesForSinglePage = false + + //-------------------------------------------------- + // MARK: - Computed Properties + //-------------------------------------------------- + + /// The currently active indicator view. + public weak var currentIndicator: BarIndicator? { + didSet { + let expression = { + oldValue?.heightConstraint?.constant = self.indicatorBarHeight.unselected + self.currentIndicator?.heightConstraint?.constant = self.indicatorBarHeight.selected + self.layoutIfNeeded() + } + + isAnimated ? UIView.animate(withDuration: 0.3) { expression() } : expression() + } + } + + private var _currentPage = 0 + + public var currentPage: Int { + get { return _currentPage } + set { + guard _currentPage != newValue else { return } + _currentPage = newValue + currentIndicator = indicators[newValue] + } + } + + private var _numberOfPages = 0 + + public var numberOfPages: Int { + get { return _numberOfPages } + set { + guard _numberOfPages != newValue else { return } + _numberOfPages = newValue + setupIndicators() + } + } + + private var _indicatorTintColor: UIColor = .mvmCoolGray6 + + public var indicatorTintColor: UIColor { + get { return _indicatorTintColor } + set { + _indicatorTintColor = newValue + if indicators.isEmpty { setupIndicators() } + indicators.forEach { $0.backgroundColor = newValue} + } + } + + private var _currentPageIndicatorTintColor: UIColor = .black + + public var currentPageIndicatorTintColor: UIColor { + get { return _currentPageIndicatorTintColor } + set { + _currentPageIndicatorTintColor = newValue + if indicators.isEmpty { setupIndicators() } + currentIndicator?.backgroundColor = newValue + } + } + + //-------------------------------------------------- + // MARK: - Initializers + //-------------------------------------------------- + + override init(frame: CGRect) { + super.init(frame: frame) + } + + convenience override init() { + self.init(frame: .zero) + } + + convenience init(indicatorType: IndicatorType) { + self.init(frame: .zero) + self.indicatorType = indicatorType + } + + required public init?(coder: NSCoder) { + super.init(coder: coder) + } + + //-------------------------------------------------- + // MARK: - Lifecycle + //-------------------------------------------------- + + public override func initialSetup() { + super.initialSetup() + + isAccessibilityElement = true + accessibilityTraits = .adjustable + } + + open override func setupView() { + super.setupView() + + if containerStack.subviews.isEmpty { + if let accessibleValue = MVMCoreUIUtility.hardcodedString(withKey: isSlidesAccessibile ? "MVMCoreUIPageControlslides_currentpage_index" : "MVMCoreUIPageControl_currentpage_index") { + accessibilityValue = String(format: accessibleValue, currentPage + 1, numberOfPages) + } + + addSubview(containerStack) + containerStack.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true + containerStack.leadingAnchor.constraint(greaterThanOrEqualTo: leadingAnchor).isActive = true + trailingAnchor.constraint(lessThanOrEqualTo: containerStack.trailingAnchor).isActive = true + + topConstraint = containerStack.topAnchor.constraint(equalTo: topAnchor, constant: PaddingThree) + topConstraint?.priority = .defaultHigh + topConstraint?.isActive = true + + bottomConstraint = bottomAnchor.constraint(equalTo: containerStack.bottomAnchor, constant: PaddingThree) + bottomConstraint?.priority = .defaultHigh + bottomConstraint?.isActive = true + + setupIndicators() + + let tapGesture = UITapGestureRecognizer() + tapGesture.addTarget(self, action: #selector(indicatorTapped(_:))) + addGestureRecognizer(tapGesture) + } + } + + open override func updateView(_ size: CGFloat) { } + + //-------------------------------------------------- + // MARK: - Methods + //-------------------------------------------------- + + // func setPagingTouchBlock(_ pagingTouchBlock: PageControl.PagingTouchBlock?) { } + // + // func scrollViewDidScroll(_ collectionView: UICollectionView) { } + + func setupIndicators() { + + removeIndicators() + var newIndicators = [BarIndicator]() + + for i in 0..= touchPoint_X && indicator.frame.minX <= touchPoint_X + } + + if let selectIndex = index { + currentPage = selectIndex + sendActions(for: .valueChanged) + pagingTouchBlock?(self) + } + } + } + + //-------------------------------------------------- + // MARK: - MoleculeViewProtocol + //-------------------------------------------------- + + override open func setWithModel(_ model: MoleculeModelProtocol?, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable : Any]?) { + // TODO + /* + + var colorString = json?.string(KeyBackgroundColor) + + if colorString != nil { + backgroundColor = UIColor.mfGet(forHex: colorString) + } + + colorString = json?.string("barsColor") + + if colorString != nil { + let color = UIColor.mfGet(forHex: colorString) + pageIndicatorTintColor = color + currentPageIndicatorTintColor = color + } + + colorString = json?.string("currentBarColor") + + if colorString != nil { + currentPageIndicatorTintColor = UIColor.mfGet(forHex: colorString) + } + */ + } + + //-------------------------------------------------- + // MARK: - Accessibility + //-------------------------------------------------- + + open override func accessibilityIncrement() { + accessibilityAdjust(toPage: currentPage + 1) + } + + open override func accessibilityDecrement() { + accessibilityAdjust(toPage: currentPage - 1) + } + + // When awlaysSenfingControlEvent is false, and user is already at first or final index, if user try to increment or decrement, won't do action + // while self.awlaysSenfingControlEven is YES, it still send control event, while the rectangle won't change, need set currentPage again. + func accessibilityAdjust(toPage index: Int) { + + if (index < numberOfPages && index >= 0) || alwaysSendingControlEvent { + isAnimated = false + currentPage = index + sendActions(for: .valueChanged) + pagingTouchBlock?(self) + } + } + + func setTopBottomSpace(constant: CGFloat) { + self.bottomConstraint?.constant = constant + self.topConstraint?.constant = constant + } + + public class BarIndicator: View { + + var heightConstraint: NSLayoutConstraint? + + override init(frame: CGRect) { + super.init(frame: .zero) + } + + convenience init() { + self.init(frame: .zero) + } + + public required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + } +} diff --git a/MVMCoreUI/BaseClasses/Control.swift b/MVMCoreUI/BaseClasses/Control.swift index d73e0fef..ff3b8508 100644 --- a/MVMCoreUI/BaseClasses/Control.swift +++ b/MVMCoreUI/BaseClasses/Control.swift @@ -12,6 +12,7 @@ import UIKit //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- + open var json: [AnyHashable: Any]? open var model: MoleculeModelProtocol? diff --git a/MVMCoreUI/BaseClasses/StackView.swift b/MVMCoreUI/BaseClasses/StackView.swift new file mode 100644 index 00000000..b71273a7 --- /dev/null +++ b/MVMCoreUI/BaseClasses/StackView.swift @@ -0,0 +1,97 @@ +// +// File.swift +// MVMCoreUI +// +// Created by Kevin Christiano on 1/31/20. +// Copyright © 2020 Verizon Wireless. All rights reserved. +// + +import Foundation + + +open class StackView: UIStackView, ModelMoleculeViewProtocol { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + + open var json: [AnyHashable: Any]? + open var model: MoleculeModelProtocol? + + private var initialSetupPerformed = false + + //-------------------------------------------------- + // MARK: - Initialization + //-------------------------------------------------- + + public override init(frame: CGRect) { + super.init(frame: .zero) + initialSetup() + } + + public convenience init() { + self.init(frame: .zero) + } + + public required init(coder: NSCoder) { + super.init(coder: coder) + initialSetup() + } + + public func initialSetup() { + if !initialSetupPerformed { + initialSetupPerformed = true + setupView() + } + } + + // MARK:- ModelMoleculeViewProtocol + open func setWithModel(_ model: MoleculeModelProtocol?, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { + self.model = model + if let backgroundColor = model?.backgroundColor { + self.backgroundColor = backgroundColor.uiColor + } + } + + open class func nameForReuse(_ model: MoleculeModelProtocol?, _ delegateObject: MVMCoreUIDelegateObject?) -> String? { + return model?.moleculeName + } + + open class func estimatedHeight(forRow molecule: MoleculeModelProtocol?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat? { + return nil + } + + open class func requiredModules(_ molecule: MoleculeModelProtocol?, delegateObject: MVMCoreUIDelegateObject?, error: AutoreleasingUnsafeMutablePointer?) -> [String]? { + return nil + } +} + +// MARK:- MVMCoreViewProtocol +extension StackView: MVMCoreViewProtocol { + + open func updateView(_ size: CGFloat) {} + + /// Will be called only once. + open func setupView() { + translatesAutoresizingMaskIntoConstraints = false + insetsLayoutMarginsFromSafeArea = false + MVMCoreUIUtility.setMarginsFor(self, leading: 0, top: 0, trailing: 0, bottom: 0) + } +} + +// MARK:- MVMCoreUIMoleculeViewProtocol +extension StackView: MVMCoreUIMoleculeViewProtocol { + + open func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) { + self.json = json + + if let backgroundColorString = json?.optionalStringForKey(KeyBackgroundColor) { + backgroundColor = UIColor.mfGet(forHex: backgroundColorString) + } + } + + open func reset() { + backgroundColor = .clear + } + + open func setAsMolecule() { } +} From af54ac2a3cc10c76583438c7936c8bc77a0609d8 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Fri, 31 Jan 2020 15:38:07 -0500 Subject: [PATCH 02/78] getting ready for an evolution --- MVMCoreUI/Atoms/Views/PageControl.swift | 57 ++++++++++++------------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/MVMCoreUI/Atoms/Views/PageControl.swift b/MVMCoreUI/Atoms/Views/PageControl.swift index 2f3dada4..cac93fef 100644 --- a/MVMCoreUI/Atoms/Views/PageControl.swift +++ b/MVMCoreUI/Atoms/Views/PageControl.swift @@ -8,16 +8,11 @@ import Foundation -public protocol PagingIndicatorProtocol: class { - typealias PagingTouchBlock = (PagingIndicatorProtocol) -> () - var currentPage: Int { get } - var numberOfPages: Int { get } - // func setPagingTouchBlock(_ pagingTouchBlock: PagingTouchBlock?) - // func scrollViewDidScroll(_ collectionView: UICollectionView) -} - - -open class PageControl: Control, PagingIndicatorProtocol { +/** + This class is implemented to focus primarily on the page control logic. + Visual flourishes and bespoke behavior should be subclassed from here. + */ +open class PageControl: Control { //-------------------------------------------------- // MARK: - Constraints //-------------------------------------------------- @@ -38,18 +33,19 @@ open class PageControl: Control, PagingIndicatorProtocol { public var indicatorType: IndicatorType = .hybrid public var indicatorSpacing: CGFloat { - get { return containerStack.spacing } + get { return stackView.spacing } set { - containerStack.spacing = newValue - containerStack.layoutIfNeeded() + stackView.spacing = newValue + stackView.layoutIfNeeded() } } + public let indicatorBarWidth: CGFloat = 24 public let indicatorBarHeight: (selected: CGFloat, unselected: CGFloat) = (selected: 4, unselected: 1) private(set) var indicators = [BarIndicator]() - var containerStack: StackView = { + var stackView: StackView = { let stack = StackView() stack.axis = .horizontal stack.distribution = .equalSpacing @@ -57,11 +53,13 @@ open class PageControl: Control, PagingIndicatorProtocol { return stack }() - public var pagingTouchBlock: PagingIndicatorProtocol.PagingTouchBlock? + public var pagingTouchBlock: ((Int)->())? // a flag to allow to send UIControlEventValueChanged actions all the time // e.g. going to previous element at first place and going to next at last place // While current rectangle won't change, need update current page + // When awlaysSenfingControlEvent is false, and user is already at first or final index, if user try to increment or decrement, won't do action + // while self.awlaysSenfingControlEven is YES, it still send control event, while the rectangle won't change, need set currentPage again. public var alwaysSendingControlEvent = false /// Set true to make the accessibility value as "Slide #currentPage of #totalPage", otherwise will be "Page #currentPage of #totalPage", default is false @@ -69,6 +67,9 @@ open class PageControl: Control, PagingIndicatorProtocol { public var isAnimated = false public var hidesForSinglePage = false + /// If true, then index will wraparound, otherwise it will stop paging at min/max index. + public var allowIndexWraparound = false + //-------------------------------------------------- // MARK: - Computed Properties //-------------------------------------------------- @@ -165,21 +166,21 @@ open class PageControl: Control, PagingIndicatorProtocol { open override func setupView() { super.setupView() - if containerStack.subviews.isEmpty { + if stackView.subviews.isEmpty { if let accessibleValue = MVMCoreUIUtility.hardcodedString(withKey: isSlidesAccessibile ? "MVMCoreUIPageControlslides_currentpage_index" : "MVMCoreUIPageControl_currentpage_index") { accessibilityValue = String(format: accessibleValue, currentPage + 1, numberOfPages) } - addSubview(containerStack) - containerStack.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true - containerStack.leadingAnchor.constraint(greaterThanOrEqualTo: leadingAnchor).isActive = true - trailingAnchor.constraint(lessThanOrEqualTo: containerStack.trailingAnchor).isActive = true + addSubview(stackView) + stackView.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true + stackView.leadingAnchor.constraint(greaterThanOrEqualTo: leadingAnchor).isActive = true + trailingAnchor.constraint(lessThanOrEqualTo: stackView.trailingAnchor).isActive = true - topConstraint = containerStack.topAnchor.constraint(equalTo: topAnchor, constant: PaddingThree) + topConstraint = stackView.topAnchor.constraint(equalTo: topAnchor, constant: PaddingThree) topConstraint?.priority = .defaultHigh topConstraint?.isActive = true - bottomConstraint = bottomAnchor.constraint(equalTo: containerStack.bottomAnchor, constant: PaddingThree) + bottomConstraint = bottomAnchor.constraint(equalTo: stackView.bottomAnchor, constant: PaddingThree) bottomConstraint?.priority = .defaultHigh bottomConstraint?.isActive = true @@ -231,7 +232,7 @@ open class PageControl: Control, PagingIndicatorProtocol { func indicatorTapped(_ tapGesture: UITapGestureRecognizer?) { if isUserInteractionEnabled { - let touchPoint_X = tapGesture?.location(in: containerStack).x ?? 0.0 + let touchPoint_X = tapGesture?.location(in: stackView).x ?? 0.0 let index = indicators.firstIndex { indicator in return indicator.frame.maxX >= touchPoint_X && indicator.frame.minX <= touchPoint_X @@ -240,7 +241,7 @@ open class PageControl: Control, PagingIndicatorProtocol { if let selectIndex = index { currentPage = selectIndex sendActions(for: .valueChanged) - pagingTouchBlock?(self) + pagingTouchBlock?(selectIndex) } } } @@ -287,21 +288,19 @@ open class PageControl: Control, PagingIndicatorProtocol { accessibilityAdjust(toPage: currentPage - 1) } - // When awlaysSenfingControlEvent is false, and user is already at first or final index, if user try to increment or decrement, won't do action - // while self.awlaysSenfingControlEven is YES, it still send control event, while the rectangle won't change, need set currentPage again. func accessibilityAdjust(toPage index: Int) { if (index < numberOfPages && index >= 0) || alwaysSendingControlEvent { isAnimated = false currentPage = index sendActions(for: .valueChanged) - pagingTouchBlock?(self) + pagingTouchBlock?(index) } } func setTopBottomSpace(constant: CGFloat) { - self.bottomConstraint?.constant = constant - self.topConstraint?.constant = constant + bottomConstraint?.constant = constant + topConstraint?.constant = constant } public class BarIndicator: View { From 977bff851e3709a1bf29027b2082f4c3d8f5ff37 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Thu, 6 Feb 2020 15:51:13 -0500 Subject: [PATCH 03/78] latest and greatest. --- MVMCoreUI.xcodeproj/project.pbxproj | 40 ++- MVMCoreUI/Atoms/Views/CarouselIndicator.swift | 15 - .../CarouselIndicator/CarouselIndicator.swift | 301 ++++++++++++++++ .../CarouselIndicatorModel.swift | 50 +++ .../IndicatorViews/BarsIndicatorView.swift | 164 +++++++++ .../IndicatorViews/NumericIndicatorView.swift | 161 +++++++++ MVMCoreUI/Atoms/Views/PageControl.swift | 322 ------------------ MVMCoreUI/BaseClasses/StackView.swift | 19 +- 8 files changed, 719 insertions(+), 353 deletions(-) delete mode 100644 MVMCoreUI/Atoms/Views/CarouselIndicator.swift create mode 100644 MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift create mode 100644 MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift create mode 100644 MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift create mode 100644 MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/NumericIndicatorView.swift delete mode 100644 MVMCoreUI/Atoms/Views/PageControl.swift diff --git a/MVMCoreUI.xcodeproj/project.pbxproj b/MVMCoreUI.xcodeproj/project.pbxproj index 1e5ca199..c7891f25 100644 --- a/MVMCoreUI.xcodeproj/project.pbxproj +++ b/MVMCoreUI.xcodeproj/project.pbxproj @@ -60,9 +60,11 @@ 01EB369423609801006832FA /* HeadlineBodyModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01EB368D23609801006832FA /* HeadlineBodyModel.swift */; }; 01F2A03223A4498200D954D8 /* CaretLinkModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01F2A03123A4498200D954D8 /* CaretLinkModel.swift */; }; 0A1214A022C11A18007C7030 /* ActionDetailWithImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A12149F22C11A17007C7030 /* ActionDetailWithImage.swift */; }; - 0A14F69323E349EF00EDF7F7 /* PageControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A14F69223E349EF00EDF7F7 /* PageControl.swift */; }; + 0A14F69323E349EF00EDF7F7 /* CarouselIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A14F69223E349EF00EDF7F7 /* CarouselIndicator.swift */; }; 0A14F6A523E4803A00EDF7F7 /* StackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A14F6A423E4803A00EDF7F7 /* StackView.swift */; }; - 0A14F6A723E4AB6E00EDF7F7 /* CarouselIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A14F6A623E4AB6E00EDF7F7 /* CarouselIndicator.swift */; }; + 0A14F6A923E8750300EDF7F7 /* CarouselIndicatorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A14F6A823E8750300EDF7F7 /* CarouselIndicatorModel.swift */; }; + 0A14F6B223E8C28D00EDF7F7 /* BarsIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A14F6B123E8C28D00EDF7F7 /* BarsIndicatorView.swift */; }; + 0A14F6B423E8C29700EDF7F7 /* NumericIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A14F6B323E8C29700EDF7F7 /* NumericIndicatorView.swift */; }; 0A1B4A96233BB18F005B3FB4 /* CheckboxLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7BAFA2232BE63400FB8E22 /* CheckboxLabel.swift */; }; 0A21DB7F235DECC500C160A2 /* EntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A21DB7E235DECC500C160A2 /* EntryField.swift */; }; 0A21DB83235DFBC500C160A2 /* MdnEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A21DB82235DFBC500C160A2 /* MdnEntryField.swift */; }; @@ -380,9 +382,11 @@ 01EB368D23609801006832FA /* HeadlineBodyModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeadlineBodyModel.swift; sourceTree = ""; }; 01F2A03123A4498200D954D8 /* CaretLinkModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaretLinkModel.swift; sourceTree = ""; }; 0A12149F22C11A17007C7030 /* ActionDetailWithImage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActionDetailWithImage.swift; sourceTree = ""; }; - 0A14F69223E349EF00EDF7F7 /* PageControl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PageControl.swift; sourceTree = ""; }; + 0A14F69223E349EF00EDF7F7 /* CarouselIndicator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarouselIndicator.swift; sourceTree = ""; }; 0A14F6A423E4803A00EDF7F7 /* StackView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StackView.swift; sourceTree = ""; }; - 0A14F6A623E4AB6E00EDF7F7 /* CarouselIndicator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarouselIndicator.swift; sourceTree = ""; }; + 0A14F6A823E8750300EDF7F7 /* CarouselIndicatorModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarouselIndicatorModel.swift; sourceTree = ""; }; + 0A14F6B123E8C28D00EDF7F7 /* BarsIndicatorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BarsIndicatorView.swift; sourceTree = ""; }; + 0A14F6B323E8C29700EDF7F7 /* NumericIndicatorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NumericIndicatorView.swift; sourceTree = ""; }; 0A209CD223A7E2810068F8B0 /* UIStackViewAlignment+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIStackViewAlignment+Extension.swift"; sourceTree = ""; }; 0A21DB7E235DECC500C160A2 /* EntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EntryField.swift; sourceTree = ""; }; 0A21DB82235DFBC500C160A2 /* MdnEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MdnEntryField.swift; sourceTree = ""; }; @@ -706,6 +710,25 @@ path = FormUIHelpers; sourceTree = ""; }; + 0A14F6B023E8C27A00EDF7F7 /* CarouselIndicator */ = { + isa = PBXGroup; + children = ( + 0A14F6B723ECA7F900EDF7F7 /* IndicatorViews */, + 0A14F69223E349EF00EDF7F7 /* CarouselIndicator.swift */, + 0A14F6A823E8750300EDF7F7 /* CarouselIndicatorModel.swift */, + ); + path = CarouselIndicator; + sourceTree = ""; + }; + 0A14F6B723ECA7F900EDF7F7 /* IndicatorViews */ = { + isa = PBXGroup; + children = ( + 0A14F6B123E8C28D00EDF7F7 /* BarsIndicatorView.swift */, + 0A14F6B323E8C29700EDF7F7 /* NumericIndicatorView.swift */, + ); + path = IndicatorViews; + sourceTree = ""; + }; 0A5D59C323AD488600EFD9E9 /* Protocols */ = { isa = PBXGroup; children = ( @@ -1162,6 +1185,7 @@ D29DF17D21E69E26003B2FB9 /* Views */ = { isa = PBXGroup; children = ( + 0A14F6B023E8C27A00EDF7F7 /* CarouselIndicator */, 9445890B2385BCE300DE9FD4 /* ProgressBarModel.swift */, 01509D922327ECFB00EF99AA /* ProgressBar.swift */, 9445890D2385C3F800DE9FD4 /* MultiProgressModel.swift */, @@ -1191,8 +1215,6 @@ 0AA33B392398524F0067DD0F /* Toggle.swift */, D260105423CEA7DC00764D80 /* MVMCoreUISwitch+Model.swift */, 012CA99D2385A2D3003F810F /* MFView+ModelExtension.swift */, - 0A14F69223E349EF00EDF7F7 /* PageControl.swift */, - 0A14F6A623E4AB6E00EDF7F7 /* CarouselIndicator.swift */, ); path = Views; sourceTree = ""; @@ -1641,6 +1663,7 @@ 01F2A03223A4498200D954D8 /* CaretLinkModel.swift in Sources */, 0A7BAFA1232BE61800FB8E22 /* Checkbox.swift in Sources */, 011B58F023A2AA980085F53C /* ListItemModelProtocol.swift in Sources */, + 0A14F6A923E8750300EDF7F7 /* CarouselIndicatorModel.swift in Sources */, D22479962316AF6E003FCCF9 /* HeadlineBodyLink.swift in Sources */, D29DF2AE21E7B3A4003B2FB9 /* MFTextView.m in Sources */, 0A41BA7F23453A6400D4C0BC /* TextEntryField.swift in Sources */, @@ -1654,7 +1677,7 @@ 017BEB7F23676E870024EF95 /* MoleculeObjectMapping.swift in Sources */, D274CA332236A78900B01B62 /* FooterView.swift in Sources */, D29DF2BF21E7BEA4003B2FB9 /* MVMCoreUITabBarPageControlViewController.m in Sources */, - 0A14F69323E349EF00EDF7F7 /* PageControl.swift in Sources */, + 0A14F69323E349EF00EDF7F7 /* CarouselIndicator.swift in Sources */, 014AA72423C501E2006F3E93 /* MoleculeContainerModel.swift in Sources */, D29DF28321E7AB24003B2FB9 /* MVMCoreUICommonViewsUtility.m in Sources */, 011B58F223A2AE2C0085F53C /* DropDownListItemModel.swift in Sources */, @@ -1670,6 +1693,7 @@ 9445890E2385C3F800DE9FD4 /* MultiProgressModel.swift in Sources */, D2A6390522CBCE160052ED1F /* MoleculeCollectionViewCell.swift in Sources */, D2A6390122CBB1820052ED1F /* Carousel.swift in Sources */, + 0A14F6B423E8C29700EDF7F7 /* NumericIndicatorView.swift in Sources */, D29DF2C721E7BF57003B2FB9 /* MFTabBarInteractor.m in Sources */, D29DF29521E7ADB8003B2FB9 /* ProgrammaticScrollViewController.m in Sources */, D2FB151B23A2B65B00C20E10 /* MoleculeContainer.swift in Sources */, @@ -1693,7 +1717,6 @@ 01EB3684236097C0006832FA /* MoleculeModelProtocol.swift in Sources */, D27CD4102339057800C1DC07 /* EyebrowHeadlineBodyLink.swift in Sources */, D29DF11D21E684A9003B2FB9 /* MVMCoreUISplitViewController.m in Sources */, - 0A14F6A723E4AB6E00EDF7F7 /* CarouselIndicator.swift in Sources */, 0198F79F225679880066C936 /* FormValidationProtocol.swift in Sources */, D243859923A16B1800332775 /* Container.swift in Sources */, D260105B23D0BB7100764D80 /* StackModelProtocol.swift in Sources */, @@ -1739,6 +1762,7 @@ D2B18B922361E65A00A9AEDC /* CoreUIObject.swift in Sources */, D29DF2BE21E7BEA4003B2FB9 /* TopTabbar.m in Sources */, 014AA72E23C5059B006F3E93 /* StackCenteredPageTemplateModel.swift in Sources */, + 0A14F6B223E8C28D00EDF7F7 /* BarsIndicatorView.swift in Sources */, D2A514632213643100345BFB /* MoleculeStackCenteredTemplate.swift in Sources */, D260105923D0A92900764D80 /* ContainerProtocol.swift in Sources */, C695A69423C9909000BFB94E /* DoughnutChartModel.swift in Sources */, diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator.swift deleted file mode 100644 index 686b1109..00000000 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// CarouselIndicator.swift -// MVMCoreUI -// -// Created by Kevin Christiano on 1/31/20. -// Copyright © 2020 Verizon Wireless. All rights reserved. -// - -import Foundation - - -open class CarouselIndicator: PageControl { - - -} diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift new file mode 100644 index 00000000..5201b920 --- /dev/null +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift @@ -0,0 +1,301 @@ +// +// CarouselIndicator.swift +// MVMCoreUI +// +// Created by Kevin Christiano on 1/30/20. +// Copyright © 2020 Verizon Wireless. All rights reserved. +// + +import Foundation + +public protocol IndicatorViewProtocol { + func updateUI() + var isEnabled: Bool { get set } + var currentIndex: Int? { get set } + var numberOfPages: Int? { get } +} + +open class CarouselIndicator: Control { + //-------------------------------------------------- + // MARK: - Constraints + //-------------------------------------------------- + + public var topConstraint: NSLayoutConstraint? + public var bottomConstraint: NSLayoutConstraint? + + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + + public typealias IndicatorView = UIView & IndicatorViewProtocol + + /// The types of indicators that can appear. + public enum IndicatorType: String { + case bar + case numeric + case hybrid // bar & numeric + } + + /// Determines interactivity and appearance of the indicator. + public var indicatorType: IndicatorType = .hybrid { + didSet { + assignIndicatorView() + } + } + + /// The view control relative to the state of the indicator type. + private(set) var indicatorView: IndicatorView? { + didSet { + topConstraint = indicatorView!.topAnchor.constraint(equalTo: topAnchor, constant: PaddingTwo) + topConstraint?.isActive = true + + bottomConstraint = bottomAnchor.constraint(equalTo: indicatorView!.bottomAnchor, constant: PaddingTwo) + bottomConstraint?.isActive = true + } + } + + /// The maxmum count of pages before the indicatorView forces a numeric Indicator insead of Bar. + public var hybridThreshold: Int = 5 + + /// Spacing used between bars of the Bars Indicator and between the title and arrows of the Numeric Indicator + public var indicatorBarSpacing: CGFloat = 6 { + didSet { + if let stackView = indicatorView as? StackView { + stackView.spacing = indicatorBarSpacing + stackView.layoutIfNeeded() + } + } + } + + // private(set) var indicatorBars = [BarIndicator]() + + /// Set this closure to perform an action when a different indicator was selected. + public var indicatorTappedBlock: ((Int)->())? + + /// Allows sendActions() to trigger even if index is min/max index. + public var alwaysSendControlEvent = false + + /// Set true to make the accessibility value as "Slide #currentPage of #totalPage", otherwise will be "Page #currentPage of #totalPage", default is false + public var isSlidesAccessibile = false + + public var isAnimated = false + + /// Will hide this control if page count is 1. + public var hidesForSinglePage = false { + didSet { isHidden = hidesForSinglePage && numberOfPages <= 1 } + } + + /// If true, then index will wraparound, otherwise it will stop paging at min/max index. + public var allowIndexWraparound = false + + public override var isEnabled: Bool { + didSet { + isUserInteractionEnabled = isEnabled + indicatorView?.isEnabled = isEnabled + + if indicatorType != .bar && numberOfPages > hybridThreshold { + + } else { + if let stackView = indicatorView as? BarsIndicatorView { + stackView.stackView.arrangedSubviews.forEach { view in + // if let indicator = { + (view as? BarsIndicatorView)?.isEnabled = isEnabled + // } + } + } + } + } + } + + //-------------------------------------------------- + // MARK: - Computed Properties + //-------------------------------------------------- + + /// The currently active indicator view. + public weak var currentIndicator: IndicatorView? { + didSet { + + } + } + + private var _currentIndex = 0 + + public var currentIndex: Int { + get { return _currentIndex } + set { + guard _currentIndex != newValue else { return } + _currentIndex = newValue + } + } + + private var _numberOfPages = 0 + + public var numberOfPages: Int { + get { return _numberOfPages } + set { + guard _numberOfPages != newValue else { return } + _numberOfPages = newValue + + if hidesForSinglePage && newValue <= 1 { + isHidden = true + } else { + isHidden = false + indicatorView = BarsIndicatorView(numberOfBars: numberOfPages) + } + + indicatorView?.updateUI() + } + } + + private var _indicatorTintColor: UIColor = .mvmCoolGray6 + + public var indicatorTintColor: UIColor { + get { return _indicatorTintColor } + set { + _indicatorTintColor = newValue + if isBarIndicator(), let barsView = (indicatorView as? BarsIndicatorView)?.stackView.arrangedSubviews.isEmpty { + indicatorView = BarsIndicatorView(numberOfBars: numberOfPages) + } + (indicatorView as? BarsIndicatorView)?.stackView.arrangedSubviews.forEach { $0.backgroundColor = newValue} + } + } + + private var _currentPageIndicatorTintColor: UIColor = .black + + public var currentPageIndicatorTintColor: UIColor { + get { return _currentPageIndicatorTintColor } + set { + _currentPageIndicatorTintColor = newValue + if ((indicatorView as? BarsIndicatorView)?.stackView.arrangedSubviews.isEmpty)! { + indicatorView = BarsIndicatorView(numberOfBars: numberOfPages) + } + currentIndicator?.backgroundColor = newValue + } + } + + //-------------------------------------------------- + // MARK: - Initializers + //-------------------------------------------------- + + override init(frame: CGRect) { + super.init(frame: frame) + } + + convenience override init() { + self.init(frame: .zero) + } + + public init(indicatorType: IndicatorType) { + self.indicatorType = indicatorType + super.init(frame: .zero) + } + + required public init?(coder: NSCoder) { + super.init(coder: coder) + } + + //-------------------------------------------------- + // MARK: - Lifecycle + //-------------------------------------------------- + + public override func initialSetup() { + super.initialSetup() + + isAccessibilityElement = true + accessibilityTraits = .adjustable + } + + open override func setupView() { + super.setupView() + + if indicatorView == nil { + + assignIndicatorView() + + if let accessibleValue = MVMCoreUIUtility.hardcodedString(withKey: isSlidesAccessibile ? "MVMCoreUIPageControlslides_currentpage_index" : "MVMCoreUIPageControl_currentpage_index") { + accessibilityValue = String(format: accessibleValue, currentIndex + 1, numberOfPages) + } + } + } + + open override func updateView(_ size: CGFloat) { + super.updateView(size) + } + + //-------------------------------------------------- + // MARK: - Methods + //-------------------------------------------------- + + func assignIndicatorView() { + + switch indicatorType { + case .bar: + indicatorView = BarsIndicatorView(numberOfBars: numberOfPages) + + case .numeric: + indicatorView = NumericIndicatorView() + + case .hybrid: + indicatorView = numberOfPages >= hybridThreshold ? NumericIndicatorView() : BarsIndicatorView(numberOfBars: numberOfPages) + } + } + + /// Removes all indicators from their subview and then clears the holding array. + func removeIndicatorView() { + + // indicatorBars.forEach { $0.removeFromSuperview() } + // indicatorBars = [] + } + + /// Convenience to determine if current view is displaying bars. + func isBarIndicator() -> Bool { + return indicatorType != .bar && numberOfPages > hybridThreshold + } + + //-------------------------------------------------- + // MARK: - MoleculeViewProtocol + //-------------------------------------------------- + + override open func setWithModel(_ model: MoleculeModelProtocol?, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { + super.setWithModel(model, delegateObject, additionalData) + + guard let model = model as? CarouselIndicatorModel else { return } + + if let type = model.type, let indicator = IndicatorType(rawValue: type) { + indicatorType = indicator + } + + // backgroundColor = model.backgroundColor?.uiColor + // barsColor = model.barsColor + // pageIndicatorTintColor + // currentPageIndicatorTintColor + } + + //-------------------------------------------------- + // MARK: - Accessibility + //-------------------------------------------------- + + open override func accessibilityIncrement() { + accessibilityAdjust(toPage: currentIndex + 1) + } + + open override func accessibilityDecrement() { + accessibilityAdjust(toPage: currentIndex - 1) + } + + func accessibilityAdjust(toPage index: Int) { + + if (index < numberOfPages && index >= 0) || alwaysSendControlEvent { + isAnimated = false + currentIndex = index + sendActions(for: .valueChanged) + indicatorTappedBlock?(index) + } + } + + func setTopBottomSpace(constant: CGFloat) { + + bottomConstraint?.constant = constant + topConstraint?.constant = constant + } +} diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift new file mode 100644 index 00000000..7796b89c --- /dev/null +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift @@ -0,0 +1,50 @@ +// +// CarouselIndicatorModel.swift +// MVMCoreUI +// +// Created by Kevin Christiano on 2/3/20. +// Copyright © 2020 Verizon Wireless. All rights reserved. +// + +import Foundation + + +public class CarouselIndicatorModel: MoleculeModelProtocol { + + public var backgroundColor: Color? + public var barsColor: Color? + + public static var identifier: String { + return "carouselIndicator" + } + + public var moleculeName: String? + public var type: String? = "hybrid" + + private enum CodingKeys: String, CodingKey { + case moleculeName + case backgroundColor + case type + case barsColor + } + + required public init(from decoder: Decoder) throws { + let typeContainer = try decoder.container(keyedBy: CodingKeys.self) +// if let state = try typeContainer.decodeIfPresent(Bool.self, forKey: .state) { +// self.state = state +// } +// action = try typeContainer.decodeModelIfPresent(codingKey: .action, typeCodingKey: ActionCodingKey.actionType) +// alternateAction = try typeContainer.decodeModelIfPresent(codingKey: .alternateAction, typeCodingKey: ActionCodingKey.actionType) + backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) + barsColor = try typeContainer.decodeIfPresent(Color.self, forKey: .barsColor) + type = try typeContainer.decodeIfPresent(String.self, forKey: .type) ?? "hybrid" + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) + try container.encodeIfPresent(barsColor, forKey: .barsColor) + try container.encode(moleculeName, forKey: .moleculeName) + try container.encodeIfPresent(type, forKey: .type) + } +} diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift new file mode 100644 index 00000000..57c2530d --- /dev/null +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift @@ -0,0 +1,164 @@ +// +// BarIndicatorView.swift +// MVMCoreUI +// +// Created by Kevin Christiano on 2/3/20. +// Copyright © 2020 Verizon Wireless. All rights reserved. +// + +import UIKit + + +open class BarsIndicatorView: View, IndicatorViewProtocol { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + + let stackView: StackView = { + let stackView = StackView() + stackView.axis = .horizontal + stackView.distribution = .equalSpacing + stackView.spacing = PaddingOne + return stackView + }() + + var barsReference: [(View, NSLayoutConstraint)] = [] + + // Dimensions are based on InVision Design Guidelines. + public static let indicatorBarWidth: CGFloat = 24 + public static let indicatorBarHeight: (selected: CGFloat, unselected: CGFloat) = (selected: 4, unselected: 1) + + public var enabledColor: UIColor = .black + public var disabledColor: UIColor = .mvmCoolGray3 + + private var oldIndex: Int = 0 + + /// Returns the currentIndex from its parent CarouselIndicator. + public var currentIndex: Int? { + get { return (superview as? CarouselIndicator)?.currentIndex } + set { + guard let newValue = newValue else { return } + (superview as? CarouselIndicator)?.currentIndex = newValue + } + } + + /// Returns the numberOfPages count from its parent CarouselIndicator. + public var numberOfPages: Int? { + return (superview as? CarouselIndicator)?.numberOfPages + } + + public var numberOfBars: Int = 0 { + didSet { + // TODO: Generate bars... + } + } + + open var isEnabled: Bool = true { + didSet { + if isEnabled { + + } else { + + } + } + } + + open var isAnimated: Bool { + return (superview as? CarouselIndicator)?.isAnimated ?? true + } + + //-------------------------------------------------- + // MARK: - Initializers + //-------------------------------------------------- + + public init(numberOfBars: Int) { + super.init(frame: .zero) + self.numberOfBars = numberOfBars + } + + public required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + //-------------------------------------------------- + // MARK: - Setup + //-------------------------------------------------- + + open override func setupView() { + super.setupView() + + if subviews.isEmpty { + addSubview(stackView) + + stackView.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true + stackView.leadingAnchor.constraint(greaterThanOrEqualTo: leadingAnchor).isActive = true + trailingAnchor.constraint(lessThanOrEqualTo: stackView.trailingAnchor).isActive = true + + removeIndicators() + + let tapGesture = UITapGestureRecognizer() + tapGesture.addTarget(self, action: #selector(indicatorTapped(_:))) + addGestureRecognizer(tapGesture) + } + } + + //-------------------------------------------------- + // MARK: - Methods + //-------------------------------------------------- + + func generateBars() { + + var bars = [(View, NSLayoutConstraint)]() + + for i in 0..= touchPoint_X && indicator.frame.minX <= touchPoint_X +// } +// +// if let selectIndex = index { +// currentIndex = selectIndex +// (indicatorView as? BarsIndicatorView)?sendActions(for: .valueChanged) +// indicatorTappedBlock?(selectIndex) +// } + } + } + + //-------------------------------------------------- + // MARK: - IndicatorViewProtocol + //-------------------------------------------------- + + public func updateUI() { + + let expression = { +// stackView.arrangedSubviews[oldIndex].heightConstraint?.constant = BarsIndicatorView.indicatorBarHeight.unselected +// self.heightConstraint?.constant = BarsIndicatorView.indicatorBarHeight.selected +// self.layoutIfNeeded() + } + +// isAnimated ? UIView.animate(withDuration: 0.3) { expression() } : expression() + } +} diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/NumericIndicatorView.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/NumericIndicatorView.swift new file mode 100644 index 00000000..4607dd2c --- /dev/null +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/NumericIndicatorView.swift @@ -0,0 +1,161 @@ +// +// NumericIndicatorView.swift +// MVMCoreUI +// +// Created by Kevin Christiano on 2/3/20. +// Copyright © 2020 Verizon Wireless. All rights reserved. +// + +import UIKit + + +open class NumericIndicatorView: View, IndicatorViewProtocol { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + + /// Text to display the current count of total pages for viewing. + open var titleLabel: Label = { + let label = Label.commonLabelB2(true) + label.setContentCompressionResistancePriority(.required, for: .vertical) + label.textAlignment = .center + return label + }() + + + // Left and right arrows for Numeric indicator + open var leftArrow = MFLoadImageView() + open var rightArrow = MFLoadImageView() + + // open var activeColor: (enabled: UIColor, disabled: UIColor) + + open var isEnabled: Bool = true { + didSet { + if isEnabled { + + } else { + + } + } + } + + /// Returns the currentIndex from its parent CarouselIndicator. + public var currentIndex: Int? { + get { return (superview as? CarouselIndicator)?.currentIndex } + set { + guard let newValue = newValue else { return } + (superview as? CarouselIndicator)?.currentIndex = newValue + } + } + + /// Returns the numberOfPages count from its parent CarouselIndicator. + public var numberOfPages: Int? { + return (superview as? CarouselIndicator)?.numberOfPages + } + + //-------------------------------------------------- + // MARK: - Initializers + //-------------------------------------------------- + + public override init(frame: CGRect) { + super.init(frame: .zero) + } + + public convenience init() { + self.init(frame: .zero) + } + + public required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + //-------------------------------------------------- + // MARK: - Lifecycle + //-------------------------------------------------- + + open override func updateView(_ size: CGFloat) { + super.updateView(size) + titleLabel.updateView(size) + } + + //-------------------------------------------------- + // MARK: - Setup + //-------------------------------------------------- + + open override func setupView() { + super.setupView() + + guard subviews.isEmpty else { return } + + addSubview(titleLabel) + titleLabel.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true + NSLayoutConstraint.constraintPinSubview(titleLabel, pinTop: true, pinBottom: true, pinLeft: false, pinRight: false) + + addSubview(leftArrow) + NSLayoutConstraint.constraintPinView(leftArrow, heightConstraint: true, heightConstant: PaddingTwo, widthConstraint: true, widthConstant: PaddingTwo) + leftArrow.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true + leftArrow.isUserInteractionEnabled = true + + leftArrow.loadImage(withName: "peakingRightArrow", width: nil, height: nil) { [weak self] image, _, _ in + DispatchQueue.main.async { [weak self] in + guard let image = image else { return } + self?.leftArrow.imageView.image = image.withHorizontallyFlippedOrientation() + self?.leftArrow.layoutIfNeeded() + } + } + + let leftTap = UITapGestureRecognizer() + leftTap.addTarget(self, action: #selector(pageValueDecrement)) + leftArrow.addGestureRecognizer(leftTap) + + rightArrow.loadImage(withName: "peakingRightArrow") + addSubview(rightArrow) + NSLayoutConstraint.constraintPinView(rightArrow, heightConstraint: true, heightConstant: PaddingTwo, widthConstraint: true, widthConstant: PaddingTwo) + rightArrow.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true + rightArrow.isUserInteractionEnabled = true + + let rightTap = UITapGestureRecognizer() + rightTap.addTarget(self, action: #selector(pageValueIncrement)) + rightArrow.addGestureRecognizer(rightTap) + + NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: "H:|-0-[leftArrowView]-(padding)-[titleLabel]-(padding)-[rightArrowView]-0-|", + options: .directionLeadingToTrailing, + metrics: ["padding": PaddingOne], + views: ["leftArrowView": leftArrow, + "titleLabel": titleLabel, + "rightArrowView": rightArrow])) + } + + //-------------------------------------------------- + // MARK: - Actions + //-------------------------------------------------- + + @objc func pageValueIncrement() { + guard let currentIndex = currentIndex, + let numberOfPages = numberOfPages + else { return } + + self.currentIndex = min(currentIndex + 1, numberOfPages - 1) + } + + @objc func pageValueDecrement() { + guard let currentIndex = currentIndex else { return } + + self.currentIndex = max(0, currentIndex - 1) + } + + //-------------------------------------------------- + // MARK: - IndicatorViewProtocol + //-------------------------------------------------- + + open func updateUI() { + + DispatchQueue.main.async { [weak self] in + guard let self = self else { return } + + self.titleLabel.text = "\(self.currentIndex)/\(self.numberOfPages)" + self.layoutIfNeeded() + (self.superview as? CarouselIndicator)?.sendActions(for: .valueChanged) + } + } +} diff --git a/MVMCoreUI/Atoms/Views/PageControl.swift b/MVMCoreUI/Atoms/Views/PageControl.swift deleted file mode 100644 index cac93fef..00000000 --- a/MVMCoreUI/Atoms/Views/PageControl.swift +++ /dev/null @@ -1,322 +0,0 @@ -// -// PageControl.swift -// MVMCoreUI -// -// Created by Kevin Christiano on 1/30/20. -// Copyright © 2020 Verizon Wireless. All rights reserved. -// - -import Foundation - -/** - This class is implemented to focus primarily on the page control logic. - Visual flourishes and bespoke behavior should be subclassed from here. - */ -open class PageControl: Control { - //-------------------------------------------------- - // MARK: - Constraints - //-------------------------------------------------- - - public var topConstraint: NSLayoutConstraint? - public var bottomConstraint: NSLayoutConstraint? - - //-------------------------------------------------- - // MARK: - Properties - //-------------------------------------------------- - - public enum IndicatorType { - case bar - case numeric - case hybrid // bar & numeric - } - - public var indicatorType: IndicatorType = .hybrid - - public var indicatorSpacing: CGFloat { - get { return stackView.spacing } - set { - stackView.spacing = newValue - stackView.layoutIfNeeded() - } - } - - public let indicatorBarWidth: CGFloat = 24 - public let indicatorBarHeight: (selected: CGFloat, unselected: CGFloat) = (selected: 4, unselected: 1) - - private(set) var indicators = [BarIndicator]() - - var stackView: StackView = { - let stack = StackView() - stack.axis = .horizontal - stack.distribution = .equalSpacing - stack.spacing = 6 - return stack - }() - - public var pagingTouchBlock: ((Int)->())? - - // a flag to allow to send UIControlEventValueChanged actions all the time - // e.g. going to previous element at first place and going to next at last place - // While current rectangle won't change, need update current page - // When awlaysSenfingControlEvent is false, and user is already at first or final index, if user try to increment or decrement, won't do action - // while self.awlaysSenfingControlEven is YES, it still send control event, while the rectangle won't change, need set currentPage again. - public var alwaysSendingControlEvent = false - - /// Set true to make the accessibility value as "Slide #currentPage of #totalPage", otherwise will be "Page #currentPage of #totalPage", default is false - public var isSlidesAccessibile = false - public var isAnimated = false - public var hidesForSinglePage = false - - /// If true, then index will wraparound, otherwise it will stop paging at min/max index. - public var allowIndexWraparound = false - - //-------------------------------------------------- - // MARK: - Computed Properties - //-------------------------------------------------- - - /// The currently active indicator view. - public weak var currentIndicator: BarIndicator? { - didSet { - let expression = { - oldValue?.heightConstraint?.constant = self.indicatorBarHeight.unselected - self.currentIndicator?.heightConstraint?.constant = self.indicatorBarHeight.selected - self.layoutIfNeeded() - } - - isAnimated ? UIView.animate(withDuration: 0.3) { expression() } : expression() - } - } - - private var _currentPage = 0 - - public var currentPage: Int { - get { return _currentPage } - set { - guard _currentPage != newValue else { return } - _currentPage = newValue - currentIndicator = indicators[newValue] - } - } - - private var _numberOfPages = 0 - - public var numberOfPages: Int { - get { return _numberOfPages } - set { - guard _numberOfPages != newValue else { return } - _numberOfPages = newValue - setupIndicators() - } - } - - private var _indicatorTintColor: UIColor = .mvmCoolGray6 - - public var indicatorTintColor: UIColor { - get { return _indicatorTintColor } - set { - _indicatorTintColor = newValue - if indicators.isEmpty { setupIndicators() } - indicators.forEach { $0.backgroundColor = newValue} - } - } - - private var _currentPageIndicatorTintColor: UIColor = .black - - public var currentPageIndicatorTintColor: UIColor { - get { return _currentPageIndicatorTintColor } - set { - _currentPageIndicatorTintColor = newValue - if indicators.isEmpty { setupIndicators() } - currentIndicator?.backgroundColor = newValue - } - } - - //-------------------------------------------------- - // MARK: - Initializers - //-------------------------------------------------- - - override init(frame: CGRect) { - super.init(frame: frame) - } - - convenience override init() { - self.init(frame: .zero) - } - - convenience init(indicatorType: IndicatorType) { - self.init(frame: .zero) - self.indicatorType = indicatorType - } - - required public init?(coder: NSCoder) { - super.init(coder: coder) - } - - //-------------------------------------------------- - // MARK: - Lifecycle - //-------------------------------------------------- - - public override func initialSetup() { - super.initialSetup() - - isAccessibilityElement = true - accessibilityTraits = .adjustable - } - - open override func setupView() { - super.setupView() - - if stackView.subviews.isEmpty { - if let accessibleValue = MVMCoreUIUtility.hardcodedString(withKey: isSlidesAccessibile ? "MVMCoreUIPageControlslides_currentpage_index" : "MVMCoreUIPageControl_currentpage_index") { - accessibilityValue = String(format: accessibleValue, currentPage + 1, numberOfPages) - } - - addSubview(stackView) - stackView.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true - stackView.leadingAnchor.constraint(greaterThanOrEqualTo: leadingAnchor).isActive = true - trailingAnchor.constraint(lessThanOrEqualTo: stackView.trailingAnchor).isActive = true - - topConstraint = stackView.topAnchor.constraint(equalTo: topAnchor, constant: PaddingThree) - topConstraint?.priority = .defaultHigh - topConstraint?.isActive = true - - bottomConstraint = bottomAnchor.constraint(equalTo: stackView.bottomAnchor, constant: PaddingThree) - bottomConstraint?.priority = .defaultHigh - bottomConstraint?.isActive = true - - setupIndicators() - - let tapGesture = UITapGestureRecognizer() - tapGesture.addTarget(self, action: #selector(indicatorTapped(_:))) - addGestureRecognizer(tapGesture) - } - } - - open override func updateView(_ size: CGFloat) { } - - //-------------------------------------------------- - // MARK: - Methods - //-------------------------------------------------- - - // func setPagingTouchBlock(_ pagingTouchBlock: PageControl.PagingTouchBlock?) { } - // - // func scrollViewDidScroll(_ collectionView: UICollectionView) { } - - func setupIndicators() { - - removeIndicators() - var newIndicators = [BarIndicator]() - - for i in 0..= touchPoint_X && indicator.frame.minX <= touchPoint_X - } - - if let selectIndex = index { - currentPage = selectIndex - sendActions(for: .valueChanged) - pagingTouchBlock?(selectIndex) - } - } - } - - //-------------------------------------------------- - // MARK: - MoleculeViewProtocol - //-------------------------------------------------- - - override open func setWithModel(_ model: MoleculeModelProtocol?, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable : Any]?) { - // TODO - /* - - var colorString = json?.string(KeyBackgroundColor) - - if colorString != nil { - backgroundColor = UIColor.mfGet(forHex: colorString) - } - - colorString = json?.string("barsColor") - - if colorString != nil { - let color = UIColor.mfGet(forHex: colorString) - pageIndicatorTintColor = color - currentPageIndicatorTintColor = color - } - - colorString = json?.string("currentBarColor") - - if colorString != nil { - currentPageIndicatorTintColor = UIColor.mfGet(forHex: colorString) - } - */ - } - - //-------------------------------------------------- - // MARK: - Accessibility - //-------------------------------------------------- - - open override func accessibilityIncrement() { - accessibilityAdjust(toPage: currentPage + 1) - } - - open override func accessibilityDecrement() { - accessibilityAdjust(toPage: currentPage - 1) - } - - func accessibilityAdjust(toPage index: Int) { - - if (index < numberOfPages && index >= 0) || alwaysSendingControlEvent { - isAnimated = false - currentPage = index - sendActions(for: .valueChanged) - pagingTouchBlock?(index) - } - } - - func setTopBottomSpace(constant: CGFloat) { - bottomConstraint?.constant = constant - topConstraint?.constant = constant - } - - public class BarIndicator: View { - - var heightConstraint: NSLayoutConstraint? - - override init(frame: CGRect) { - super.init(frame: .zero) - } - - convenience init() { - self.init(frame: .zero) - } - - public required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - } -} diff --git a/MVMCoreUI/BaseClasses/StackView.swift b/MVMCoreUI/BaseClasses/StackView.swift index b71273a7..0539ba9e 100644 --- a/MVMCoreUI/BaseClasses/StackView.swift +++ b/MVMCoreUI/BaseClasses/StackView.swift @@ -16,9 +16,9 @@ open class StackView: UIStackView, ModelMoleculeViewProtocol { open var json: [AnyHashable: Any]? open var model: MoleculeModelProtocol? - + private var initialSetupPerformed = false - + //-------------------------------------------------- // MARK: - Initialization //-------------------------------------------------- @@ -27,7 +27,7 @@ open class StackView: UIStackView, ModelMoleculeViewProtocol { super.init(frame: .zero) initialSetup() } - + public convenience init() { self.init(frame: .zero) } @@ -44,12 +44,15 @@ open class StackView: UIStackView, ModelMoleculeViewProtocol { } } - // MARK:- ModelMoleculeViewProtocol + //-------------------------------------------------- + // MARK: - ModelMoleculeViewProtocol + //-------------------------------------------------- + open func setWithModel(_ model: MoleculeModelProtocol?, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { - self.model = model - if let backgroundColor = model?.backgroundColor { + self.model = model + if let backgroundColor = model?.backgroundColor { self.backgroundColor = backgroundColor.uiColor - } + } } open class func nameForReuse(_ model: MoleculeModelProtocol?, _ delegateObject: MVMCoreUIDelegateObject?) -> String? { @@ -69,7 +72,7 @@ open class StackView: UIStackView, ModelMoleculeViewProtocol { extension StackView: MVMCoreViewProtocol { open func updateView(_ size: CGFloat) {} - + /// Will be called only once. open func setupView() { translatesAutoresizingMaskIntoConstraints = false From af7d2e406e346ab9dd47e49f23d56dc55af65c32 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Fri, 7 Feb 2020 09:26:01 -0500 Subject: [PATCH 04/78] project file changes --- MVMCoreUI.xcodeproj/project.pbxproj.orig | 2044 ++++++++++++++++++++++ 1 file changed, 2044 insertions(+) create mode 100644 MVMCoreUI.xcodeproj/project.pbxproj.orig diff --git a/MVMCoreUI.xcodeproj/project.pbxproj.orig b/MVMCoreUI.xcodeproj/project.pbxproj.orig new file mode 100644 index 00000000..5655c96d --- /dev/null +++ b/MVMCoreUI.xcodeproj/project.pbxproj.orig @@ -0,0 +1,2044 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 48; + objects = { + +/* Begin PBXBuildFile section */ + 01004F3022721C3800991ECC /* RadioButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01004F2F22721C3800991ECC /* RadioButton.swift */; }; + 0103B84E23D7E33A009C315C /* HeadlineBodyToggleModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0103B84D23D7E33A009C315C /* HeadlineBodyToggleModel.swift */; }; + 0105618D224BBE7700E1557D /* FormValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0105618A224BBE7700E1557D /* FormValidator.swift */; }; + 0105618E224BBE7700E1557D /* FormValidator+TextFields.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0105618B224BBE7700E1557D /* FormValidator+TextFields.swift */; }; + 0105618F224BBE7700E1557D /* FormValidator+FormParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0105618C224BBE7700E1557D /* FormValidator+FormParams.swift */; }; + 0116A4E5228B19640094F3ED /* RadioButtonModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0116A4E4228B19640094F3ED /* RadioButtonModel.swift */; }; + 011B58F023A2AA980085F53C /* ListItemModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 011B58EF23A2AA980085F53C /* ListItemModelProtocol.swift */; }; + 011B58F223A2AE2C0085F53C /* DropDownListItemModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 011B58F123A2AE2C0085F53C /* DropDownListItemModel.swift */; }; + 012A889C23889E8400FE3DA1 /* TemplateModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012A889B23889E8400FE3DA1 /* TemplateModelProtocol.swift */; }; + 012A88AD238C418100FE3DA1 /* TemplateProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012A88AC238C418100FE3DA1 /* TemplateProtocol.swift */; }; + 012A88B1238C880100FE3DA1 /* CarouselPagingModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012A88B0238C880100FE3DA1 /* CarouselPagingModelProtocol.swift */; }; + 012A88C2238D7BCA00FE3DA1 /* CarouselItemModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012A88C1238D7BCA00FE3DA1 /* CarouselItemModel.swift */; }; + 012A88C4238D86E600FE3DA1 /* CarouselItemModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012A88C3238D86E600FE3DA1 /* CarouselItemModelProtocol.swift */; }; + 012A88C6238DA34000FE3DA1 /* ModuleMoleculeModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012A88C5238DA34000FE3DA1 /* ModuleMoleculeModel.swift */; }; + 012A88C8238DB02000FE3DA1 /* ModelMoleculeDelegateProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012A88C7238DB02000FE3DA1 /* ModelMoleculeDelegateProtocol.swift */; }; + 012A88DB238ED45900FE3DA1 /* CarouselModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012A88AE238C626E00FE3DA1 /* CarouselModel.swift */; }; + 012A88EC238F084D00FE3DA1 /* FooterModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012A88EB238F084D00FE3DA1 /* FooterModel.swift */; }; + 012A88F123985E0100FE3DA1 /* Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012A88F023985E0100FE3DA1 /* Color.swift */; }; + 012CA99A2384A687003F810F /* MFTextField+ModelExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012CA9992384A687003F810F /* MFTextField+ModelExtension.swift */; }; + 012CA99E2385A2D3003F810F /* MFView+ModelExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012CA99D2385A2D3003F810F /* MFView+ModelExtension.swift */; }; + 014AA72423C501E2006F3E93 /* MoleculeContainerModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 014AA72123C501E2006F3E93 /* MoleculeContainerModel.swift */; }; + 014AA72523C501E2006F3E93 /* ContainerModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 014AA72223C501E2006F3E93 /* ContainerModel.swift */; }; + 014AA72623C501E2006F3E93 /* ContainerModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 014AA72323C501E2006F3E93 /* ContainerModelProtocol.swift */; }; + 014AA72D23C5059B006F3E93 /* StackPageTemplateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 014AA72823C5059B006F3E93 /* StackPageTemplateModel.swift */; }; + 014AA72E23C5059B006F3E93 /* StackCenteredPageTemplateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 014AA72923C5059B006F3E93 /* StackCenteredPageTemplateModel.swift */; }; + 014AA72F23C5059B006F3E93 /* ThreeLayerPageTemplateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 014AA72A23C5059B006F3E93 /* ThreeLayerPageTemplateModel.swift */; }; + 014AA73123C5059B006F3E93 /* ListPageTemplateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 014AA72C23C5059B006F3E93 /* ListPageTemplateModel.swift */; }; + 01509D8F2327EC6F00EF99AA /* MoleculeTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01509D8E2327EC6F00EF99AA /* MoleculeTableViewCell.swift */; }; + 01509D912327ECE600EF99AA /* CornerLabels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01509D902327ECE600EF99AA /* CornerLabels.swift */; }; + 01509D932327ECFB00EF99AA /* ProgressBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01509D922327ECFB00EF99AA /* ProgressBar.swift */; }; + 01509D952327ED1900EF99AA /* HeadlineBodyLinkToggle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01509D942327ED1900EF99AA /* HeadlineBodyLinkToggle.swift */; }; + 017BEB382360C6AC0024EF95 /* RadioButtonLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 017BEB372360C6AC0024EF95 /* RadioButtonLabel.swift */; }; + 017BEB3C2361EA1D0024EF95 /* MFViewController+Model.swift in Sources */ = {isa = PBXBuildFile; fileRef = 017BEB3B2361EA1D0024EF95 /* MFViewController+Model.swift */; }; + 017BEB4023620A230024EF95 /* TextFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 017BEB3F23620A230024EF95 /* TextFieldModel.swift */; }; + 017BEB4223620AD20024EF95 /* FormModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 017BEB4123620AD20024EF95 /* FormModelProtocol.swift */; }; + 017BEB442362192F0024EF95 /* MVMCoreUIMoleculeMappingObject+ModelExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 017BEB432362192F0024EF95 /* MVMCoreUIMoleculeMappingObject+ModelExtension.swift */; }; + 017BEB48236230DB0024EF95 /* MoleculeViewProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 017BEB47236230DB0024EF95 /* MoleculeViewProtocol.swift */; }; + 017BEB4A236235BA0024EF95 /* ModelMoleculeViewProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 017BEB49236235BA0024EF95 /* ModelMoleculeViewProtocol.swift */; }; + 017BEB7B236763000024EF95 /* LineModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 017BEB7A236763000024EF95 /* LineModel.swift */; }; + 017BEB7F23676E870024EF95 /* MoleculeObjectMapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = 017BEB7E23676E870024EF95 /* MoleculeObjectMapping.swift */; }; + 0198F79F225679880066C936 /* FormValidationProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0198F79E225679870066C936 /* FormValidationProtocol.swift */; }; + 0198F7A62256A80B0066C936 /* MFRadioButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 0198F7A02256A80A0066C936 /* MFRadioButton.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0198F7A82256A80B0066C936 /* MFRadioButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 0198F7A22256A80A0066C936 /* MFRadioButton.m */; }; + 01C851D323CF9E740021F976 /* LabelToggleModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01C851D223CF9E740021F976 /* LabelToggleModel.swift */; }; + 01E569D3223FFFA500327251 /* ThreeLayerViewController.swift in Headers */ = {isa = PBXBuildFile; fileRef = D2A5146A2214905000345BFB /* ThreeLayerViewController.swift */; settings = {ATTRIBUTES = (Public, ); }; }; + 01EB3684236097C0006832FA /* MoleculeModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01EB3683236097C0006832FA /* MoleculeModelProtocol.swift */; }; + 01EB368F23609801006832FA /* LabelModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01EB368823609801006832FA /* LabelModel.swift */; }; + 01EB369023609801006832FA /* ListItemModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01EB368923609801006832FA /* ListItemModel.swift */; }; + 01EB369223609801006832FA /* MoleculeStackModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01EB368B23609801006832FA /* MoleculeStackModel.swift */; }; + 01EB369323609801006832FA /* HeaderModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01EB368C23609801006832FA /* HeaderModel.swift */; }; + 01EB369423609801006832FA /* HeadlineBodyModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01EB368D23609801006832FA /* HeadlineBodyModel.swift */; }; + 01F2A03223A4498200D954D8 /* CaretLinkModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01F2A03123A4498200D954D8 /* CaretLinkModel.swift */; }; + 0A1214A022C11A18007C7030 /* ActionDetailWithImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A12149F22C11A17007C7030 /* ActionDetailWithImage.swift */; }; + 0A14F69323E349EF00EDF7F7 /* CarouselIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A14F69223E349EF00EDF7F7 /* CarouselIndicator.swift */; }; + 0A14F6A523E4803A00EDF7F7 /* StackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A14F6A423E4803A00EDF7F7 /* StackView.swift */; }; + 0A14F6A923E8750300EDF7F7 /* CarouselIndicatorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A14F6A823E8750300EDF7F7 /* CarouselIndicatorModel.swift */; }; + 0A14F6B223E8C28D00EDF7F7 /* BarsIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A14F6B123E8C28D00EDF7F7 /* BarsIndicatorView.swift */; }; + 0A14F6B423E8C29700EDF7F7 /* NumericIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A14F6B323E8C29700EDF7F7 /* NumericIndicatorView.swift */; }; + 0A1B4A96233BB18F005B3FB4 /* CheckboxLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7BAFA2232BE63400FB8E22 /* CheckboxLabel.swift */; }; + 0A21DB7F235DECC500C160A2 /* EntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A21DB7E235DECC500C160A2 /* EntryField.swift */; }; + 0A21DB83235DFBC500C160A2 /* MdnEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A21DB82235DFBC500C160A2 /* MdnEntryField.swift */; }; + 0A21DB84235E06EF00C160A2 /* MFTextField.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF24C21E6A177003B2FB9 /* MFTextField.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0A21DB85235E06EF00C160A2 /* MFTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF24221E6A176003B2FB9 /* MFTextField.m */; }; + 0A21DB86235E06EF00C160A2 /* MFTextField.xib in Resources */ = {isa = PBXBuildFile; fileRef = D29DF24421E6A176003B2FB9 /* MFTextField.xib */; }; + 0A21DB87235E06EF00C160A2 /* MFTextFieldSubclassExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF24B21E6A177003B2FB9 /* MFTextFieldSubclassExtension.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0A21DB88235E06EF00C160A2 /* MFMdnTextField.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF24721E6A176003B2FB9 /* MFMdnTextField.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0A21DB89235E06EF00C160A2 /* MFMdnTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF24921E6A177003B2FB9 /* MFMdnTextField.m */; }; + 0A21DB8A235E06EF00C160A2 /* MFDigitTextBox.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF24521E6A176003B2FB9 /* MFDigitTextBox.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0A21DB8B235E06EF00C160A2 /* MFDigitTextBox.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF24621E6A176003B2FB9 /* MFDigitTextBox.m */; }; + 0A21DB8C235E06EF00C160A2 /* MFDigitTextField.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF24321E6A176003B2FB9 /* MFDigitTextField.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0A21DB8D235E06EF00C160A2 /* MFDigitTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF24821E6A177003B2FB9 /* MFDigitTextField.m */; }; + 0A21DB8E235E06EF00C160A2 /* MFDigitTextField.xib in Resources */ = {isa = PBXBuildFile; fileRef = D29DF24A21E6A177003B2FB9 /* MFDigitTextField.xib */; }; + 0A21DB91235E0EDB00C160A2 /* DigitBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A8321AE2355FE9500CB7F00 /* DigitBox.swift */; }; + 0A21DB94235E24ED00C160A2 /* DigitEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A21DB93235E24ED00C160A2 /* DigitEntryField.swift */; }; + 0A41BA6E2344FCD400D4C0BC /* CATransaction+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A41BA6D2344FCD400D4C0BC /* CATransaction+Extension.swift */; }; + 0A41BA7F23453A6400D4C0BC /* TextEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A41BA7E23453A6400D4C0BC /* TextEntryField.swift */; }; + 0A5D59C223AD2F5700EFD9E9 /* AppleGuidelinesProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A5D59C123AD2F5700EFD9E9 /* AppleGuidelinesProtocol.swift */; }; + 0A6BF4722360C56C0028F841 /* BaseDropdownEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A6BF4712360C56C0028F841 /* BaseDropdownEntryField.swift */; }; + 0A7BAD74232A8DC700FB8E22 /* HeadlineBodyButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7BAD73232A8DC700FB8E22 /* HeadlineBodyButton.swift */; }; + 0A7BAFA1232BE61800FB8E22 /* Checkbox.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7BAFA0232BE61800FB8E22 /* Checkbox.swift */; }; + 0A7EF85B23D8A52800B2AAD1 /* EntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF85A23D8A52800B2AAD1 /* EntryFieldModel.swift */; }; + 0A7EF85D23D8A95600B2AAD1 /* TextEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF85C23D8A95600B2AAD1 /* TextEntryFieldModel.swift */; }; + 0A7EF85F23D8ABC500B2AAD1 /* MdnEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF85E23D8ABC500B2AAD1 /* MdnEntryFieldModel.swift */; }; + 0A7EF86123D8AC2500B2AAD1 /* DigitEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF86023D8AC2500B2AAD1 /* DigitEntryFieldModel.swift */; }; + 0A7EF86323D8AFA000B2AAD1 /* BaseDropdownEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF86223D8AFA000B2AAD1 /* BaseDropdownEntryFieldModel.swift */; }; + 0A7EF86523D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF86423D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift */; }; + 0A7EF86723D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF86623D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift */; }; + 0AA33B3A2398524F0067DD0F /* Toggle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AA33B392398524F0067DD0F /* Toggle.swift */; }; + 0ABD136D237CAD1E0081388D /* DateDropdownEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ABD136C237CAD1E0081388D /* DateDropdownEntryField.swift */; }; + 0ABD1371237DB0450081388D /* ItemDropdownEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ABD1370237DB0450081388D /* ItemDropdownEntryField.swift */; }; + 0AE14F64238315D2005417F8 /* TextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AE14F63238315D2005417F8 /* TextField.swift */; }; + 31BE15CB23D8924D00452370 /* CheckboxLabelModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31BE15C923D8924C00452370 /* CheckboxLabelModel.swift */; }; + 31BE15CC23D8924D00452370 /* CheckboxModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31BE15CA23D8924C00452370 /* CheckboxModel.swift */; }; + 9432A79F23DB47BA00719041 /* EntryFieldContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9432A79E23DB47BA00719041 /* EntryFieldContainer.swift */; }; + 943784F5236B77BB006A1E82 /* GraphView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 943784F3236B77BB006A1E82 /* GraphView.swift */; }; + 943784F6236B77BB006A1E82 /* GraphViewAnimationHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 943784F4236B77BB006A1E82 /* GraphViewAnimationHandler.swift */; }; + 9445890C2385BCE300DE9FD4 /* ProgressBarModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9445890B2385BCE300DE9FD4 /* ProgressBarModel.swift */; }; + 9445890E2385C3F800DE9FD4 /* MultiProgressModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9445890D2385C3F800DE9FD4 /* MultiProgressModel.swift */; }; + 9445891F2385D2E900DE9FD4 /* CaretViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9445891E2385D2E900DE9FD4 /* CaretViewModel.swift */; }; + 944589212385D6E900DE9FD4 /* DashLineModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 944589202385D6E900DE9FD4 /* DashLineModel.swift */; }; + 944589232385DA9600DE9FD4 /* ImageViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 944589222385DA9500DE9FD4 /* ImageViewModel.swift */; }; + 9455B19C234F8A0400A574DB /* MVMAnimationFramework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9455B19B234F8A0400A574DB /* MVMAnimationFramework.framework */; }; + 946EE1BA237B66D80036751F /* MoleculeModelHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 946EE1B9237B66D80036751F /* MoleculeModelHelper.swift */; }; + 948DB67E2326DCD90011F916 /* MultiProgress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 948DB67D2326DCD90011F916 /* MultiProgress.swift */; }; + 94AF4A3E23E9D13900676048 /* MFCaretButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 94AF4A3C23E9D13900676048 /* MFCaretButton.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 94AF4A3F23E9D13900676048 /* MFCaretButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 94AF4A3D23E9D13900676048 /* MFCaretButton.m */; }; + 94AF4A4223E9D19E00676048 /* MFCaretView.h in Headers */ = {isa = PBXBuildFile; fileRef = 94AF4A4023E9D19E00676048 /* MFCaretView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 94AF4A4323E9D19E00676048 /* MFCaretView.m in Sources */ = {isa = PBXBuildFile; fileRef = 94AF4A4123E9D19E00676048 /* MFCaretView.m */; }; + 94C2D9842386F3F80006CF46 /* LabelAttributeModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94C2D9832386F3F80006CF46 /* LabelAttributeModel.swift */; }; + 94C2D9A123872BCC0006CF46 /* LabelAttributeUnderlineModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94C2D9A023872BCC0006CF46 /* LabelAttributeUnderlineModel.swift */; }; + 94C2D9A323872C110006CF46 /* LabelAttributeStrikeThroughModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94C2D9A223872C110006CF46 /* LabelAttributeStrikeThroughModel.swift */; }; + 94C2D9A523872C350006CF46 /* LabelAttributeFontModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94C2D9A423872C350006CF46 /* LabelAttributeFontModel.swift */; }; + 94C2D9A723872DA90006CF46 /* LabelAttributeColorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94C2D9A623872DA90006CF46 /* LabelAttributeColorModel.swift */; }; + 94C2D9A923872E5E0006CF46 /* LabelAttributeImageModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94C2D9A823872E5E0006CF46 /* LabelAttributeImageModel.swift */; }; + 94C2D9AB23872EB50006CF46 /* LabelAttributeActionModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94C2D9AA23872EB50006CF46 /* LabelAttributeActionModel.swift */; }; + 94C661D923CCF4B400D9FE5B /* LeftRightLabelModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9402C34F23A2CEA3004B974C /* LeftRightLabelModel.swift */; }; + 94C661DA23CCF4FB00D9FE5B /* UIColor+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AA33B33239813C50067DD0F /* UIColor+Extension.swift */; }; + 94F217B623E0BF6100A47C06 /* PrimaryButtonView.h in Headers */ = {isa = PBXBuildFile; fileRef = 94F217B423E0BF6100A47C06 /* PrimaryButtonView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 94F217B723E0BF6100A47C06 /* PrimaryButtonView.m in Sources */ = {isa = PBXBuildFile; fileRef = 94F217B523E0BF6100A47C06 /* PrimaryButtonView.m */; }; + 94FB966223D797DA003D482B /* MFTextButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 94FB966023D797DA003D482B /* MFTextButton.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 94FB966323D797DA003D482B /* MFTextButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 94FB966123D797DA003D482B /* MFTextButton.m */; }; + C003506123AA94CD00B6AC29 /* Button.swift in Sources */ = {isa = PBXBuildFile; fileRef = C003506023AA94CD00B6AC29 /* Button.swift */; }; + C07065C42395677300FBF997 /* Link.swift in Sources */ = {isa = PBXBuildFile; fileRef = C07065C32395677300FBF997 /* Link.swift */; }; + C695A67F23C9830600BFB94E /* UnOrderedListModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C695A67E23C9830600BFB94E /* UnOrderedListModel.swift */; }; + C695A68123C9830D00BFB94E /* NumberedListModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C695A68023C9830D00BFB94E /* NumberedListModel.swift */; }; + C695A69423C9909000BFB94E /* DoughnutChartModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C695A69323C9909000BFB94E /* DoughnutChartModel.swift */; }; + C695A69623C990BC00BFB94E /* DoughnutChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = C695A69523C990BC00BFB94E /* DoughnutChart.swift */; }; + C695A69823C990C200BFB94E /* DoughnutChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C695A69723C990C200BFB94E /* DoughnutChartView.swift */; }; + C6FA7D5223C77A4A00A3614A /* UnOrderedList.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6FA7D4F23C77A4700A3614A /* UnOrderedList.swift */; }; + C6FA7D5323C77A4A00A3614A /* StringAndMoleculeStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6FA7D5023C77A4800A3614A /* StringAndMoleculeStack.swift */; }; + C6FA7D5423C77A4A00A3614A /* NumberedList.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6FA7D5123C77A4900A3614A /* NumberedList.swift */; }; + C7192E7D23C301750050C2A0 /* HeadLineBodyCaretLinkImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7192E7C23C301750050C2A0 /* HeadLineBodyCaretLinkImage.swift */; }; + D20A9A5E2243D3E300ADE781 /* TwoButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20A9A5D2243D3E300ADE781 /* TwoButtonView.swift */; }; + D213347723843825008E41B3 /* Line.swift in Sources */ = {isa = PBXBuildFile; fileRef = D213347623843825008E41B3 /* Line.swift */; }; + D21EE53C23AD3AD4003D1A30 /* NSLayoutConstraintAxis+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = D21EE53B23AD3AD4003D1A30 /* NSLayoutConstraintAxis+Extension.swift */; }; + D224798A2314445E003FCCF9 /* LabelToggle.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22479892314445E003FCCF9 /* LabelToggle.swift */; }; + D224798C231450C8003FCCF9 /* HeadlineBodyToggle.swift in Sources */ = {isa = PBXBuildFile; fileRef = D224798B231450C8003FCCF9 /* HeadlineBodyToggle.swift */; }; + D22479942316AE5E003FCCF9 /* NSLayoutConstraintExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22479932316AE5E003FCCF9 /* NSLayoutConstraintExtension.swift */; }; + D22479962316AF6E003FCCF9 /* HeadlineBodyLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22479952316AF6D003FCCF9 /* HeadlineBodyLink.swift */; }; + D224799B231965AD003FCCF9 /* AccordionMoleculeTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D224799A231965AD003FCCF9 /* AccordionMoleculeTableViewCell.swift */; }; + D22D1F1A220341F60077CEC0 /* MVMCoreUICheckBox.h in Headers */ = {isa = PBXBuildFile; fileRef = D22D1F18220341F50077CEC0 /* MVMCoreUICheckBox.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D22D1F1B220341F60077CEC0 /* MVMCoreUICheckBox.m in Sources */ = {isa = PBXBuildFile; fileRef = D22D1F19220341F50077CEC0 /* MVMCoreUICheckBox.m */; }; + D22D1F1E220343560077CEC0 /* MVMCoreUICheckMarkView.h in Headers */ = {isa = PBXBuildFile; fileRef = D22D1F1C220343560077CEC0 /* MVMCoreUICheckMarkView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D22D1F1F220343560077CEC0 /* MVMCoreUICheckMarkView.m in Sources */ = {isa = PBXBuildFile; fileRef = D22D1F1D220343560077CEC0 /* MVMCoreUICheckMarkView.m */; }; + D22D1F46220496A30077CEC0 /* MVMCoreUISwitch.h in Headers */ = {isa = PBXBuildFile; fileRef = D22D1F44220496A30077CEC0 /* MVMCoreUISwitch.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D22D1F47220496A30077CEC0 /* MVMCoreUISwitch.m in Sources */ = {isa = PBXBuildFile; fileRef = D22D1F45220496A30077CEC0 /* MVMCoreUISwitch.m */; }; + D22D1F562204CE5D0077CEC0 /* MVMCoreUIStackableViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = D22D1F542204CE5D0077CEC0 /* MVMCoreUIStackableViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D22D1F572204CE5D0077CEC0 /* MVMCoreUIStackableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D22D1F552204CE5D0077CEC0 /* MVMCoreUIStackableViewController.m */; }; + D243859923A16B1800332775 /* Container.swift in Sources */ = {isa = PBXBuildFile; fileRef = D243859823A16B1800332775 /* Container.swift */; }; + D260105323CEA61600764D80 /* ToggleModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D260105223CEA61600764D80 /* ToggleModel.swift */; }; + D260105523CEA7DC00764D80 /* MVMCoreUISwitch+Model.swift in Sources */ = {isa = PBXBuildFile; fileRef = D260105423CEA7DC00764D80 /* MVMCoreUISwitch+Model.swift */; }; + D260105923D0A92900764D80 /* ContainerProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D260105823D0A92900764D80 /* ContainerProtocol.swift */; }; + D260105B23D0BB7100764D80 /* StackModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D260105A23D0BB7100764D80 /* StackModelProtocol.swift */; }; + D260105D23D0BCD400764D80 /* Stack.swift in Sources */ = {isa = PBXBuildFile; fileRef = D260105C23D0BCD400764D80 /* Stack.swift */; }; + D260105F23D0BFFC00764D80 /* StackItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D260105E23D0BFFC00764D80 /* StackItem.swift */; }; + D260106123D0C02A00764D80 /* StackItemModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D260106023D0C02A00764D80 /* StackItemModelProtocol.swift */; }; + D260106323D0C05000764D80 /* StackItemModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D260106223D0C05000764D80 /* StackItemModel.swift */; }; + D260106523D0CEA700764D80 /* StackModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D260106423D0CEA700764D80 /* StackModel.swift */; }; + D260D7B122D65BDD007E7233 /* MVMCoreUIPageControl.h in Headers */ = {isa = PBXBuildFile; fileRef = D260D7AF22D65BDD007E7233 /* MVMCoreUIPageControl.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D260D7B222D65BDD007E7233 /* MVMCoreUIPageControl.m in Sources */ = {isa = PBXBuildFile; fileRef = D260D7B022D65BDD007E7233 /* MVMCoreUIPageControl.m */; }; + D260D7B622D68514007E7233 /* MVMCoreUIPagingProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = D260D7B522D68509007E7233 /* MVMCoreUIPagingProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D268C70C2386DFFD007F2C1C /* MoleculeStackItemModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01EB368A23609801006832FA /* MoleculeStackItemModel.swift */; }; + D268C70E238C22D7007F2C1C /* DropDownFilterTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D268C70D238C22D7007F2C1C /* DropDownFilterTableViewCell.swift */; }; + D274CA332236A78900B01B62 /* FooterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D274CA322236A78900B01B62 /* FooterView.swift */; }; + D2755D7B23689C7500485468 /* TableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2755D7A23689C7500485468 /* TableViewCell.swift */; }; + D27CD40E2322EEAF00C1DC07 /* TabsTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D27CD40D2322EEAF00C1DC07 /* TabsTableViewCell.swift */; }; + D27CD4102339057800C1DC07 /* EyebrowHeadlineBodyLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = D27CD40F2339057800C1DC07 /* EyebrowHeadlineBodyLink.swift */; }; + D282AAB4223FDDAE00C46919 /* MFLoadImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D282AAB3223FDDAE00C46919 /* MFLoadImageView.swift */; }; + D282AABA224131D100C46919 /* MFTransparentGIFView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D282AAB9224131D100C46919 /* MFTransparentGIFView.swift */; }; + D282AACB2243C61700C46919 /* ButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D282AACA2243C61700C46919 /* ButtonView.swift */; }; + D28A837723C79FC600DFE4FC /* MFCustomButton+ActionModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28A837623C79FC600DFE4FC /* MFCustomButton+ActionModel.swift */; }; + D28A837923C7D5BC00DFE4FC /* PageModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28A837823C7D5BC00DFE4FC /* PageModelProtocol.swift */; }; + D28A837B23C928DA00DFE4FC /* MoleculeListCellProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28A837A23C928DA00DFE4FC /* MoleculeListCellProtocol.swift */; }; + D28A837D23CCA86A00DFE4FC /* TabsListItemModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28A837C23CCA86A00DFE4FC /* TabsListItemModel.swift */; }; + D28A837F23CCA96400DFE4FC /* TabsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28A837E23CCA96400DFE4FC /* TabsModel.swift */; }; + D28A838123CCB0D800DFE4FC /* AccordionListItemModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28A838023CCB0D800DFE4FC /* AccordionListItemModel.swift */; }; + D28A838323CCBD3F00DFE4FC /* CircleProgressModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28A838223CCBD3F00DFE4FC /* CircleProgressModel.swift */; }; + D28A838523CCCA8900DFE4FC /* ScrollerModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28A838423CCCA8900DFE4FC /* ScrollerModel.swift */; }; + D28A838923CCCFCB00DFE4FC /* LinkModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28A838823CCCFCB00DFE4FC /* LinkModel.swift */; }; + D28A838B23CCDA6B00DFE4FC /* ButtonModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28A838A23CCDA6B00DFE4FC /* ButtonModel.swift */; }; + D28A838D23CCDCC200DFE4FC /* PrimaryButton+MoleculeProtocolExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28A838C23CCDCC200DFE4FC /* PrimaryButton+MoleculeProtocolExtension.swift */; }; + D28A838F23CCDEDE00DFE4FC /* TwoButtonViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28A838E23CCDEDE00DFE4FC /* TwoButtonViewModel.swift */; }; + D28A839123CD4FD400DFE4FC /* CornerLabelsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28A839023CD4FD400DFE4FC /* CornerLabelsModel.swift */; }; + D28A839323CE828900DFE4FC /* HeadlineBodyCaretLinkImageModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28A839223CE828900DFE4FC /* HeadlineBodyCaretLinkImageModel.swift */; }; + D296E14722A5984C0051EBE7 /* MVMCoreUIViewConstrainingProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = D296E14622A597490051EBE7 /* MVMCoreUIViewConstrainingProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29770C821F7C4AE00B2F0D0 /* TopLabelsView.m in Sources */ = {isa = PBXBuildFile; fileRef = D29770C621F7C4AE00B2F0D0 /* TopLabelsView.m */; }; + D29770C921F7C4AE00B2F0D0 /* TopLabelsView.h in Headers */ = {isa = PBXBuildFile; fileRef = D29770C721F7C4AE00B2F0D0 /* TopLabelsView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29770F221F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D29770EE21F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsTableViewController.m */; }; + D29770F321F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsTableViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = D29770EF21F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsTableViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29770F421F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = D29770F021F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29770F521F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D29770F121F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsViewController.m */; }; + D29770FC21F7C77400B2F0D0 /* MVMCoreUITextFieldView.m in Sources */ = {isa = PBXBuildFile; fileRef = D29770FA21F7C77400B2F0D0 /* MVMCoreUITextFieldView.m */; }; + D29770FD21F7C77400B2F0D0 /* MVMCoreUITextFieldView.h in Headers */ = {isa = PBXBuildFile; fileRef = D29770FB21F7C77400B2F0D0 /* MVMCoreUITextFieldView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29B771022C281F400D6ACE0 /* ModuleMolecule.swift in Sources */ = {isa = PBXBuildFile; fileRef = D29B770F22C281F400D6ACE0 /* ModuleMolecule.swift */; }; + D29DF0D121E404D4003B2FB9 /* MVMCoreUI.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF0CF21E404D4003B2FB9 /* MVMCoreUI.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF0E621E4F3C7003B2FB9 /* MVMCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D29DF0E521E4F3C7003B2FB9 /* MVMCore.framework */; }; + D29DF11521E6805F003B2FB9 /* UIColor+MFConvenience.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF11121E6805F003B2FB9 /* UIColor+MFConvenience.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF11621E6805F003B2FB9 /* NSLayoutConstraint+MFConvenience.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF11221E6805F003B2FB9 /* NSLayoutConstraint+MFConvenience.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF11721E6805F003B2FB9 /* UIColor+MFConvenience.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF11321E6805F003B2FB9 /* UIColor+MFConvenience.m */; }; + D29DF11821E6805F003B2FB9 /* NSLayoutConstraint+MFConvenience.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF11421E6805F003B2FB9 /* NSLayoutConstraint+MFConvenience.m */; }; + D29DF11C21E684A9003B2FB9 /* MVMCoreUISplitViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF11A21E684A9003B2FB9 /* MVMCoreUISplitViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF11D21E684A9003B2FB9 /* MVMCoreUISplitViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF11B21E684A9003B2FB9 /* MVMCoreUISplitViewController.m */; }; + D29DF12921E6851E003B2FB9 /* MVMCoreUITopAlertMainView.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF11F21E6851E003B2FB9 /* MVMCoreUITopAlertMainView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF12A21E6851E003B2FB9 /* MVMCoreUITopAlertView.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF12021E6851E003B2FB9 /* MVMCoreUITopAlertView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF12B21E6851E003B2FB9 /* MVMCoreUITopAlertExpandableView.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF12121E6851E003B2FB9 /* MVMCoreUITopAlertExpandableView.m */; }; + D29DF12C21E6851E003B2FB9 /* MVMCoreUITopAlertShortView.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF12221E6851E003B2FB9 /* MVMCoreUITopAlertShortView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF12D21E6851E003B2FB9 /* MVMCoreUITopAlertBaseView.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF12321E6851E003B2FB9 /* MVMCoreUITopAlertBaseView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF12E21E6851E003B2FB9 /* MVMCoreUITopAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF12421E6851E003B2FB9 /* MVMCoreUITopAlertView.m */; }; + D29DF12F21E6851E003B2FB9 /* MVMCoreUITopAlertMainView.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF12521E6851E003B2FB9 /* MVMCoreUITopAlertMainView.m */; }; + D29DF13021E6851E003B2FB9 /* MVMCoreUITopAlertShortView.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF12621E6851E003B2FB9 /* MVMCoreUITopAlertShortView.m */; }; + D29DF13121E6851E003B2FB9 /* MVMCoreUITopAlertExpandableView.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF12721E6851E003B2FB9 /* MVMCoreUITopAlertExpandableView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF13221E6851E003B2FB9 /* MVMCoreUITopAlertBaseView.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF12821E6851E003B2FB9 /* MVMCoreUITopAlertBaseView.m */; }; + D29DF15421E69760003B2FB9 /* MVMCoreUIPanelButtonProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF15321E69760003B2FB9 /* MVMCoreUIPanelButtonProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF16121E69996003B2FB9 /* MFViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF15F21E69996003B2FB9 /* MFViewController.m */; }; + D29DF16221E69996003B2FB9 /* MFViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF16021E69996003B2FB9 /* MFViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF17421E69E1F003B2FB9 /* MFCustomButton.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF16A21E69E1F003B2FB9 /* MFCustomButton.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF17521E69E1F003B2FB9 /* ButtonDelegateProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF16B21E69E1F003B2FB9 /* ButtonDelegateProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF17621E69E1F003B2FB9 /* PrimaryButton.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF16C21E69E1F003B2FB9 /* PrimaryButton.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF17A21E69E1F003B2FB9 /* MFCustomButton.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF17021E69E1F003B2FB9 /* MFCustomButton.m */; }; + D29DF17B21E69E1F003B2FB9 /* PrimaryButton.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF17121E69E1F003B2FB9 /* PrimaryButton.m */; }; + D29DF18021E69E49003B2FB9 /* MFView.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF17E21E69E2E003B2FB9 /* MFView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF18121E69E50003B2FB9 /* MFView.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF17F21E69E2E003B2FB9 /* MFView.m */; }; + D29DF18221E69E54003B2FB9 /* SeparatorView.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF15921E697DA003B2FB9 /* SeparatorView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF18321E69E54003B2FB9 /* SeparatorView.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF15A21E697DA003B2FB9 /* SeparatorView.m */; }; + D29DF25921E6A22D003B2FB9 /* MFButtonProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF25821E6A22D003B2FB9 /* MFButtonProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF26C21E6AA0B003B2FB9 /* FLAnimatedImage.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF26821E6AA0B003B2FB9 /* FLAnimatedImage.m */; }; + D29DF26D21E6AA0B003B2FB9 /* FLAnimatedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF26921E6AA0B003B2FB9 /* FLAnimatedImageView.m */; }; + D29DF26E21E6AA0B003B2FB9 /* FLAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF26A21E6AA0B003B2FB9 /* FLAnimatedImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF26F21E6AA0B003B2FB9 /* FLAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF26B21E6AA0B003B2FB9 /* FLAnimatedImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF27521E79E81003B2FB9 /* MVMCoreUILoggingHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF27321E79E81003B2FB9 /* MVMCoreUILoggingHandler.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF27621E79E81003B2FB9 /* MVMCoreUILoggingHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF27421E79E81003B2FB9 /* MVMCoreUILoggingHandler.m */; }; + D29DF27921E7A533003B2FB9 /* MVMCoreUISession.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF27721E7A533003B2FB9 /* MVMCoreUISession.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF27A21E7A533003B2FB9 /* MVMCoreUISession.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF27821E7A533003B2FB9 /* MVMCoreUISession.m */; }; + D29DF28021E7AA51003B2FB9 /* MVMCoreUIDetailViewProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF27F21E7AA50003B2FB9 /* MVMCoreUIDetailViewProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF28321E7AB24003B2FB9 /* MVMCoreUICommonViewsUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF28121E7AB23003B2FB9 /* MVMCoreUICommonViewsUtility.m */; }; + D29DF28421E7AB24003B2FB9 /* MVMCoreUICommonViewsUtility.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF28221E7AB24003B2FB9 /* MVMCoreUICommonViewsUtility.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF28B21E7AC2B003B2FB9 /* ViewConstrainingView.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF28721E7AC2B003B2FB9 /* ViewConstrainingView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF28C21E7AC2B003B2FB9 /* ViewConstrainingView.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF28821E7AC2B003B2FB9 /* ViewConstrainingView.m */; }; + D29DF29521E7ADB8003B2FB9 /* ProgrammaticScrollViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF28D21E7ADB8003B2FB9 /* ProgrammaticScrollViewController.m */; }; + D29DF29621E7ADB8003B2FB9 /* StackableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF28E21E7ADB8003B2FB9 /* StackableViewController.m */; }; + D29DF29721E7ADB8003B2FB9 /* MFScrollingViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF28F21E7ADB8003B2FB9 /* MFScrollingViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF29821E7ADB8003B2FB9 /* MFScrollingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF29021E7ADB8003B2FB9 /* MFScrollingViewController.m */; }; + D29DF29921E7ADB8003B2FB9 /* ProgrammaticScrollViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF29121E7ADB8003B2FB9 /* ProgrammaticScrollViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF29A21E7ADB8003B2FB9 /* MFProgrammaticTableViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF29221E7ADB8003B2FB9 /* MFProgrammaticTableViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF29B21E7ADB9003B2FB9 /* StackableViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF29321E7ADB8003B2FB9 /* StackableViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF29C21E7ADB9003B2FB9 /* MFProgrammaticTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF29421E7ADB8003B2FB9 /* MFProgrammaticTableViewController.m */; }; + D29DF29D21E7AE38003B2FB9 /* MFStyler.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF13821E68636003B2FB9 /* MFStyler.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF29E21E7AE3B003B2FB9 /* MFStyler.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF13921E68637003B2FB9 /* MFStyler.m */; }; + D29DF2A121E7AF4E003B2FB9 /* MVMCoreUIUtility.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF29F21E7AF4E003B2FB9 /* MVMCoreUIUtility.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF2A221E7AF4E003B2FB9 /* MVMCoreUIUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF2A021E7AF4E003B2FB9 /* MVMCoreUIUtility.m */; }; + D29DF2A921E7B2F9003B2FB9 /* MVMCoreUIConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF2A721E7B2F9003B2FB9 /* MVMCoreUIConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF2AA21E7B2F9003B2FB9 /* MVMCoreUIConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF2A821E7B2F9003B2FB9 /* MVMCoreUIConstants.m */; }; + D29DF2AE21E7B3A4003B2FB9 /* MFTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF2AB21E7B3A4003B2FB9 /* MFTextView.m */; }; + D29DF2AF21E7B3A4003B2FB9 /* MFTextView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D29DF2AC21E7B3A4003B2FB9 /* MFTextView.xib */; }; + D29DF2B021E7B3A4003B2FB9 /* MFTextView.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF2AD21E7B3A4003B2FB9 /* MFTextView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF2B321E7B76D003B2FB9 /* MFLoadingSpinner.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF2B121E7B76C003B2FB9 /* MFLoadingSpinner.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF2B421E7B76D003B2FB9 /* MFLoadingSpinner.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF2B221E7B76D003B2FB9 /* MFLoadingSpinner.m */; }; + D29DF2BC21E7BEA4003B2FB9 /* TopTabbar.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF2B821E7BEA4003B2FB9 /* TopTabbar.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF2BD21E7BEA4003B2FB9 /* MVMCoreUITabBarPageControlViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF2B921E7BEA4003B2FB9 /* MVMCoreUITabBarPageControlViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF2BE21E7BEA4003B2FB9 /* TopTabbar.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF2BA21E7BEA4003B2FB9 /* TopTabbar.m */; }; + D29DF2BF21E7BEA4003B2FB9 /* MVMCoreUITabBarPageControlViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF2BB21E7BEA4003B2FB9 /* MVMCoreUITabBarPageControlViewController.m */; }; + D29DF2C421E7BF57003B2FB9 /* MFTabBarSwipeAnimator.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF2C021E7BF56003B2FB9 /* MFTabBarSwipeAnimator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF2C521E7BF57003B2FB9 /* MFTabBarSwipeAnimator.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF2C121E7BF57003B2FB9 /* MFTabBarSwipeAnimator.m */; }; + D29DF2C621E7BF57003B2FB9 /* MFTabBarInteractor.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF2C221E7BF57003B2FB9 /* MFTabBarInteractor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF2C721E7BF57003B2FB9 /* MFTabBarInteractor.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF2C321E7BF57003B2FB9 /* MFTabBarInteractor.m */; }; + D29DF2C821E7BFC1003B2FB9 /* MFSizeObject.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF14521E68728003B2FB9 /* MFSizeObject.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF2C921E7BFC6003B2FB9 /* MFSizeObject.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF14421E68728003B2FB9 /* MFSizeObject.m */; }; + D29DF2CA21E7BFC8003B2FB9 /* MFSizeThreshold.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF14621E68728003B2FB9 /* MFSizeThreshold.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF2CB21E7BFCC003B2FB9 /* MFSizeThreshold.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF14721E68728003B2FB9 /* MFSizeThreshold.m */; }; + D29DF2CE21E7C104003B2FB9 /* MFLoadingViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF2CC21E7C104003B2FB9 /* MFLoadingViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF2CF21E7C104003B2FB9 /* MFLoadingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF2CD21E7C104003B2FB9 /* MFLoadingViewController.m */; }; + D29DF2E121E9240B003B2FB9 /* MVMCoreUIPanelProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF2E021E9240B003B2FB9 /* MVMCoreUIPanelProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF2EE21ECEADF003B2FB9 /* MFFonts.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF14D21E693AD003B2FB9 /* MFFonts.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF2EF21ECEAE1003B2FB9 /* MFFonts.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF14C21E693AD003B2FB9 /* MFFonts.m */; }; + D29DF31A21ECECC0003B2FB9 /* NHaasGroteskDSStd-45Lt.otf in Resources */ = {isa = PBXBuildFile; fileRef = D29DF31621ECECC0003B2FB9 /* NHaasGroteskDSStd-45Lt.otf */; }; + D29DF31B21ECECC0003B2FB9 /* OCRAExtended.ttf in Resources */ = {isa = PBXBuildFile; fileRef = D29DF31721ECECC0003B2FB9 /* OCRAExtended.ttf */; }; + D29DF31C21ECECC0003B2FB9 /* NHaasGroteskDSStd-75Bd.otf in Resources */ = {isa = PBXBuildFile; fileRef = D29DF31821ECECC0003B2FB9 /* NHaasGroteskDSStd-75Bd.otf */; }; + D29DF31D21ECECC0003B2FB9 /* NHaasGroteskDSStd-55Rg.otf in Resources */ = {isa = PBXBuildFile; fileRef = D29DF31921ECECC0003B2FB9 /* NHaasGroteskDSStd-55Rg.otf */; }; + D29DF32021ED0CBA003B2FB9 /* LabelView.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF31E21ED0CBA003B2FB9 /* LabelView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF32121ED0CBA003B2FB9 /* LabelView.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF31F21ED0CBA003B2FB9 /* LabelView.m */; }; + D29DF32421ED0DA2003B2FB9 /* TextButtonView.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF32221ED0DA2003B2FB9 /* TextButtonView.m */; }; + D29DF32521ED0DA2003B2FB9 /* TextButtonView.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF32321ED0DA2003B2FB9 /* TextButtonView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D29DF32C21EE8736003B2FB9 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = D29DF32821EE8736003B2FB9 /* Localizable.strings */; }; + D29DF32E21EE8C3D003B2FB9 /* Media.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D29DF32D21EE8C3D003B2FB9 /* Media.xcassets */; }; + D29E28D823D21AB800ACEA85 /* StringAndMoleculeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D29E28D723D21AB800ACEA85 /* StringAndMoleculeView.swift */; }; + D29E28DA23D21AFA00ACEA85 /* StringAndMoleculeModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D29E28D923D21AFA00ACEA85 /* StringAndMoleculeModel.swift */; }; + D29E28DD23D7404C00ACEA85 /* ContainerHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = D29E28DC23D7404C00ACEA85 /* ContainerHelper.swift */; }; + D2A514582211C53C00345BFB /* MVMCoreUIMoleculeMappingObject.h in Headers */ = {isa = PBXBuildFile; fileRef = D2A514562211C53C00345BFB /* MVMCoreUIMoleculeMappingObject.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D2A514592211C53C00345BFB /* MVMCoreUIMoleculeMappingObject.m in Sources */ = {isa = PBXBuildFile; fileRef = D2A514572211C53C00345BFB /* MVMCoreUIMoleculeMappingObject.m */; }; + D2A5145D2211D22A00345BFB /* MVMCoreUIMoleculeViewProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = D2A5145C2211D22A00345BFB /* MVMCoreUIMoleculeViewProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D2A5145F2211DDC100345BFB /* MoleculeStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A5145E2211DDC100345BFB /* MoleculeStackView.swift */; }; + D2A5146122121FBF00345BFB /* MoleculeStackTemplate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A5146022121FBF00345BFB /* MoleculeStackTemplate.swift */; }; + D2A514632213643100345BFB /* MoleculeStackCenteredTemplate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A514622213643100345BFB /* MoleculeStackCenteredTemplate.swift */; }; + D2A514672213885800345BFB /* HeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A514662213885800345BFB /* HeaderView.swift */; }; + D2A5146B2214905000345BFB /* ThreeLayerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A5146A2214905000345BFB /* ThreeLayerViewController.swift */; }; + D2A638FD22CA98280052ED1F /* HeadlineBody.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A638FC22CA98280052ED1F /* HeadlineBody.swift */; }; + D2A6390122CBB1820052ED1F /* Carousel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A6390022CBB1820052ED1F /* Carousel.swift */; }; + D2A6390522CBCE160052ED1F /* MoleculeCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A6390422CBCE160052ED1F /* MoleculeCollectionViewCell.swift */; }; + D2B18B7F2360913400A9AEDC /* Control.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2B18B7E2360913400A9AEDC /* Control.swift */; }; + D2B18B812360945C00A9AEDC /* View.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2B18B802360945C00A9AEDC /* View.swift */; }; + D2B18B922361E65A00A9AEDC /* CoreUIObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2B18B912361E65A00A9AEDC /* CoreUIObject.swift */; }; + D2B18B94236214AD00A9AEDC /* NavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2B18B93236214AD00A9AEDC /* NavigationController.swift */; }; + D2B1E3E522F37D6A0065F95C /* ImageHeadlineBody.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2B1E3E422F37D6A0065F95C /* ImageHeadlineBody.swift */; }; + D2C5001821F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.h in Headers */ = {isa = PBXBuildFile; fileRef = D2C5001621F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D2C5001921F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.m in Sources */ = {isa = PBXBuildFile; fileRef = D2C5001721F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.m */; }; + D2D6CD4022E78C1A00D701B8 /* Scroller.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2D6CD3F22E78C1A00D701B8 /* Scroller.swift */; }; + D2D6CD4222E78FAB00D701B8 /* ThreeLayerTemplate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2D6CD4122E78FAB00D701B8 /* ThreeLayerTemplate.swift */; }; + D2E1FADB2260D3D200AEFD8C /* MVMCoreUIDelegateObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E1FADA2260D3D200AEFD8C /* MVMCoreUIDelegateObject.swift */; }; + D2E1FADF2268B8E700AEFD8C /* ThreeLayerTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E1FADE2268B8E700AEFD8C /* ThreeLayerTableViewController.swift */; }; + D2E1FAE12268E81D00AEFD8C /* MoleculeListTemplate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E1FAE02268E81D00AEFD8C /* MoleculeListTemplate.swift */; }; + D2E2A98323D8B32D000B42E6 /* EyebrowHeadlineBodyLinkModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E2A98223D8B32D000B42E6 /* EyebrowHeadlineBodyLinkModel.swift */; }; + D2E2A99423D8CCBC000B42E6 /* HeadlineBodyLinkModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E2A99323D8CCBC000B42E6 /* HeadlineBodyLinkModel.swift */; }; + D2E2A99623D8CF85000B42E6 /* HeadlineBodyLinkToggleModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E2A99523D8CF85000B42E6 /* HeadlineBodyLinkToggleModel.swift */; }; + D2E2A99823D8D63C000B42E6 /* ActionDetailWithImageModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E2A99723D8D63C000B42E6 /* ActionDetailWithImageModel.swift */; }; + D2E2A99A23D8D6B4000B42E6 /* HeadlineBodyButtonModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E2A99923D8D6B4000B42E6 /* HeadlineBodyButtonModel.swift */; }; + D2E2A99C23D8D975000B42E6 /* ImageHeadlineBodyModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E2A99B23D8D975000B42E6 /* ImageHeadlineBodyModel.swift */; }; + D2E2A99D23DA3217000B42E6 /* UIStackViewAlignment+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A209CD223A7E2810068F8B0 /* UIStackViewAlignment+Extension.swift */; }; + D2E2A99F23E07F8A000B42E6 /* PillButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E2A99E23E07F8A000B42E6 /* PillButton.swift */; }; + D2E2A9A123E095AB000B42E6 /* ButtonModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E2A9A023E095AB000B42E6 /* ButtonModelProtocol.swift */; }; + D2E2A9A323E096B1000B42E6 /* DisableableModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E2A9A223E096B1000B42E6 /* DisableableModelProtocol.swift */; }; + D2FB151B23A2B65B00C20E10 /* MoleculeContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2FB151A23A2B65B00C20E10 /* MoleculeContainer.swift */; }; + D2FB151D23A40F1500C20E10 /* MoleculeStackItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2FB151C23A40F1500C20E10 /* MoleculeStackItem.swift */; }; + DB06250B2293456500B72DD3 /* LeftRightLabelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB06250A2293456500B72DD3 /* LeftRightLabelView.swift */; }; + DBC4391822442197001AB423 /* CaretView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBC4391622442196001AB423 /* CaretView.swift */; }; + DBC4391922442197001AB423 /* DashLine.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBC4391722442197001AB423 /* DashLine.swift */; }; + DBC4391B224421A0001AB423 /* CaretLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBC4391A224421A0001AB423 /* CaretLink.swift */; }; + DBC4392122491730001AB423 /* LabelWithInternalButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBC4391C2245232D001AB423 /* LabelWithInternalButton.swift */; }; + DBEFFA04225A829700230692 /* Label.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB891E822253FA8500022516 /* Label.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 01004F2F22721C3800991ECC /* RadioButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadioButton.swift; sourceTree = ""; }; + 0103B84D23D7E33A009C315C /* HeadlineBodyToggleModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadlineBodyToggleModel.swift; sourceTree = ""; }; + 0105618A224BBE7700E1557D /* FormValidator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FormValidator.swift; sourceTree = ""; }; + 0105618B224BBE7700E1557D /* FormValidator+TextFields.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "FormValidator+TextFields.swift"; sourceTree = ""; }; + 0105618C224BBE7700E1557D /* FormValidator+FormParams.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "FormValidator+FormParams.swift"; sourceTree = ""; }; + 0116A4E4228B19640094F3ED /* RadioButtonModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadioButtonModel.swift; sourceTree = ""; }; + 011B58EF23A2AA980085F53C /* ListItemModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListItemModelProtocol.swift; sourceTree = ""; }; + 011B58F123A2AE2C0085F53C /* DropDownListItemModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DropDownListItemModel.swift; sourceTree = ""; }; + 012A889B23889E8400FE3DA1 /* TemplateModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TemplateModelProtocol.swift; sourceTree = ""; }; + 012A88AC238C418100FE3DA1 /* TemplateProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TemplateProtocol.swift; sourceTree = ""; }; + 012A88AE238C626E00FE3DA1 /* CarouselModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarouselModel.swift; sourceTree = ""; }; + 012A88B0238C880100FE3DA1 /* CarouselPagingModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarouselPagingModelProtocol.swift; sourceTree = ""; }; + 012A88C1238D7BCA00FE3DA1 /* CarouselItemModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarouselItemModel.swift; sourceTree = ""; }; + 012A88C3238D86E600FE3DA1 /* CarouselItemModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarouselItemModelProtocol.swift; sourceTree = ""; }; + 012A88C5238DA34000FE3DA1 /* ModuleMoleculeModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModuleMoleculeModel.swift; sourceTree = ""; }; + 012A88C7238DB02000FE3DA1 /* ModelMoleculeDelegateProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModelMoleculeDelegateProtocol.swift; sourceTree = ""; }; + 012A88EB238F084D00FE3DA1 /* FooterModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FooterModel.swift; sourceTree = ""; }; + 012A88F023985E0100FE3DA1 /* Color.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Color.swift; sourceTree = ""; }; + 012CA9992384A687003F810F /* MFTextField+ModelExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MFTextField+ModelExtension.swift"; sourceTree = ""; }; + 012CA99D2385A2D3003F810F /* MFView+ModelExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MFView+ModelExtension.swift"; sourceTree = ""; }; + 014AA72123C501E2006F3E93 /* MoleculeContainerModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MoleculeContainerModel.swift; sourceTree = ""; }; + 014AA72223C501E2006F3E93 /* ContainerModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContainerModel.swift; sourceTree = ""; }; + 014AA72323C501E2006F3E93 /* ContainerModelProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContainerModelProtocol.swift; sourceTree = ""; }; + 014AA72823C5059B006F3E93 /* StackPageTemplateModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StackPageTemplateModel.swift; sourceTree = ""; }; + 014AA72923C5059B006F3E93 /* StackCenteredPageTemplateModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StackCenteredPageTemplateModel.swift; sourceTree = ""; }; + 014AA72A23C5059B006F3E93 /* ThreeLayerPageTemplateModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThreeLayerPageTemplateModel.swift; sourceTree = ""; }; + 014AA72C23C5059B006F3E93 /* ListPageTemplateModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListPageTemplateModel.swift; sourceTree = ""; }; + 01509D8E2327EC6F00EF99AA /* MoleculeTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MoleculeTableViewCell.swift; sourceTree = ""; }; + 01509D902327ECE600EF99AA /* CornerLabels.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CornerLabels.swift; sourceTree = ""; }; + 01509D922327ECFB00EF99AA /* ProgressBar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProgressBar.swift; sourceTree = ""; }; + 01509D942327ED1900EF99AA /* HeadlineBodyLinkToggle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeadlineBodyLinkToggle.swift; sourceTree = ""; }; + 017BEB372360C6AC0024EF95 /* RadioButtonLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RadioButtonLabel.swift; sourceTree = ""; }; + 017BEB3B2361EA1D0024EF95 /* MFViewController+Model.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MFViewController+Model.swift"; sourceTree = ""; }; + 017BEB3F23620A230024EF95 /* TextFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextFieldModel.swift; sourceTree = ""; }; + 017BEB4123620AD20024EF95 /* FormModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FormModelProtocol.swift; sourceTree = ""; }; + 017BEB432362192F0024EF95 /* MVMCoreUIMoleculeMappingObject+ModelExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MVMCoreUIMoleculeMappingObject+ModelExtension.swift"; sourceTree = ""; }; + 017BEB47236230DB0024EF95 /* MoleculeViewProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoleculeViewProtocol.swift; sourceTree = ""; }; + 017BEB49236235BA0024EF95 /* ModelMoleculeViewProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModelMoleculeViewProtocol.swift; sourceTree = ""; }; + 017BEB7A236763000024EF95 /* LineModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LineModel.swift; sourceTree = ""; }; + 017BEB7E23676E870024EF95 /* MoleculeObjectMapping.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoleculeObjectMapping.swift; sourceTree = ""; }; + 0198F79E225679870066C936 /* FormValidationProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FormValidationProtocol.swift; sourceTree = ""; }; + 0198F7A02256A80A0066C936 /* MFRadioButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFRadioButton.h; sourceTree = ""; }; + 0198F7A22256A80A0066C936 /* MFRadioButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFRadioButton.m; sourceTree = ""; }; + 01C851D223CF9E740021F976 /* LabelToggleModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelToggleModel.swift; sourceTree = ""; }; + 01EB3683236097C0006832FA /* MoleculeModelProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MoleculeModelProtocol.swift; sourceTree = ""; }; + 01EB368823609801006832FA /* LabelModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LabelModel.swift; sourceTree = ""; }; + 01EB368923609801006832FA /* ListItemModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListItemModel.swift; sourceTree = ""; }; + 01EB368A23609801006832FA /* MoleculeStackItemModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MoleculeStackItemModel.swift; sourceTree = ""; }; + 01EB368B23609801006832FA /* MoleculeStackModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MoleculeStackModel.swift; sourceTree = ""; }; + 01EB368C23609801006832FA /* HeaderModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeaderModel.swift; sourceTree = ""; }; + 01EB368D23609801006832FA /* HeadlineBodyModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeadlineBodyModel.swift; sourceTree = ""; }; + 01F2A03123A4498200D954D8 /* CaretLinkModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaretLinkModel.swift; sourceTree = ""; }; + 0A12149F22C11A17007C7030 /* ActionDetailWithImage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActionDetailWithImage.swift; sourceTree = ""; }; + 0A14F69223E349EF00EDF7F7 /* CarouselIndicator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarouselIndicator.swift; sourceTree = ""; }; + 0A14F6A423E4803A00EDF7F7 /* StackView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StackView.swift; sourceTree = ""; }; + 0A14F6A823E8750300EDF7F7 /* CarouselIndicatorModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarouselIndicatorModel.swift; sourceTree = ""; }; + 0A14F6B123E8C28D00EDF7F7 /* BarsIndicatorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BarsIndicatorView.swift; sourceTree = ""; }; + 0A14F6B323E8C29700EDF7F7 /* NumericIndicatorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NumericIndicatorView.swift; sourceTree = ""; }; + 0A209CD223A7E2810068F8B0 /* UIStackViewAlignment+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIStackViewAlignment+Extension.swift"; sourceTree = ""; }; + 0A21DB7E235DECC500C160A2 /* EntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EntryField.swift; sourceTree = ""; }; + 0A21DB82235DFBC500C160A2 /* MdnEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MdnEntryField.swift; sourceTree = ""; }; + 0A21DB93235E24ED00C160A2 /* DigitEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DigitEntryField.swift; sourceTree = ""; }; + 0A41BA6D2344FCD400D4C0BC /* CATransaction+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CATransaction+Extension.swift"; sourceTree = ""; }; + 0A41BA7E23453A6400D4C0BC /* TextEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextEntryField.swift; sourceTree = ""; }; + 0A5D59C123AD2F5700EFD9E9 /* AppleGuidelinesProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppleGuidelinesProtocol.swift; sourceTree = ""; }; + 0A6BF4712360C56C0028F841 /* BaseDropdownEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseDropdownEntryField.swift; sourceTree = ""; }; + 0A7BAD73232A8DC700FB8E22 /* HeadlineBodyButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadlineBodyButton.swift; sourceTree = ""; }; + 0A7BAFA0232BE61800FB8E22 /* Checkbox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Checkbox.swift; sourceTree = ""; }; + 0A7BAFA2232BE63400FB8E22 /* CheckboxLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckboxLabel.swift; sourceTree = ""; }; + 0A7EF85A23D8A52800B2AAD1 /* EntryFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EntryFieldModel.swift; sourceTree = ""; }; + 0A7EF85C23D8A95600B2AAD1 /* TextEntryFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextEntryFieldModel.swift; sourceTree = ""; }; + 0A7EF85E23D8ABC500B2AAD1 /* MdnEntryFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MdnEntryFieldModel.swift; sourceTree = ""; }; + 0A7EF86023D8AC2500B2AAD1 /* DigitEntryFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DigitEntryFieldModel.swift; sourceTree = ""; }; + 0A7EF86223D8AFA000B2AAD1 /* BaseDropdownEntryFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseDropdownEntryFieldModel.swift; sourceTree = ""; }; + 0A7EF86423D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemDropdownEntryFieldModel.swift; sourceTree = ""; }; + 0A7EF86623D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateDropdownEntryFieldModel.swift; sourceTree = ""; }; + 0A8321AE2355FE9500CB7F00 /* DigitBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DigitBox.swift; sourceTree = ""; }; + 0AA33B33239813C50067DD0F /* UIColor+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+Extension.swift"; sourceTree = ""; }; + 0AA33B392398524F0067DD0F /* Toggle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Toggle.swift; sourceTree = ""; }; + 0ABD136C237CAD1E0081388D /* DateDropdownEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateDropdownEntryField.swift; sourceTree = ""; }; + 0ABD1370237DB0450081388D /* ItemDropdownEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemDropdownEntryField.swift; sourceTree = ""; }; + 0AE14F63238315D2005417F8 /* TextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextField.swift; sourceTree = ""; }; + 31BE15C923D8924C00452370 /* CheckboxLabelModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CheckboxLabelModel.swift; sourceTree = ""; }; + 31BE15CA23D8924C00452370 /* CheckboxModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CheckboxModel.swift; sourceTree = ""; }; + 9402C34F23A2CEA3004B974C /* LeftRightLabelModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LeftRightLabelModel.swift; sourceTree = ""; }; + 9432A79E23DB47BA00719041 /* EntryFieldContainer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EntryFieldContainer.swift; sourceTree = ""; }; + 943784F3236B77BB006A1E82 /* GraphView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphView.swift; sourceTree = ""; }; + 943784F4236B77BB006A1E82 /* GraphViewAnimationHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphViewAnimationHandler.swift; sourceTree = ""; }; + 9445890B2385BCE300DE9FD4 /* ProgressBarModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProgressBarModel.swift; sourceTree = ""; }; + 9445890D2385C3F800DE9FD4 /* MultiProgressModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultiProgressModel.swift; sourceTree = ""; }; + 9445891E2385D2E900DE9FD4 /* CaretViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaretViewModel.swift; sourceTree = ""; }; + 944589202385D6E900DE9FD4 /* DashLineModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DashLineModel.swift; sourceTree = ""; }; + 944589222385DA9500DE9FD4 /* ImageViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageViewModel.swift; sourceTree = ""; }; + 9455B19B234F8A0400A574DB /* MVMAnimationFramework.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MVMAnimationFramework.framework; path = ../SharedFrameworks/MVMAnimationFramework.framework; sourceTree = ""; }; + 946EE1B9237B66D80036751F /* MoleculeModelHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoleculeModelHelper.swift; sourceTree = ""; }; + 948DB67D2326DCD90011F916 /* MultiProgress.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultiProgress.swift; sourceTree = ""; }; + 94AF4A3C23E9D13900676048 /* MFCaretButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MFCaretButton.h; sourceTree = ""; }; + 94AF4A3D23E9D13900676048 /* MFCaretButton.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MFCaretButton.m; sourceTree = ""; }; + 94AF4A4023E9D19E00676048 /* MFCaretView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MFCaretView.h; sourceTree = ""; }; + 94AF4A4123E9D19E00676048 /* MFCaretView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MFCaretView.m; sourceTree = ""; }; + 94C2D9832386F3F80006CF46 /* LabelAttributeModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelAttributeModel.swift; sourceTree = ""; }; + 94C2D9A023872BCC0006CF46 /* LabelAttributeUnderlineModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelAttributeUnderlineModel.swift; sourceTree = ""; }; + 94C2D9A223872C110006CF46 /* LabelAttributeStrikeThroughModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelAttributeStrikeThroughModel.swift; sourceTree = ""; }; + 94C2D9A423872C350006CF46 /* LabelAttributeFontModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelAttributeFontModel.swift; sourceTree = ""; }; + 94C2D9A623872DA90006CF46 /* LabelAttributeColorModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelAttributeColorModel.swift; sourceTree = ""; }; + 94C2D9A823872E5E0006CF46 /* LabelAttributeImageModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelAttributeImageModel.swift; sourceTree = ""; }; + 94C2D9AA23872EB50006CF46 /* LabelAttributeActionModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelAttributeActionModel.swift; sourceTree = ""; }; + 94F217B423E0BF6100A47C06 /* PrimaryButtonView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PrimaryButtonView.h; sourceTree = ""; }; + 94F217B523E0BF6100A47C06 /* PrimaryButtonView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PrimaryButtonView.m; sourceTree = ""; }; + 94FB966023D797DA003D482B /* MFTextButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFTextButton.h; sourceTree = ""; }; + 94FB966123D797DA003D482B /* MFTextButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFTextButton.m; sourceTree = ""; }; + C003506023AA94CD00B6AC29 /* Button.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Button.swift; sourceTree = ""; }; + C07065C32395677300FBF997 /* Link.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Link.swift; sourceTree = ""; }; + C695A67E23C9830600BFB94E /* UnOrderedListModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UnOrderedListModel.swift; sourceTree = ""; }; + C695A68023C9830D00BFB94E /* NumberedListModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NumberedListModel.swift; sourceTree = ""; }; + C695A69323C9909000BFB94E /* DoughnutChartModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DoughnutChartModel.swift; sourceTree = ""; }; + C695A69523C990BC00BFB94E /* DoughnutChart.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DoughnutChart.swift; sourceTree = ""; }; + C695A69723C990C200BFB94E /* DoughnutChartView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DoughnutChartView.swift; sourceTree = ""; }; + C6FA7D4F23C77A4700A3614A /* UnOrderedList.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UnOrderedList.swift; sourceTree = ""; }; + C6FA7D5023C77A4800A3614A /* StringAndMoleculeStack.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StringAndMoleculeStack.swift; sourceTree = ""; }; + C6FA7D5123C77A4900A3614A /* NumberedList.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NumberedList.swift; sourceTree = ""; }; + C7192E7C23C301750050C2A0 /* HeadLineBodyCaretLinkImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadLineBodyCaretLinkImage.swift; sourceTree = ""; }; + D20A9A5D2243D3E300ADE781 /* TwoButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TwoButtonView.swift; sourceTree = ""; }; + D213347623843825008E41B3 /* Line.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Line.swift; sourceTree = ""; }; + D21EE53B23AD3AD4003D1A30 /* NSLayoutConstraintAxis+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSLayoutConstraintAxis+Extension.swift"; sourceTree = ""; }; + D22479892314445E003FCCF9 /* LabelToggle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelToggle.swift; sourceTree = ""; }; + D224798B231450C8003FCCF9 /* HeadlineBodyToggle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadlineBodyToggle.swift; sourceTree = ""; }; + D22479932316AE5E003FCCF9 /* NSLayoutConstraintExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSLayoutConstraintExtension.swift; sourceTree = ""; }; + D22479952316AF6D003FCCF9 /* HeadlineBodyLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadlineBodyLink.swift; sourceTree = ""; }; + D224799A231965AD003FCCF9 /* AccordionMoleculeTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccordionMoleculeTableViewCell.swift; sourceTree = ""; }; + D22D1F18220341F50077CEC0 /* MVMCoreUICheckBox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreUICheckBox.h; sourceTree = ""; }; + D22D1F19220341F50077CEC0 /* MVMCoreUICheckBox.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUICheckBox.m; sourceTree = ""; }; + D22D1F1C220343560077CEC0 /* MVMCoreUICheckMarkView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreUICheckMarkView.h; sourceTree = ""; }; + D22D1F1D220343560077CEC0 /* MVMCoreUICheckMarkView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUICheckMarkView.m; sourceTree = ""; }; + D22D1F44220496A30077CEC0 /* MVMCoreUISwitch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreUISwitch.h; sourceTree = ""; }; + D22D1F45220496A30077CEC0 /* MVMCoreUISwitch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUISwitch.m; sourceTree = ""; }; + D22D1F542204CE5D0077CEC0 /* MVMCoreUIStackableViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIStackableViewController.h; sourceTree = ""; }; + D22D1F552204CE5D0077CEC0 /* MVMCoreUIStackableViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUIStackableViewController.m; sourceTree = ""; }; + D243859823A16B1800332775 /* Container.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Container.swift; sourceTree = ""; }; + D260105223CEA61600764D80 /* ToggleModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToggleModel.swift; sourceTree = ""; }; + D260105423CEA7DC00764D80 /* MVMCoreUISwitch+Model.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MVMCoreUISwitch+Model.swift"; sourceTree = ""; }; + D260105823D0A92900764D80 /* ContainerProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContainerProtocol.swift; sourceTree = ""; }; + D260105A23D0BB7100764D80 /* StackModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StackModelProtocol.swift; sourceTree = ""; }; + D260105C23D0BCD400764D80 /* Stack.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Stack.swift; sourceTree = ""; }; + D260105E23D0BFFC00764D80 /* StackItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StackItem.swift; sourceTree = ""; }; + D260106023D0C02A00764D80 /* StackItemModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StackItemModelProtocol.swift; sourceTree = ""; }; + D260106223D0C05000764D80 /* StackItemModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StackItemModel.swift; sourceTree = ""; }; + D260106423D0CEA700764D80 /* StackModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StackModel.swift; sourceTree = ""; }; + D260D7AF22D65BDD007E7233 /* MVMCoreUIPageControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIPageControl.h; sourceTree = ""; }; + D260D7B022D65BDD007E7233 /* MVMCoreUIPageControl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUIPageControl.m; sourceTree = ""; }; + D260D7B522D68509007E7233 /* MVMCoreUIPagingProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIPagingProtocol.h; sourceTree = ""; }; + D268C70D238C22D7007F2C1C /* DropDownFilterTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DropDownFilterTableViewCell.swift; sourceTree = ""; }; + D274CA322236A78900B01B62 /* FooterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FooterView.swift; sourceTree = ""; }; + D2755D7A23689C7500485468 /* TableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableViewCell.swift; sourceTree = ""; }; + D27CD40D2322EEAF00C1DC07 /* TabsTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabsTableViewCell.swift; sourceTree = ""; }; + D27CD40F2339057800C1DC07 /* EyebrowHeadlineBodyLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EyebrowHeadlineBodyLink.swift; sourceTree = ""; }; + D282AAB3223FDDAE00C46919 /* MFLoadImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MFLoadImageView.swift; sourceTree = ""; }; + D282AAB9224131D100C46919 /* MFTransparentGIFView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MFTransparentGIFView.swift; sourceTree = ""; }; + D282AACA2243C61700C46919 /* ButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonView.swift; sourceTree = ""; }; + D28A837623C79FC600DFE4FC /* MFCustomButton+ActionModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MFCustomButton+ActionModel.swift"; sourceTree = ""; }; + D28A837823C7D5BC00DFE4FC /* PageModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PageModelProtocol.swift; sourceTree = ""; }; + D28A837A23C928DA00DFE4FC /* MoleculeListCellProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoleculeListCellProtocol.swift; sourceTree = ""; }; + D28A837C23CCA86A00DFE4FC /* TabsListItemModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabsListItemModel.swift; sourceTree = ""; }; + D28A837E23CCA96400DFE4FC /* TabsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabsModel.swift; sourceTree = ""; }; + D28A838023CCB0D800DFE4FC /* AccordionListItemModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccordionListItemModel.swift; sourceTree = ""; }; + D28A838223CCBD3F00DFE4FC /* CircleProgressModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CircleProgressModel.swift; sourceTree = ""; }; + D28A838423CCCA8900DFE4FC /* ScrollerModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScrollerModel.swift; sourceTree = ""; }; + D28A838823CCCFCB00DFE4FC /* LinkModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LinkModel.swift; sourceTree = ""; }; + D28A838A23CCDA6B00DFE4FC /* ButtonModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonModel.swift; sourceTree = ""; }; + D28A838C23CCDCC200DFE4FC /* PrimaryButton+MoleculeProtocolExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PrimaryButton+MoleculeProtocolExtension.swift"; sourceTree = ""; }; + D28A838E23CCDEDE00DFE4FC /* TwoButtonViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TwoButtonViewModel.swift; sourceTree = ""; }; + D28A839023CD4FD400DFE4FC /* CornerLabelsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CornerLabelsModel.swift; sourceTree = ""; }; + D28A839223CE828900DFE4FC /* HeadlineBodyCaretLinkImageModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadlineBodyCaretLinkImageModel.swift; sourceTree = ""; }; + D296E14622A597490051EBE7 /* MVMCoreUIViewConstrainingProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIViewConstrainingProtocol.h; sourceTree = ""; }; + D29770C621F7C4AE00B2F0D0 /* TopLabelsView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TopLabelsView.m; sourceTree = ""; }; + D29770C721F7C4AE00B2F0D0 /* TopLabelsView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TopLabelsView.h; sourceTree = ""; }; + D29770EE21F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TopLabelsAndBottomButtonsTableViewController.m; sourceTree = ""; }; + D29770EF21F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TopLabelsAndBottomButtonsTableViewController.h; sourceTree = ""; }; + D29770F021F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TopLabelsAndBottomButtonsViewController.h; sourceTree = ""; }; + D29770F121F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TopLabelsAndBottomButtonsViewController.m; sourceTree = ""; }; + D29770FA21F7C77400B2F0D0 /* MVMCoreUITextFieldView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUITextFieldView.m; sourceTree = ""; }; + D29770FB21F7C77400B2F0D0 /* MVMCoreUITextFieldView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreUITextFieldView.h; sourceTree = ""; }; + D29B770F22C281F400D6ACE0 /* ModuleMolecule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModuleMolecule.swift; sourceTree = ""; }; + D29DF0CC21E404D4003B2FB9 /* MVMCoreUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MVMCoreUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D29DF0CF21E404D4003B2FB9 /* MVMCoreUI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUI.h; sourceTree = ""; }; + D29DF0D021E404D4003B2FB9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + D29DF0E521E4F3C7003B2FB9 /* MVMCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = MVMCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D29DF11121E6805F003B2FB9 /* UIColor+MFConvenience.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIColor+MFConvenience.h"; sourceTree = ""; }; + D29DF11221E6805F003B2FB9 /* NSLayoutConstraint+MFConvenience.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSLayoutConstraint+MFConvenience.h"; sourceTree = ""; }; + D29DF11321E6805F003B2FB9 /* UIColor+MFConvenience.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIColor+MFConvenience.m"; sourceTree = ""; }; + D29DF11421E6805F003B2FB9 /* NSLayoutConstraint+MFConvenience.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSLayoutConstraint+MFConvenience.m"; sourceTree = ""; }; + D29DF11A21E684A9003B2FB9 /* MVMCoreUISplitViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreUISplitViewController.h; sourceTree = ""; }; + D29DF11B21E684A9003B2FB9 /* MVMCoreUISplitViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUISplitViewController.m; sourceTree = ""; }; + D29DF11F21E6851E003B2FB9 /* MVMCoreUITopAlertMainView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreUITopAlertMainView.h; sourceTree = ""; }; + D29DF12021E6851E003B2FB9 /* MVMCoreUITopAlertView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreUITopAlertView.h; sourceTree = ""; }; + D29DF12121E6851E003B2FB9 /* MVMCoreUITopAlertExpandableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUITopAlertExpandableView.m; sourceTree = ""; }; + D29DF12221E6851E003B2FB9 /* MVMCoreUITopAlertShortView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreUITopAlertShortView.h; sourceTree = ""; }; + D29DF12321E6851E003B2FB9 /* MVMCoreUITopAlertBaseView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreUITopAlertBaseView.h; sourceTree = ""; }; + D29DF12421E6851E003B2FB9 /* MVMCoreUITopAlertView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUITopAlertView.m; sourceTree = ""; }; + D29DF12521E6851E003B2FB9 /* MVMCoreUITopAlertMainView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUITopAlertMainView.m; sourceTree = ""; }; + D29DF12621E6851E003B2FB9 /* MVMCoreUITopAlertShortView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUITopAlertShortView.m; sourceTree = ""; }; + D29DF12721E6851E003B2FB9 /* MVMCoreUITopAlertExpandableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreUITopAlertExpandableView.h; sourceTree = ""; }; + D29DF12821E6851E003B2FB9 /* MVMCoreUITopAlertBaseView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUITopAlertBaseView.m; sourceTree = ""; }; + D29DF13821E68636003B2FB9 /* MFStyler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MFStyler.h; sourceTree = ""; }; + D29DF13921E68637003B2FB9 /* MFStyler.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MFStyler.m; sourceTree = ""; }; + D29DF14421E68728003B2FB9 /* MFSizeObject.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MFSizeObject.m; sourceTree = ""; }; + D29DF14521E68728003B2FB9 /* MFSizeObject.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MFSizeObject.h; sourceTree = ""; }; + D29DF14621E68728003B2FB9 /* MFSizeThreshold.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MFSizeThreshold.h; sourceTree = ""; }; + D29DF14721E68728003B2FB9 /* MFSizeThreshold.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MFSizeThreshold.m; sourceTree = ""; }; + D29DF14C21E693AD003B2FB9 /* MFFonts.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MFFonts.m; sourceTree = ""; }; + D29DF14D21E693AD003B2FB9 /* MFFonts.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MFFonts.h; sourceTree = ""; }; + D29DF15321E69760003B2FB9 /* MVMCoreUIPanelButtonProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIPanelButtonProtocol.h; sourceTree = ""; }; + D29DF15921E697DA003B2FB9 /* SeparatorView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SeparatorView.h; sourceTree = ""; }; + D29DF15A21E697DA003B2FB9 /* SeparatorView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SeparatorView.m; sourceTree = ""; }; + D29DF15F21E69996003B2FB9 /* MFViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFViewController.m; sourceTree = ""; }; + D29DF16021E69996003B2FB9 /* MFViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFViewController.h; sourceTree = ""; }; + D29DF16A21E69E1F003B2FB9 /* MFCustomButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFCustomButton.h; sourceTree = ""; }; + D29DF16B21E69E1F003B2FB9 /* ButtonDelegateProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ButtonDelegateProtocol.h; sourceTree = ""; }; + D29DF16C21E69E1F003B2FB9 /* PrimaryButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PrimaryButton.h; sourceTree = ""; }; + D29DF17021E69E1F003B2FB9 /* MFCustomButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFCustomButton.m; sourceTree = ""; }; + D29DF17121E69E1F003B2FB9 /* PrimaryButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PrimaryButton.m; sourceTree = ""; }; + D29DF17E21E69E2E003B2FB9 /* MFView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MFView.h; sourceTree = ""; }; + D29DF17F21E69E2E003B2FB9 /* MFView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MFView.m; sourceTree = ""; }; + D29DF24221E6A176003B2FB9 /* MFTextField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFTextField.m; sourceTree = ""; }; + D29DF24321E6A176003B2FB9 /* MFDigitTextField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFDigitTextField.h; sourceTree = ""; }; + D29DF24421E6A176003B2FB9 /* MFTextField.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MFTextField.xib; sourceTree = ""; }; + D29DF24521E6A176003B2FB9 /* MFDigitTextBox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFDigitTextBox.h; sourceTree = ""; }; + D29DF24621E6A176003B2FB9 /* MFDigitTextBox.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFDigitTextBox.m; sourceTree = ""; }; + D29DF24721E6A176003B2FB9 /* MFMdnTextField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFMdnTextField.h; sourceTree = ""; }; + D29DF24821E6A177003B2FB9 /* MFDigitTextField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFDigitTextField.m; sourceTree = ""; }; + D29DF24921E6A177003B2FB9 /* MFMdnTextField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFMdnTextField.m; sourceTree = ""; }; + D29DF24A21E6A177003B2FB9 /* MFDigitTextField.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MFDigitTextField.xib; sourceTree = ""; }; + D29DF24B21E6A177003B2FB9 /* MFTextFieldSubclassExtension.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFTextFieldSubclassExtension.h; sourceTree = ""; }; + D29DF24C21E6A177003B2FB9 /* MFTextField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFTextField.h; sourceTree = ""; }; + D29DF25821E6A22D003B2FB9 /* MFButtonProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFButtonProtocol.h; sourceTree = ""; }; + D29DF26821E6AA0B003B2FB9 /* FLAnimatedImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLAnimatedImage.m; sourceTree = ""; }; + D29DF26921E6AA0B003B2FB9 /* FLAnimatedImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLAnimatedImageView.m; sourceTree = ""; }; + D29DF26A21E6AA0B003B2FB9 /* FLAnimatedImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLAnimatedImage.h; sourceTree = ""; }; + D29DF26B21E6AA0B003B2FB9 /* FLAnimatedImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLAnimatedImageView.h; sourceTree = ""; }; + D29DF27321E79E81003B2FB9 /* MVMCoreUILoggingHandler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUILoggingHandler.h; sourceTree = ""; }; + D29DF27421E79E81003B2FB9 /* MVMCoreUILoggingHandler.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUILoggingHandler.m; sourceTree = ""; }; + D29DF27721E7A533003B2FB9 /* MVMCoreUISession.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUISession.h; sourceTree = ""; }; + D29DF27821E7A533003B2FB9 /* MVMCoreUISession.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUISession.m; sourceTree = ""; }; + D29DF27F21E7AA50003B2FB9 /* MVMCoreUIDetailViewProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIDetailViewProtocol.h; sourceTree = ""; }; + D29DF28121E7AB23003B2FB9 /* MVMCoreUICommonViewsUtility.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUICommonViewsUtility.m; sourceTree = ""; }; + D29DF28221E7AB24003B2FB9 /* MVMCoreUICommonViewsUtility.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreUICommonViewsUtility.h; sourceTree = ""; }; + D29DF28721E7AC2B003B2FB9 /* ViewConstrainingView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ViewConstrainingView.h; sourceTree = ""; }; + D29DF28821E7AC2B003B2FB9 /* ViewConstrainingView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ViewConstrainingView.m; sourceTree = ""; }; + D29DF28D21E7ADB8003B2FB9 /* ProgrammaticScrollViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ProgrammaticScrollViewController.m; sourceTree = ""; }; + D29DF28E21E7ADB8003B2FB9 /* StackableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StackableViewController.m; sourceTree = ""; }; + D29DF28F21E7ADB8003B2FB9 /* MFScrollingViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFScrollingViewController.h; sourceTree = ""; }; + D29DF29021E7ADB8003B2FB9 /* MFScrollingViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFScrollingViewController.m; sourceTree = ""; }; + D29DF29121E7ADB8003B2FB9 /* ProgrammaticScrollViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProgrammaticScrollViewController.h; sourceTree = ""; }; + D29DF29221E7ADB8003B2FB9 /* MFProgrammaticTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFProgrammaticTableViewController.h; sourceTree = ""; }; + D29DF29321E7ADB8003B2FB9 /* StackableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StackableViewController.h; sourceTree = ""; }; + D29DF29421E7ADB8003B2FB9 /* MFProgrammaticTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFProgrammaticTableViewController.m; sourceTree = ""; }; + D29DF29F21E7AF4E003B2FB9 /* MVMCoreUIUtility.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIUtility.h; sourceTree = ""; }; + D29DF2A021E7AF4E003B2FB9 /* MVMCoreUIUtility.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUIUtility.m; sourceTree = ""; }; + D29DF2A721E7B2F9003B2FB9 /* MVMCoreUIConstants.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIConstants.h; sourceTree = ""; }; + D29DF2A821E7B2F9003B2FB9 /* MVMCoreUIConstants.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUIConstants.m; sourceTree = ""; }; + D29DF2AB21E7B3A4003B2FB9 /* MFTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFTextView.m; sourceTree = ""; }; + D29DF2AC21E7B3A4003B2FB9 /* MFTextView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MFTextView.xib; sourceTree = ""; }; + D29DF2AD21E7B3A4003B2FB9 /* MFTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFTextView.h; sourceTree = ""; }; + D29DF2B121E7B76C003B2FB9 /* MFLoadingSpinner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFLoadingSpinner.h; sourceTree = ""; }; + D29DF2B221E7B76D003B2FB9 /* MFLoadingSpinner.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFLoadingSpinner.m; sourceTree = ""; }; + D29DF2B821E7BEA4003B2FB9 /* TopTabbar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TopTabbar.h; sourceTree = ""; }; + D29DF2B921E7BEA4003B2FB9 /* MVMCoreUITabBarPageControlViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreUITabBarPageControlViewController.h; sourceTree = ""; }; + D29DF2BA21E7BEA4003B2FB9 /* TopTabbar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TopTabbar.m; sourceTree = ""; }; + D29DF2BB21E7BEA4003B2FB9 /* MVMCoreUITabBarPageControlViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUITabBarPageControlViewController.m; sourceTree = ""; }; + D29DF2C021E7BF56003B2FB9 /* MFTabBarSwipeAnimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFTabBarSwipeAnimator.h; sourceTree = ""; }; + D29DF2C121E7BF57003B2FB9 /* MFTabBarSwipeAnimator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFTabBarSwipeAnimator.m; sourceTree = ""; }; + D29DF2C221E7BF57003B2FB9 /* MFTabBarInteractor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFTabBarInteractor.h; sourceTree = ""; }; + D29DF2C321E7BF57003B2FB9 /* MFTabBarInteractor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFTabBarInteractor.m; sourceTree = ""; }; + D29DF2CC21E7C104003B2FB9 /* MFLoadingViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFLoadingViewController.h; sourceTree = ""; }; + D29DF2CD21E7C104003B2FB9 /* MFLoadingViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFLoadingViewController.m; sourceTree = ""; }; + D29DF2E021E9240B003B2FB9 /* MVMCoreUIPanelProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIPanelProtocol.h; sourceTree = ""; }; + D29DF31621ECECC0003B2FB9 /* NHaasGroteskDSStd-45Lt.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "NHaasGroteskDSStd-45Lt.otf"; sourceTree = ""; }; + D29DF31721ECECC0003B2FB9 /* OCRAExtended.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = OCRAExtended.ttf; sourceTree = ""; }; + D29DF31821ECECC0003B2FB9 /* NHaasGroteskDSStd-75Bd.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "NHaasGroteskDSStd-75Bd.otf"; sourceTree = ""; }; + D29DF31921ECECC0003B2FB9 /* NHaasGroteskDSStd-55Rg.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "NHaasGroteskDSStd-55Rg.otf"; sourceTree = ""; }; + D29DF31E21ED0CBA003B2FB9 /* LabelView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LabelView.h; sourceTree = ""; }; + D29DF31F21ED0CBA003B2FB9 /* LabelView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LabelView.m; sourceTree = ""; }; + D29DF32221ED0DA2003B2FB9 /* TextButtonView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TextButtonView.m; sourceTree = ""; }; + D29DF32321ED0DA2003B2FB9 /* TextButtonView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextButtonView.h; sourceTree = ""; }; + D29DF32921EE8736003B2FB9 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; + D29DF32A21EE8736003B2FB9 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; }; + D29DF32B21EE8736003B2FB9 /* es-MX */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-MX"; path = "es-MX.lproj/Localizable.strings"; sourceTree = ""; }; + D29DF32D21EE8C3D003B2FB9 /* Media.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Media.xcassets; sourceTree = ""; }; + D29E28D723D21AB800ACEA85 /* StringAndMoleculeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringAndMoleculeView.swift; sourceTree = ""; }; + D29E28D923D21AFA00ACEA85 /* StringAndMoleculeModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringAndMoleculeModel.swift; sourceTree = ""; }; + D29E28DC23D7404C00ACEA85 /* ContainerHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContainerHelper.swift; sourceTree = ""; }; + D2A514562211C53C00345BFB /* MVMCoreUIMoleculeMappingObject.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIMoleculeMappingObject.h; sourceTree = ""; }; + D2A514572211C53C00345BFB /* MVMCoreUIMoleculeMappingObject.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUIMoleculeMappingObject.m; sourceTree = ""; }; + D2A5145C2211D22A00345BFB /* MVMCoreUIMoleculeViewProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIMoleculeViewProtocol.h; sourceTree = ""; }; + D2A5145E2211DDC100345BFB /* MoleculeStackView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoleculeStackView.swift; sourceTree = ""; }; + D2A5146022121FBF00345BFB /* MoleculeStackTemplate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoleculeStackTemplate.swift; sourceTree = ""; }; + D2A514622213643100345BFB /* MoleculeStackCenteredTemplate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoleculeStackCenteredTemplate.swift; sourceTree = ""; }; + D2A514662213885800345BFB /* HeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeaderView.swift; sourceTree = ""; }; + D2A5146A2214905000345BFB /* ThreeLayerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThreeLayerViewController.swift; sourceTree = ""; }; + D2A638FC22CA98280052ED1F /* HeadlineBody.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadlineBody.swift; sourceTree = ""; }; + D2A6390022CBB1820052ED1F /* Carousel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Carousel.swift; sourceTree = ""; }; + D2A6390422CBCE160052ED1F /* MoleculeCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoleculeCollectionViewCell.swift; sourceTree = ""; }; + D2B18B7E2360913400A9AEDC /* Control.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Control.swift; sourceTree = ""; }; + D2B18B802360945C00A9AEDC /* View.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = View.swift; sourceTree = ""; }; + D2B18B912361E65A00A9AEDC /* CoreUIObject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreUIObject.swift; sourceTree = ""; }; + D2B18B93236214AD00A9AEDC /* NavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationController.swift; sourceTree = ""; }; + D2B1E3E422F37D6A0065F95C /* ImageHeadlineBody.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageHeadlineBody.swift; sourceTree = ""; }; + D2C5001621F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIViewControllerMappingObject.h; sourceTree = ""; }; + D2C5001721F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUIViewControllerMappingObject.m; sourceTree = ""; }; + D2D6CD3F22E78C1A00D701B8 /* Scroller.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Scroller.swift; sourceTree = ""; }; + D2D6CD4122E78FAB00D701B8 /* ThreeLayerTemplate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThreeLayerTemplate.swift; sourceTree = ""; }; + D2E1FADA2260D3D200AEFD8C /* MVMCoreUIDelegateObject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MVMCoreUIDelegateObject.swift; sourceTree = ""; }; + D2E1FADE2268B8E700AEFD8C /* ThreeLayerTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThreeLayerTableViewController.swift; sourceTree = ""; }; + D2E1FAE02268E81D00AEFD8C /* MoleculeListTemplate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoleculeListTemplate.swift; sourceTree = ""; }; + D2E2A98223D8B32D000B42E6 /* EyebrowHeadlineBodyLinkModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EyebrowHeadlineBodyLinkModel.swift; sourceTree = ""; }; + D2E2A99323D8CCBC000B42E6 /* HeadlineBodyLinkModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadlineBodyLinkModel.swift; sourceTree = ""; }; + D2E2A99523D8CF85000B42E6 /* HeadlineBodyLinkToggleModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadlineBodyLinkToggleModel.swift; sourceTree = ""; }; + D2E2A99723D8D63C000B42E6 /* ActionDetailWithImageModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionDetailWithImageModel.swift; sourceTree = ""; }; + D2E2A99923D8D6B4000B42E6 /* HeadlineBodyButtonModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadlineBodyButtonModel.swift; sourceTree = ""; }; + D2E2A99B23D8D975000B42E6 /* ImageHeadlineBodyModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageHeadlineBodyModel.swift; sourceTree = ""; }; + D2E2A99E23E07F8A000B42E6 /* PillButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PillButton.swift; sourceTree = ""; }; + D2E2A9A023E095AB000B42E6 /* ButtonModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonModelProtocol.swift; sourceTree = ""; }; + D2E2A9A223E096B1000B42E6 /* DisableableModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DisableableModelProtocol.swift; sourceTree = ""; }; + D2F4DDE52371A4CB00CD28BB /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + D2FB151A23A2B65B00C20E10 /* MoleculeContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoleculeContainer.swift; sourceTree = ""; }; + D2FB151C23A40F1500C20E10 /* MoleculeStackItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoleculeStackItem.swift; sourceTree = ""; }; + DB06250A2293456500B72DD3 /* LeftRightLabelView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LeftRightLabelView.swift; sourceTree = ""; }; + DB891E822253FA8500022516 /* Label.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Label.swift; sourceTree = ""; }; + DBC4391622442196001AB423 /* CaretView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CaretView.swift; sourceTree = ""; }; + DBC4391722442197001AB423 /* DashLine.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DashLine.swift; sourceTree = ""; }; + DBC4391A224421A0001AB423 /* CaretLink.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CaretLink.swift; sourceTree = ""; }; + DBC4391C2245232D001AB423 /* LabelWithInternalButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelWithInternalButton.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + D29DF0C921E404D4003B2FB9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + D29DF0E621E4F3C7003B2FB9 /* MVMCore.framework in Frameworks */, + 9455B19C234F8A0400A574DB /* MVMAnimationFramework.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 011B58EE23A2AA850085F53C /* ModelProtocols */ = { + isa = PBXGroup; + children = ( + 014AA72323C501E2006F3E93 /* ContainerModelProtocol.swift */, + 017BEB4123620AD20024EF95 /* FormModelProtocol.swift */, + 012A88C3238D86E600FE3DA1 /* CarouselItemModelProtocol.swift */, + 012A88B0238C880100FE3DA1 /* CarouselPagingModelProtocol.swift */, + 01EB3683236097C0006832FA /* MoleculeModelProtocol.swift */, + 012A889B23889E8400FE3DA1 /* TemplateModelProtocol.swift */, + D28A837823C7D5BC00DFE4FC /* PageModelProtocol.swift */, + 011B58EF23A2AA980085F53C /* ListItemModelProtocol.swift */, + D2E2A9A223E096B1000B42E6 /* DisableableModelProtocol.swift */, + ); + path = ModelProtocols; + sourceTree = ""; + }; + 012A88EF23985E0100FE3DA1 /* CustomPrimitives */ = { + isa = PBXGroup; + children = ( + 012A88F023985E0100FE3DA1 /* Color.swift */, + ); + path = CustomPrimitives; + sourceTree = ""; + }; + 01509D96232803B200EF99AA /* Models */ = { + isa = PBXGroup; + children = ( + 011B58EE23A2AA850085F53C /* ModelProtocols */, + 946EE1B5237B663A0036751F /* Extensions */, + ); + path = Models; + sourceTree = ""; + }; + 01C74D87224298E2009C25A3 /* FormUIHelpers */ = { + isa = PBXGroup; + children = ( + 0198F79E225679870066C936 /* FormValidationProtocol.swift */, + 0105618A224BBE7700E1557D /* FormValidator.swift */, + 0105618C224BBE7700E1557D /* FormValidator+FormParams.swift */, + 0105618B224BBE7700E1557D /* FormValidator+TextFields.swift */, + ); + path = FormUIHelpers; + sourceTree = ""; + }; + 0A14F6B023E8C27A00EDF7F7 /* CarouselIndicator */ = { + isa = PBXGroup; + children = ( + 0A14F6B723ECA7F900EDF7F7 /* IndicatorViews */, + 0A14F69223E349EF00EDF7F7 /* CarouselIndicator.swift */, + 0A14F6A823E8750300EDF7F7 /* CarouselIndicatorModel.swift */, + ); + path = CarouselIndicator; + sourceTree = ""; + }; + 0A14F6B723ECA7F900EDF7F7 /* IndicatorViews */ = { + isa = PBXGroup; + children = ( + 0A14F6B123E8C28D00EDF7F7 /* BarsIndicatorView.swift */, + 0A14F6B323E8C29700EDF7F7 /* NumericIndicatorView.swift */, + ); + path = IndicatorViews; + sourceTree = ""; + }; + 0A5D59C323AD488600EFD9E9 /* Protocols */ = { + isa = PBXGroup; + children = ( + 0A5D59C123AD2F5700EFD9E9 /* AppleGuidelinesProtocol.swift */, + ); + path = Protocols; + sourceTree = ""; + }; + 0ABD1369237B18EE0081388D /* Views */ = { + isa = PBXGroup; + children = ( + 9432A79E23DB47BA00719041 /* EntryFieldContainer.swift */, + D29E28DE23D740FC00ACEA85 /* Container */, + 014AA72123C501E2006F3E93 /* MoleculeContainerModel.swift */, + D2FB151A23A2B65B00C20E10 /* MoleculeContainer.swift */, + ); + path = Views; + sourceTree = ""; + }; + 946EE1B5237B663A0036751F /* Extensions */ = { + isa = PBXGroup; + children = ( + 946EE1B9237B66D80036751F /* MoleculeModelHelper.swift */, + ); + path = Extensions; + sourceTree = ""; + }; + 94C2D9822386F3E30006CF46 /* Label */ = { + isa = PBXGroup; + children = ( + 01EB368823609801006832FA /* LabelModel.swift */, + 94C2D9832386F3F80006CF46 /* LabelAttributeModel.swift */, + 94C2D9A023872BCC0006CF46 /* LabelAttributeUnderlineModel.swift */, + 94C2D9A223872C110006CF46 /* LabelAttributeStrikeThroughModel.swift */, + 94C2D9A423872C350006CF46 /* LabelAttributeFontModel.swift */, + 94C2D9A623872DA90006CF46 /* LabelAttributeColorModel.swift */, + 94C2D9A823872E5E0006CF46 /* LabelAttributeImageModel.swift */, + 94C2D9AA23872EB50006CF46 /* LabelAttributeActionModel.swift */, + DB891E822253FA8500022516 /* Label.swift */, + ); + path = Label; + sourceTree = ""; + }; + 94FB5B83238D892800EB2193 /* Recovered References */ = { + isa = PBXGroup; + children = ( + ); + name = "Recovered References"; + sourceTree = ""; + }; + D213347423842FE3008E41B3 /* Controllers */ = { + isa = PBXGroup; + children = ( + D29DF29321E7ADB8003B2FB9 /* StackableViewController.h */, + D29DF28E21E7ADB8003B2FB9 /* StackableViewController.m */, + D29770F021F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsViewController.h */, + D29770F121F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsViewController.m */, + D29770EF21F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsTableViewController.h */, + D29770EE21F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsTableViewController.m */, + ); + path = Controllers; + sourceTree = ""; + }; + D213347523842FF5008E41B3 /* Views */ = { + isa = PBXGroup; + children = ( + 94FB966023D797DA003D482B /* MFTextButton.h */, + 94FB966123D797DA003D482B /* MFTextButton.m */, + D29DF17E21E69E2E003B2FB9 /* MFView.h */, + D29DF17F21E69E2E003B2FB9 /* MFView.m */, + D29DF31E21ED0CBA003B2FB9 /* LabelView.h */, + D29DF31F21ED0CBA003B2FB9 /* LabelView.m */, + D29DF15921E697DA003B2FB9 /* SeparatorView.h */, + D29DF15A21E697DA003B2FB9 /* SeparatorView.m */, + D22D1F1C220343560077CEC0 /* MVMCoreUICheckMarkView.h */, + D22D1F1D220343560077CEC0 /* MVMCoreUICheckMarkView.m */, + D22D1F18220341F50077CEC0 /* MVMCoreUICheckBox.h */, + D22D1F19220341F50077CEC0 /* MVMCoreUICheckBox.m */, + 0198F7A02256A80A0066C936 /* MFRadioButton.h */, + 0198F7A22256A80A0066C936 /* MFRadioButton.m */, + D29DF28721E7AC2B003B2FB9 /* ViewConstrainingView.h */, + D29DF28821E7AC2B003B2FB9 /* ViewConstrainingView.m */, + D29DF2AD21E7B3A4003B2FB9 /* MFTextView.h */, + D29DF2AB21E7B3A4003B2FB9 /* MFTextView.m */, + D29DF2AC21E7B3A4003B2FB9 /* MFTextView.xib */, + D29DF2B121E7B76C003B2FB9 /* MFLoadingSpinner.h */, + D29DF2B221E7B76D003B2FB9 /* MFLoadingSpinner.m */, + D29DF32321ED0DA2003B2FB9 /* TextButtonView.h */, + D29DF32221ED0DA2003B2FB9 /* TextButtonView.m */, + D29770FB21F7C77400B2F0D0 /* MVMCoreUITextFieldView.h */, + D29770FA21F7C77400B2F0D0 /* MVMCoreUITextFieldView.m */, + D22D1F44220496A30077CEC0 /* MVMCoreUISwitch.h */, + D22D1F45220496A30077CEC0 /* MVMCoreUISwitch.m */, + D29DF16A21E69E1F003B2FB9 /* MFCustomButton.h */, + D29DF17021E69E1F003B2FB9 /* MFCustomButton.m */, + D29DF16C21E69E1F003B2FB9 /* PrimaryButton.h */, + D29DF17121E69E1F003B2FB9 /* PrimaryButton.m */, + D29DF25821E6A22D003B2FB9 /* MFButtonProtocol.h */, + D29DF16B21E69E1F003B2FB9 /* ButtonDelegateProtocol.h */, + D260D7AF22D65BDD007E7233 /* MVMCoreUIPageControl.h */, + D260D7B022D65BDD007E7233 /* MVMCoreUIPageControl.m */, + D260D7B522D68509007E7233 /* MVMCoreUIPagingProtocol.h */, + D29DF24C21E6A177003B2FB9 /* MFTextField.h */, + D29DF24221E6A176003B2FB9 /* MFTextField.m */, + D29DF24421E6A176003B2FB9 /* MFTextField.xib */, + D29DF24B21E6A177003B2FB9 /* MFTextFieldSubclassExtension.h */, + D29DF24721E6A176003B2FB9 /* MFMdnTextField.h */, + D29DF24921E6A177003B2FB9 /* MFMdnTextField.m */, + D29DF24521E6A176003B2FB9 /* MFDigitTextBox.h */, + D29DF24621E6A176003B2FB9 /* MFDigitTextBox.m */, + D29DF24321E6A176003B2FB9 /* MFDigitTextField.h */, + D29DF24821E6A177003B2FB9 /* MFDigitTextField.m */, + D29DF24A21E6A177003B2FB9 /* MFDigitTextField.xib */, + D2A5145C2211D22A00345BFB /* MVMCoreUIMoleculeViewProtocol.h */, + D29770C721F7C4AE00B2F0D0 /* TopLabelsView.h */, + D29770C621F7C4AE00B2F0D0 /* TopLabelsView.m */, + 94F217B423E0BF6100A47C06 /* PrimaryButtonView.h */, + 94F217B523E0BF6100A47C06 /* PrimaryButtonView.m */, + D282AACA2243C61700C46919 /* ButtonView.swift */, + 94AF4A3C23E9D13900676048 /* MFCaretButton.h */, + 94AF4A3D23E9D13900676048 /* MFCaretButton.m */, + 94AF4A4023E9D19E00676048 /* MFCaretView.h */, + 94AF4A4123E9D19E00676048 /* MFCaretView.m */, + ); + path = Views; + sourceTree = ""; + }; + D224798823142BF2003FCCF9 /* ToggleMolecules */ = { + isa = PBXGroup; + children = ( + D2E2A99523D8CF85000B42E6 /* HeadlineBodyLinkToggleModel.swift */, + 01509D942327ED1900EF99AA /* HeadlineBodyLinkToggle.swift */, + 01C851D223CF9E740021F976 /* LabelToggleModel.swift */, + D22479892314445E003FCCF9 /* LabelToggle.swift */, + 0103B84D23D7E33A009C315C /* HeadlineBodyToggleModel.swift */, + D224798B231450C8003FCCF9 /* HeadlineBodyToggle.swift */, + ); + path = ToggleMolecules; + sourceTree = ""; + }; + D224798D2316A988003FCCF9 /* VerticalCombinationViews */ = { + isa = PBXGroup; + children = ( + D29E28D423D1FFFA00ACEA85 /* Lists */, + 01EB368D23609801006832FA /* HeadlineBodyModel.swift */, + D2A638FC22CA98280052ED1F /* HeadlineBody.swift */, + D2E2A99323D8CCBC000B42E6 /* HeadlineBodyLinkModel.swift */, + D22479952316AF6D003FCCF9 /* HeadlineBodyLink.swift */, + D2E2A98223D8B32D000B42E6 /* EyebrowHeadlineBodyLinkModel.swift */, + D27CD40F2339057800C1DC07 /* EyebrowHeadlineBodyLink.swift */, + D28A839223CE828900DFE4FC /* HeadlineBodyCaretLinkImageModel.swift */, + C7192E7C23C301750050C2A0 /* HeadLineBodyCaretLinkImage.swift */, + D2E2A99923D8D6B4000B42E6 /* HeadlineBodyButtonModel.swift */, + 0A7BAD73232A8DC700FB8E22 /* HeadlineBodyButton.swift */, + ); + path = VerticalCombinationViews; + sourceTree = ""; + }; + D224798E2316A995003FCCF9 /* HorizontalCombinationViews */ = { + isa = PBXGroup; + children = ( + D2E2A99B23D8D975000B42E6 /* ImageHeadlineBodyModel.swift */, + D2B1E3E422F37D6A0065F95C /* ImageHeadlineBody.swift */, + D28A838E23CCDEDE00DFE4FC /* TwoButtonViewModel.swift */, + D20A9A5D2243D3E300ADE781 /* TwoButtonView.swift */, + D28A837E23CCA96400DFE4FC /* TabsModel.swift */, + ); + path = HorizontalCombinationViews; + sourceTree = ""; + }; + D224798F2316A99F003FCCF9 /* LeftRightViews */ = { + isa = PBXGroup; + children = ( + D2E2A99723D8D63C000B42E6 /* ActionDetailWithImageModel.swift */, + 0A12149F22C11A17007C7030 /* ActionDetailWithImage.swift */, + D28A839023CD4FD400DFE4FC /* CornerLabelsModel.swift */, + 01509D902327ECE600EF99AA /* CornerLabels.swift */, + D224798823142BF2003FCCF9 /* ToggleMolecules */, + ); + path = LeftRightViews; + sourceTree = ""; + }; + D22479902316A9CB003FCCF9 /* Organisms */ = { + isa = PBXGroup; + children = ( + D260105A23D0BB7100764D80 /* StackModelProtocol.swift */, + D260106423D0CEA700764D80 /* StackModel.swift */, + D260105C23D0BCD400764D80 /* Stack.swift */, + 01EB368B23609801006832FA /* MoleculeStackModel.swift */, + D2A5145E2211DDC100345BFB /* MoleculeStackView.swift */, + 012A88AE238C626E00FE3DA1 /* CarouselModel.swift */, + D2A6390022CBB1820052ED1F /* Carousel.swift */, + ); + path = Organisms; + sourceTree = ""; + }; + D22479912316A9EF003FCCF9 /* Items */ = { + isa = PBXGroup; + children = ( + D2755D7A23689C7500485468 /* TableViewCell.swift */, + 01EB368923609801006832FA /* ListItemModel.swift */, + 01509D8E2327EC6F00EF99AA /* MoleculeTableViewCell.swift */, + 012A88C1238D7BCA00FE3DA1 /* CarouselItemModel.swift */, + D2A6390422CBCE160052ED1F /* MoleculeCollectionViewCell.swift */, + D28A838023CCB0D800DFE4FC /* AccordionListItemModel.swift */, + D224799A231965AD003FCCF9 /* AccordionMoleculeTableViewCell.swift */, + D28A837C23CCA86A00DFE4FC /* TabsListItemModel.swift */, + D27CD40D2322EEAF00C1DC07 /* TabsTableViewCell.swift */, + 011B58F123A2AE2C0085F53C /* DropDownListItemModel.swift */, + D268C70D238C22D7007F2C1C /* DropDownFilterTableViewCell.swift */, + D260106023D0C02A00764D80 /* StackItemModelProtocol.swift */, + D260106223D0C05000764D80 /* StackItemModel.swift */, + D260105E23D0BFFC00764D80 /* StackItem.swift */, + 01EB368A23609801006832FA /* MoleculeStackItemModel.swift */, + D2FB151C23A40F1500C20E10 /* MoleculeStackItem.swift */, + ); + path = Items; + sourceTree = ""; + }; + D22D1F582204D2590077CEC0 /* Legacy */ = { + isa = PBXGroup; + children = ( + D213347523842FF5008E41B3 /* Views */, + D213347423842FE3008E41B3 /* Controllers */, + ); + path = Legacy; + sourceTree = ""; + }; + D260105723CF9CC500764D80 /* Doughnut */ = { + isa = PBXGroup; + children = ( + C695A69323C9909000BFB94E /* DoughnutChartModel.swift */, + C695A69523C990BC00BFB94E /* DoughnutChart.swift */, + C695A69723C990C200BFB94E /* DoughnutChartView.swift */, + ); + path = Doughnut; + sourceTree = ""; + }; + D29DF0C221E404D4003B2FB9 = { + isa = PBXGroup; + children = ( + D29DF0CE21E404D4003B2FB9 /* MVMCoreUI */, + D29DF0CD21E404D4003B2FB9 /* Products */, + D29DF0E421E4F3C7003B2FB9 /* Frameworks */, + 94FB5B83238D892800EB2193 /* Recovered References */, + ); + sourceTree = ""; + }; + D29DF0CD21E404D4003B2FB9 /* Products */ = { + isa = PBXGroup; + children = ( + D29DF0CC21E404D4003B2FB9 /* MVMCoreUI.framework */, + ); + name = Products; + sourceTree = ""; + }; + D29DF0CE21E404D4003B2FB9 /* MVMCoreUI */ = { + isa = PBXGroup; + children = ( + 01509D96232803B200EF99AA /* Models */, + 012A88EF23985E0100FE3DA1 /* CustomPrimitives */, + D2B18B7D236090D500A9AEDC /* BaseClasses */, + 01C74D87224298E2009C25A3 /* FormUIHelpers */, + D29DF31421ECECA7003B2FB9 /* SupportingFiles */, + D29DF27021E79B2C003B2FB9 /* OtherHandlers */, + D29DF13A21E68682003B2FB9 /* Utility */, + D29DF13321E68604003B2FB9 /* Styles */, + D29DF11021E6805F003B2FB9 /* Categories */, + D29DF11921E68467003B2FB9 /* Containers */, + D22D1F582204D2590077CEC0 /* Legacy */, + D29DF10F21E67A7D003B2FB9 /* BaseControllers */, + D29DF11E21E6851E003B2FB9 /* TopAlert */, + D29DF10D21E67A70003B2FB9 /* Atoms */, + D29DF10E21E67A77003B2FB9 /* Molecules */, + D22479902316A9CB003FCCF9 /* Organisms */, + D29DF0DF21E418B2003B2FB9 /* Templates */, + D29DF0CF21E404D4003B2FB9 /* MVMCoreUI.h */, + D29DF0D021E404D4003B2FB9 /* Info.plist */, + ); + path = MVMCoreUI; + sourceTree = ""; + }; + D29DF0DF21E418B2003B2FB9 /* Templates */ = { + isa = PBXGroup; + children = ( + 012A88AC238C418100FE3DA1 /* TemplateProtocol.swift */, + 014AA72823C5059B006F3E93 /* StackPageTemplateModel.swift */, + D2A5146022121FBF00345BFB /* MoleculeStackTemplate.swift */, + 014AA72923C5059B006F3E93 /* StackCenteredPageTemplateModel.swift */, + D2A514622213643100345BFB /* MoleculeStackCenteredTemplate.swift */, + D28A837A23C928DA00DFE4FC /* MoleculeListCellProtocol.swift */, + 014AA72C23C5059B006F3E93 /* ListPageTemplateModel.swift */, + D2E1FAE02268E81D00AEFD8C /* MoleculeListTemplate.swift */, + 014AA72A23C5059B006F3E93 /* ThreeLayerPageTemplateModel.swift */, + D2D6CD4122E78FAB00D701B8 /* ThreeLayerTemplate.swift */, + ); + path = Templates; + sourceTree = ""; + }; + D29DF0E421E4F3C7003B2FB9 /* Frameworks */ = { + isa = PBXGroup; + children = ( + D29DF0E521E4F3C7003B2FB9 /* MVMCore.framework */, + 9455B19B234F8A0400A574DB /* MVMAnimationFramework.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + D29DF10D21E67A70003B2FB9 /* Atoms */ = { + isa = PBXGroup; + children = ( + D29DF22B21E6A0FA003B2FB9 /* TextFields */, + D29DF17D21E69E26003B2FB9 /* Views */, + D29DF16821E69E1F003B2FB9 /* Buttons */, + ); + path = Atoms; + sourceTree = ""; + }; + D29DF10E21E67A77003B2FB9 /* Molecules */ = { + isa = PBXGroup; + children = ( + D22479912316A9EF003FCCF9 /* Items */, + D224798F2316A99F003FCCF9 /* LeftRightViews */, + D224798E2316A995003FCCF9 /* HorizontalCombinationViews */, + D224798D2316A988003FCCF9 /* VerticalCombinationViews */, + 01EB368C23609801006832FA /* HeaderModel.swift */, + D2A514662213885800345BFB /* HeaderView.swift */, + 012A88EB238F084D00FE3DA1 /* FooterModel.swift */, + D274CA322236A78900B01B62 /* FooterView.swift */, + 0116A4E4228B19640094F3ED /* RadioButtonModel.swift */, + 012A88C5238DA34000FE3DA1 /* ModuleMoleculeModel.swift */, + D29B770F22C281F400D6ACE0 /* ModuleMolecule.swift */, + D28A838423CCCA8900DFE4FC /* ScrollerModel.swift */, + D2D6CD3F22E78C1A00D701B8 /* Scroller.swift */, + 017BEB372360C6AC0024EF95 /* RadioButtonLabel.swift */, + 017BEB47236230DB0024EF95 /* MoleculeViewProtocol.swift */, + 017BEB49236235BA0024EF95 /* ModelMoleculeViewProtocol.swift */, + D260105723CF9CC500764D80 /* Doughnut */, + ); + path = Molecules; + sourceTree = ""; + }; + D29DF10F21E67A7D003B2FB9 /* BaseControllers */ = { + isa = PBXGroup; + children = ( + D29DF16021E69996003B2FB9 /* MFViewController.h */, + D29DF15F21E69996003B2FB9 /* MFViewController.m */, + 017BEB3B2361EA1D0024EF95 /* MFViewController+Model.swift */, + D29DF28F21E7ADB8003B2FB9 /* MFScrollingViewController.h */, + D29DF29021E7ADB8003B2FB9 /* MFScrollingViewController.m */, + D29DF29121E7ADB8003B2FB9 /* ProgrammaticScrollViewController.h */, + D29DF28D21E7ADB8003B2FB9 /* ProgrammaticScrollViewController.m */, + D29DF29221E7ADB8003B2FB9 /* MFProgrammaticTableViewController.h */, + D29DF29421E7ADB8003B2FB9 /* MFProgrammaticTableViewController.m */, + D22D1F542204CE5D0077CEC0 /* MVMCoreUIStackableViewController.h */, + D22D1F552204CE5D0077CEC0 /* MVMCoreUIStackableViewController.m */, + D29DF2CC21E7C104003B2FB9 /* MFLoadingViewController.h */, + D29DF2CD21E7C104003B2FB9 /* MFLoadingViewController.m */, + D2A5146A2214905000345BFB /* ThreeLayerViewController.swift */, + D2E1FADE2268B8E700AEFD8C /* ThreeLayerTableViewController.swift */, + D2F4DDE52371A4CB00CD28BB /* ViewController.swift */, + ); + path = BaseControllers; + sourceTree = ""; + }; + D29DF11021E6805F003B2FB9 /* Categories */ = { + isa = PBXGroup; + children = ( + D29DF11121E6805F003B2FB9 /* UIColor+MFConvenience.h */, + D29DF11321E6805F003B2FB9 /* UIColor+MFConvenience.m */, + D29DF11221E6805F003B2FB9 /* NSLayoutConstraint+MFConvenience.h */, + D29DF11421E6805F003B2FB9 /* NSLayoutConstraint+MFConvenience.m */, + D22479932316AE5E003FCCF9 /* NSLayoutConstraintExtension.swift */, + 0AA33B33239813C50067DD0F /* UIColor+Extension.swift */, + ); + path = Categories; + sourceTree = ""; + }; + D29DF11921E68467003B2FB9 /* Containers */ = { + isa = PBXGroup; + children = ( + 0ABD1369237B18EE0081388D /* Views */, + D29DF2B721E7BE79003B2FB9 /* TabBarController */, + D29DF2B621E7BE66003B2FB9 /* SplitViewController */, + D2B18B93236214AD00A9AEDC /* NavigationController.swift */, + ); + path = Containers; + sourceTree = ""; + }; + D29DF11E21E6851E003B2FB9 /* TopAlert */ = { + isa = PBXGroup; + children = ( + D29DF12021E6851E003B2FB9 /* MVMCoreUITopAlertView.h */, + D29DF12421E6851E003B2FB9 /* MVMCoreUITopAlertView.m */, + D29DF12321E6851E003B2FB9 /* MVMCoreUITopAlertBaseView.h */, + D29DF12821E6851E003B2FB9 /* MVMCoreUITopAlertBaseView.m */, + D29DF11F21E6851E003B2FB9 /* MVMCoreUITopAlertMainView.h */, + D29DF12521E6851E003B2FB9 /* MVMCoreUITopAlertMainView.m */, + D29DF12221E6851E003B2FB9 /* MVMCoreUITopAlertShortView.h */, + D29DF12621E6851E003B2FB9 /* MVMCoreUITopAlertShortView.m */, + D29DF12721E6851E003B2FB9 /* MVMCoreUITopAlertExpandableView.h */, + D29DF12121E6851E003B2FB9 /* MVMCoreUITopAlertExpandableView.m */, + ); + path = TopAlert; + sourceTree = ""; + }; + D29DF13321E68604003B2FB9 /* Styles */ = { + isa = PBXGroup; + children = ( + D29DF13821E68636003B2FB9 /* MFStyler.h */, + D29DF13921E68637003B2FB9 /* MFStyler.m */, + ); + path = Styles; + sourceTree = ""; + }; + D29DF13A21E68682003B2FB9 /* Utility */ = { + isa = PBXGroup; + children = ( + D29DF13B21E6870B003B2FB9 /* Sizing */, + D29DF28221E7AB24003B2FB9 /* MVMCoreUICommonViewsUtility.h */, + D29DF28121E7AB23003B2FB9 /* MVMCoreUICommonViewsUtility.m */, + D29DF14D21E693AD003B2FB9 /* MFFonts.h */, + D29DF14C21E693AD003B2FB9 /* MFFonts.m */, + D29DF29F21E7AF4E003B2FB9 /* MVMCoreUIUtility.h */, + D29DF2A021E7AF4E003B2FB9 /* MVMCoreUIUtility.m */, + D29DF2A721E7B2F9003B2FB9 /* MVMCoreUIConstants.h */, + D29DF2A821E7B2F9003B2FB9 /* MVMCoreUIConstants.m */, + 0A41BA6D2344FCD400D4C0BC /* CATransaction+Extension.swift */, + 0A209CD223A7E2810068F8B0 /* UIStackViewAlignment+Extension.swift */, + D21EE53B23AD3AD4003D1A30 /* NSLayoutConstraintAxis+Extension.swift */, + ); + path = Utility; + sourceTree = ""; + }; + D29DF13B21E6870B003B2FB9 /* Sizing */ = { + isa = PBXGroup; + children = ( + D29DF14521E68728003B2FB9 /* MFSizeObject.h */, + D29DF14421E68728003B2FB9 /* MFSizeObject.m */, + D29DF14621E68728003B2FB9 /* MFSizeThreshold.h */, + D29DF14721E68728003B2FB9 /* MFSizeThreshold.m */, + ); + path = Sizing; + sourceTree = ""; + }; + D29DF16821E69E1F003B2FB9 /* Buttons */ = { + isa = PBXGroup; + children = ( + 01F2A03123A4498200D954D8 /* CaretLinkModel.swift */, + DBC4391A224421A0001AB423 /* CaretLink.swift */, + D28A838A23CCDA6B00DFE4FC /* ButtonModel.swift */, + D2E2A99E23E07F8A000B42E6 /* PillButton.swift */, + D28A838823CCCFCB00DFE4FC /* LinkModel.swift */, + C07065C32395677300FBF997 /* Link.swift */, + D28A838C23CCDCC200DFE4FC /* PrimaryButton+MoleculeProtocolExtension.swift */, + D28A837623C79FC600DFE4FC /* MFCustomButton+ActionModel.swift */, + ); + path = Buttons; + sourceTree = ""; + }; + D29DF17D21E69E26003B2FB9 /* Views */ = { + isa = PBXGroup; + children = ( + 0A14F6B023E8C27A00EDF7F7 /* CarouselIndicator */, + 9445890B2385BCE300DE9FD4 /* ProgressBarModel.swift */, + 01509D922327ECFB00EF99AA /* ProgressBar.swift */, + 9445890D2385C3F800DE9FD4 /* MultiProgressModel.swift */, + 948DB67D2326DCD90011F916 /* MultiProgress.swift */, + 9445891E2385D2E900DE9FD4 /* CaretViewModel.swift */, + DBC4391622442196001AB423 /* CaretView.swift */, + 944589202385D6E900DE9FD4 /* DashLineModel.swift */, + DBC4391722442197001AB423 /* DashLine.swift */, + 9402C34F23A2CEA3004B974C /* LeftRightLabelModel.swift */, + DB06250A2293456500B72DD3 /* LeftRightLabelView.swift */, + D282AAB9224131D100C46919 /* MFTransparentGIFView.swift */, + 944589222385DA9500DE9FD4 /* ImageViewModel.swift */, + D282AAB3223FDDAE00C46919 /* MFLoadImageView.swift */, + 017BEB7A236763000024EF95 /* LineModel.swift */, + D213347623843825008E41B3 /* Line.swift */, + DBC4391C2245232D001AB423 /* LabelWithInternalButton.swift */, + 94C2D9822386F3E30006CF46 /* Label */, + 31BE15CA23D8924C00452370 /* CheckboxModel.swift */, + 0A7BAFA0232BE61800FB8E22 /* Checkbox.swift */, + 31BE15C923D8924C00452370 /* CheckboxLabelModel.swift */, + 0A7BAFA2232BE63400FB8E22 /* CheckboxLabel.swift */, + 01004F2F22721C3800991ECC /* RadioButton.swift */, + D28A838223CCBD3F00DFE4FC /* CircleProgressModel.swift */, + 943784F3236B77BB006A1E82 /* GraphView.swift */, + 943784F4236B77BB006A1E82 /* GraphViewAnimationHandler.swift */, + D260105223CEA61600764D80 /* ToggleModel.swift */, + 0AA33B392398524F0067DD0F /* Toggle.swift */, + D260105423CEA7DC00764D80 /* MVMCoreUISwitch+Model.swift */, + 012CA99D2385A2D3003F810F /* MFView+ModelExtension.swift */, + ); + path = Views; + sourceTree = ""; + }; + D29DF22B21E6A0FA003B2FB9 /* TextFields */ = { + isa = PBXGroup; + children = ( + 0A7EF85C23D8A95600B2AAD1 /* TextEntryFieldModel.swift */, + 0A41BA7E23453A6400D4C0BC /* TextEntryField.swift */, + 0A7EF85A23D8A52800B2AAD1 /* EntryFieldModel.swift */, + 0A21DB7E235DECC500C160A2 /* EntryField.swift */, + 0A7EF85E23D8ABC500B2AAD1 /* MdnEntryFieldModel.swift */, + 0A21DB82235DFBC500C160A2 /* MdnEntryField.swift */, + 0A8321AE2355FE9500CB7F00 /* DigitBox.swift */, + 0A7EF86023D8AC2500B2AAD1 /* DigitEntryFieldModel.swift */, + 0A21DB93235E24ED00C160A2 /* DigitEntryField.swift */, + 0A7EF86223D8AFA000B2AAD1 /* BaseDropdownEntryFieldModel.swift */, + 0A6BF4712360C56C0028F841 /* BaseDropdownEntryField.swift */, + 0A7EF86623D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift */, + 0ABD136C237CAD1E0081388D /* DateDropdownEntryField.swift */, + 0A7EF86423D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift */, + 0ABD1370237DB0450081388D /* ItemDropdownEntryField.swift */, + 017BEB3F23620A230024EF95 /* TextFieldModel.swift */, + 012CA9992384A687003F810F /* MFTextField+ModelExtension.swift */, + ); + path = TextFields; + sourceTree = ""; + }; + D29DF26621E6A9E4003B2FB9 /* ThirdParty */ = { + isa = PBXGroup; + children = ( + D29DF26721E6AA0B003B2FB9 /* FLAnimatedImage */, + ); + path = ThirdParty; + sourceTree = ""; + }; + D29DF26721E6AA0B003B2FB9 /* FLAnimatedImage */ = { + isa = PBXGroup; + children = ( + D29DF26A21E6AA0B003B2FB9 /* FLAnimatedImage.h */, + D29DF26821E6AA0B003B2FB9 /* FLAnimatedImage.m */, + D29DF26B21E6AA0B003B2FB9 /* FLAnimatedImageView.h */, + D29DF26921E6AA0B003B2FB9 /* FLAnimatedImageView.m */, + ); + path = FLAnimatedImage; + sourceTree = ""; + }; + D29DF27021E79B2C003B2FB9 /* OtherHandlers */ = { + isa = PBXGroup; + children = ( + D2E1FADA2260D3D200AEFD8C /* MVMCoreUIDelegateObject.swift */, + D2B18B912361E65A00A9AEDC /* CoreUIObject.swift */, + D29DF27721E7A533003B2FB9 /* MVMCoreUISession.h */, + D29DF27821E7A533003B2FB9 /* MVMCoreUISession.m */, + D29DF27321E79E81003B2FB9 /* MVMCoreUILoggingHandler.h */, + D29DF27421E79E81003B2FB9 /* MVMCoreUILoggingHandler.m */, + D2C5001621F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.h */, + D2C5001721F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.m */, + D296E14622A597490051EBE7 /* MVMCoreUIViewConstrainingProtocol.h */, + 012A88C7238DB02000FE3DA1 /* ModelMoleculeDelegateProtocol.swift */, + D2A514562211C53C00345BFB /* MVMCoreUIMoleculeMappingObject.h */, + D2A514572211C53C00345BFB /* MVMCoreUIMoleculeMappingObject.m */, + 017BEB432362192F0024EF95 /* MVMCoreUIMoleculeMappingObject+ModelExtension.swift */, + 017BEB7E23676E870024EF95 /* MoleculeObjectMapping.swift */, + ); + path = OtherHandlers; + sourceTree = ""; + }; + D29DF2B621E7BE66003B2FB9 /* SplitViewController */ = { + isa = PBXGroup; + children = ( + D29DF2E021E9240B003B2FB9 /* MVMCoreUIPanelProtocol.h */, + D29DF27F21E7AA50003B2FB9 /* MVMCoreUIDetailViewProtocol.h */, + D29DF15321E69760003B2FB9 /* MVMCoreUIPanelButtonProtocol.h */, + D29DF11A21E684A9003B2FB9 /* MVMCoreUISplitViewController.h */, + D29DF11B21E684A9003B2FB9 /* MVMCoreUISplitViewController.m */, + ); + path = SplitViewController; + sourceTree = ""; + }; + D29DF2B721E7BE79003B2FB9 /* TabBarController */ = { + isa = PBXGroup; + children = ( + D29DF2C021E7BF56003B2FB9 /* MFTabBarSwipeAnimator.h */, + D29DF2C121E7BF57003B2FB9 /* MFTabBarSwipeAnimator.m */, + D29DF2C221E7BF57003B2FB9 /* MFTabBarInteractor.h */, + D29DF2C321E7BF57003B2FB9 /* MFTabBarInteractor.m */, + D29DF2B821E7BEA4003B2FB9 /* TopTabbar.h */, + D29DF2BA21E7BEA4003B2FB9 /* TopTabbar.m */, + D29DF2B921E7BEA4003B2FB9 /* MVMCoreUITabBarPageControlViewController.h */, + D29DF2BB21E7BEA4003B2FB9 /* MVMCoreUITabBarPageControlViewController.m */, + ); + path = TabBarController; + sourceTree = ""; + }; + D29DF31421ECECA7003B2FB9 /* SupportingFiles */ = { + isa = PBXGroup; + children = ( + D29DF32721EE8736003B2FB9 /* Strings */, + D29DF26621E6A9E4003B2FB9 /* ThirdParty */, + D29DF31521ECECC0003B2FB9 /* Fonts */, + D29DF32D21EE8C3D003B2FB9 /* Media.xcassets */, + ); + path = SupportingFiles; + sourceTree = ""; + }; + D29DF31521ECECC0003B2FB9 /* Fonts */ = { + isa = PBXGroup; + children = ( + D29DF31621ECECC0003B2FB9 /* NHaasGroteskDSStd-45Lt.otf */, + D29DF31721ECECC0003B2FB9 /* OCRAExtended.ttf */, + D29DF31821ECECC0003B2FB9 /* NHaasGroteskDSStd-75Bd.otf */, + D29DF31921ECECC0003B2FB9 /* NHaasGroteskDSStd-55Rg.otf */, + ); + path = Fonts; + sourceTree = ""; + }; + D29DF32721EE8736003B2FB9 /* Strings */ = { + isa = PBXGroup; + children = ( + D29DF32821EE8736003B2FB9 /* Localizable.strings */, + ); + path = Strings; + sourceTree = ""; + }; + D29E28D423D1FFFA00ACEA85 /* Lists */ = { + isa = PBXGroup; + children = ( + D29E28DB23D21B0A00ACEA85 /* StringAndMoleculeStack */, + C695A68023C9830D00BFB94E /* NumberedListModel.swift */, + C6FA7D5123C77A4900A3614A /* NumberedList.swift */, + C695A67E23C9830600BFB94E /* UnOrderedListModel.swift */, + C6FA7D4F23C77A4700A3614A /* UnOrderedList.swift */, + ); + path = Lists; + sourceTree = ""; + }; + D29E28DB23D21B0A00ACEA85 /* StringAndMoleculeStack */ = { + isa = PBXGroup; + children = ( + D29E28D923D21AFA00ACEA85 /* StringAndMoleculeModel.swift */, + D29E28D723D21AB800ACEA85 /* StringAndMoleculeView.swift */, + C6FA7D5023C77A4800A3614A /* StringAndMoleculeStack.swift */, + ); + path = StringAndMoleculeStack; + sourceTree = ""; + }; + D29E28DE23D740FC00ACEA85 /* Container */ = { + isa = PBXGroup; + children = ( + 014AA72223C501E2006F3E93 /* ContainerModel.swift */, + D260105823D0A92900764D80 /* ContainerProtocol.swift */, + D243859823A16B1800332775 /* Container.swift */, + D29E28DC23D7404C00ACEA85 /* ContainerHelper.swift */, + ); + path = Container; + sourceTree = ""; + }; + D2B18B7D236090D500A9AEDC /* BaseClasses */ = { + isa = PBXGroup; + children = ( + D2E2A9A023E095AB000B42E6 /* ButtonModelProtocol.swift */, + C003506023AA94CD00B6AC29 /* Button.swift */, + D2B18B7E2360913400A9AEDC /* Control.swift */, + D2B18B802360945C00A9AEDC /* View.swift */, + 0AE14F63238315D2005417F8 /* TextField.swift */, + 0A5D59C323AD488600EFD9E9 /* Protocols */, + 0A14F6A423E4803A00EDF7F7 /* StackView.swift */, + ); + path = BaseClasses; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + D29DF0C721E404D4003B2FB9 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + D260D7B622D68514007E7233 /* MVMCoreUIPagingProtocol.h in Headers */, + D29DF18021E69E49003B2FB9 /* MFView.h in Headers */, + D29DF27921E7A533003B2FB9 /* MVMCoreUISession.h in Headers */, + D29DF29D21E7AE38003B2FB9 /* MFStyler.h in Headers */, + D29DF2B021E7B3A4003B2FB9 /* MFTextView.h in Headers */, + D29DF2A921E7B2F9003B2FB9 /* MVMCoreUIConstants.h in Headers */, + 0198F7A62256A80B0066C936 /* MFRadioButton.h in Headers */, + D22D1F1A220341F60077CEC0 /* MVMCoreUICheckBox.h in Headers */, + D29DF29921E7ADB8003B2FB9 /* ProgrammaticScrollViewController.h in Headers */, + D29DF11C21E684A9003B2FB9 /* MVMCoreUISplitViewController.h in Headers */, + D29DF29B21E7ADB9003B2FB9 /* StackableViewController.h in Headers */, + D29770F421F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsViewController.h in Headers */, + D29DF15421E69760003B2FB9 /* MVMCoreUIPanelButtonProtocol.h in Headers */, + D2A514582211C53C00345BFB /* MVMCoreUIMoleculeMappingObject.h in Headers */, + D29DF0D121E404D4003B2FB9 /* MVMCoreUI.h in Headers */, + D29DF29A21E7ADB8003B2FB9 /* MFProgrammaticTableViewController.h in Headers */, + D29DF11521E6805F003B2FB9 /* UIColor+MFConvenience.h in Headers */, + D29DF2BC21E7BEA4003B2FB9 /* TopTabbar.h in Headers */, + D29DF25921E6A22D003B2FB9 /* MFButtonProtocol.h in Headers */, + D22D1F46220496A30077CEC0 /* MVMCoreUISwitch.h in Headers */, + D22D1F1E220343560077CEC0 /* MVMCoreUICheckMarkView.h in Headers */, + D29DF28421E7AB24003B2FB9 /* MVMCoreUICommonViewsUtility.h in Headers */, + 0A21DB87235E06EF00C160A2 /* MFTextFieldSubclassExtension.h in Headers */, + D22D1F562204CE5D0077CEC0 /* MVMCoreUIStackableViewController.h in Headers */, + D29DF2CE21E7C104003B2FB9 /* MFLoadingViewController.h in Headers */, + 0A21DB84235E06EF00C160A2 /* MFTextField.h in Headers */, + D29DF12A21E6851E003B2FB9 /* MVMCoreUITopAlertView.h in Headers */, + 94FB966223D797DA003D482B /* MFTextButton.h in Headers */, + D29DF27521E79E81003B2FB9 /* MVMCoreUILoggingHandler.h in Headers */, + D29DF28B21E7AC2B003B2FB9 /* ViewConstrainingView.h in Headers */, + D29DF2B321E7B76D003B2FB9 /* MFLoadingSpinner.h in Headers */, + 94AF4A3E23E9D13900676048 /* MFCaretButton.h in Headers */, + 0A21DB8A235E06EF00C160A2 /* MFDigitTextBox.h in Headers */, + D29DF32521ED0DA2003B2FB9 /* TextButtonView.h in Headers */, + 0A21DB8C235E06EF00C160A2 /* MFDigitTextField.h in Headers */, + D296E14722A5984C0051EBE7 /* MVMCoreUIViewConstrainingProtocol.h in Headers */, + D29DF2C621E7BF57003B2FB9 /* MFTabBarInteractor.h in Headers */, + D29DF17521E69E1F003B2FB9 /* ButtonDelegateProtocol.h in Headers */, + D29DF18221E69E54003B2FB9 /* SeparatorView.h in Headers */, + D29DF26E21E6AA0B003B2FB9 /* FLAnimatedImage.h in Headers */, + D29DF11621E6805F003B2FB9 /* NSLayoutConstraint+MFConvenience.h in Headers */, + 01E569D3223FFFA500327251 /* ThreeLayerViewController.swift in Headers */, + D29DF16221E69996003B2FB9 /* MFViewController.h in Headers */, + 0A21DB88235E06EF00C160A2 /* MFMdnTextField.h in Headers */, + D29DF13121E6851E003B2FB9 /* MVMCoreUITopAlertExpandableView.h in Headers */, + D29DF2C421E7BF57003B2FB9 /* MFTabBarSwipeAnimator.h in Headers */, + D2A5145D2211D22A00345BFB /* MVMCoreUIMoleculeViewProtocol.h in Headers */, + D29DF2CA21E7BFC8003B2FB9 /* MFSizeThreshold.h in Headers */, + D29DF28021E7AA51003B2FB9 /* MVMCoreUIDetailViewProtocol.h in Headers */, + D29DF2BD21E7BEA4003B2FB9 /* MVMCoreUITabBarPageControlViewController.h in Headers */, + 94AF4A4223E9D19E00676048 /* MFCaretView.h in Headers */, + D29DF2EE21ECEADF003B2FB9 /* MFFonts.h in Headers */, + D29DF12D21E6851E003B2FB9 /* MVMCoreUITopAlertBaseView.h in Headers */, + D29770F321F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsTableViewController.h in Headers */, + D2C5001821F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.h in Headers */, + D29770FD21F7C77400B2F0D0 /* MVMCoreUITextFieldView.h in Headers */, + D29DF17421E69E1F003B2FB9 /* MFCustomButton.h in Headers */, + D29DF29721E7ADB8003B2FB9 /* MFScrollingViewController.h in Headers */, + D260D7B122D65BDD007E7233 /* MVMCoreUIPageControl.h in Headers */, + D29DF26F21E6AA0B003B2FB9 /* FLAnimatedImageView.h in Headers */, + D29DF2A121E7AF4E003B2FB9 /* MVMCoreUIUtility.h in Headers */, + D29DF17621E69E1F003B2FB9 /* PrimaryButton.h in Headers */, + D29DF2C821E7BFC1003B2FB9 /* MFSizeObject.h in Headers */, + 94F217B623E0BF6100A47C06 /* PrimaryButtonView.h in Headers */, + D29DF32021ED0CBA003B2FB9 /* LabelView.h in Headers */, + D29770C921F7C4AE00B2F0D0 /* TopLabelsView.h in Headers */, + D29DF2E121E9240B003B2FB9 /* MVMCoreUIPanelProtocol.h in Headers */, + D29DF12921E6851E003B2FB9 /* MVMCoreUITopAlertMainView.h in Headers */, + D29DF12C21E6851E003B2FB9 /* MVMCoreUITopAlertShortView.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + D29DF0CB21E404D4003B2FB9 /* MVMCoreUI */ = { + isa = PBXNativeTarget; + buildConfigurationList = D29DF0D421E404D4003B2FB9 /* Build configuration list for PBXNativeTarget "MVMCoreUI" */; + buildPhases = ( + D29DF0C721E404D4003B2FB9 /* Headers */, + D29DF0C821E404D4003B2FB9 /* Sources */, + D29DF0C921E404D4003B2FB9 /* Frameworks */, + D29DF0CA21E404D4003B2FB9 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = MVMCoreUI; + productName = MVMCoreUI; + productReference = D29DF0CC21E404D4003B2FB9 /* MVMCoreUI.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D29DF0C321E404D4003B2FB9 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1010; + ORGANIZATIONNAME = "Verizon Wireless"; + TargetAttributes = { + D29DF0CB21E404D4003B2FB9 = { + CreatedOnToolsVersion = 10.1; + LastSwiftMigration = 1010; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = D29DF0C621E404D4003B2FB9 /* Build configuration list for PBXProject "MVMCoreUI" */; + compatibilityVersion = "Xcode 8.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + es, + "es-MX", + ); + mainGroup = D29DF0C221E404D4003B2FB9; + productRefGroup = D29DF0CD21E404D4003B2FB9 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + D29DF0CB21E404D4003B2FB9 /* MVMCoreUI */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + D29DF0CA21E404D4003B2FB9 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D29DF2AF21E7B3A4003B2FB9 /* MFTextView.xib in Resources */, + D29DF31C21ECECC0003B2FB9 /* NHaasGroteskDSStd-75Bd.otf in Resources */, + D29DF31D21ECECC0003B2FB9 /* NHaasGroteskDSStd-55Rg.otf in Resources */, + 0A21DB8E235E06EF00C160A2 /* MFDigitTextField.xib in Resources */, + D29DF32C21EE8736003B2FB9 /* Localizable.strings in Resources */, + 0A21DB86235E06EF00C160A2 /* MFTextField.xib in Resources */, + D29DF31A21ECECC0003B2FB9 /* NHaasGroteskDSStd-45Lt.otf in Resources */, + D29DF32E21EE8C3D003B2FB9 /* Media.xcassets in Resources */, + D29DF31B21ECECC0003B2FB9 /* OCRAExtended.ttf in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + D29DF0C821E404D4003B2FB9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0A5D59C223AD2F5700EFD9E9 /* AppleGuidelinesProtocol.swift in Sources */, + 943784F5236B77BB006A1E82 /* GraphView.swift in Sources */, + 31BE15CC23D8924D00452370 /* CheckboxModel.swift in Sources */, + 94C661DA23CCF4FB00D9FE5B /* UIColor+Extension.swift in Sources */, + D29DF32121ED0CBA003B2FB9 /* LabelView.m in Sources */, + D28A838123CCB0D800DFE4FC /* AccordionListItemModel.swift in Sources */, + DBC4391822442197001AB423 /* CaretView.swift in Sources */, + C07065C42395677300FBF997 /* Link.swift in Sources */, + D29770F221F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsTableViewController.m in Sources */, + D29B771022C281F400D6ACE0 /* ModuleMolecule.swift in Sources */, + D28A838923CCCFCB00DFE4FC /* LinkModel.swift in Sources */, + 94C2D9A923872E5E0006CF46 /* LabelAttributeImageModel.swift in Sources */, + DBC4391922442197001AB423 /* DashLine.swift in Sources */, + 0A7BAD74232A8DC700FB8E22 /* HeadlineBodyButton.swift in Sources */, + D2FB151D23A40F1500C20E10 /* MoleculeStackItem.swift in Sources */, + D29DF29621E7ADB8003B2FB9 /* StackableViewController.m in Sources */, + 0116A4E5228B19640094F3ED /* RadioButtonModel.swift in Sources */, + 017BEB48236230DB0024EF95 /* MoleculeViewProtocol.swift in Sources */, + D2E1FADB2260D3D200AEFD8C /* MVMCoreUIDelegateObject.swift in Sources */, + D27CD40E2322EEAF00C1DC07 /* TabsTableViewCell.swift in Sources */, + D224799B231965AD003FCCF9 /* AccordionMoleculeTableViewCell.swift in Sources */, + D22D1F1F220343560077CEC0 /* MVMCoreUICheckMarkView.m in Sources */, + D2E2A99423D8CCBC000B42E6 /* HeadlineBodyLinkModel.swift in Sources */, + 01004F3022721C3800991ECC /* RadioButton.swift in Sources */, + D268C70E238C22D7007F2C1C /* DropDownFilterTableViewCell.swift in Sources */, + 017BEB3C2361EA1D0024EF95 /* MFViewController+Model.swift in Sources */, + D282AAB4223FDDAE00C46919 /* MFLoadImageView.swift in Sources */, + D29DF11721E6805F003B2FB9 /* UIColor+MFConvenience.m in Sources */, + D2B18B7F2360913400A9AEDC /* Control.swift in Sources */, + 0AA33B3A2398524F0067DD0F /* Toggle.swift in Sources */, + D29DF12F21E6851E003B2FB9 /* MVMCoreUITopAlertMainView.m in Sources */, + 012A88C8238DB02000FE3DA1 /* ModelMoleculeDelegateProtocol.swift in Sources */, + 0A7EF86123D8AC2500B2AAD1 /* DigitEntryFieldModel.swift in Sources */, + DBC4392122491730001AB423 /* LabelWithInternalButton.swift in Sources */, + D224798C231450C8003FCCF9 /* HeadlineBodyToggle.swift in Sources */, + 017BEB442362192F0024EF95 /* MVMCoreUIMoleculeMappingObject+ModelExtension.swift in Sources */, + 9445890C2385BCE300DE9FD4 /* ProgressBarModel.swift in Sources */, + 9445891F2385D2E900DE9FD4 /* CaretViewModel.swift in Sources */, + 01C851D323CF9E740021F976 /* LabelToggleModel.swift in Sources */, + D29DF2C521E7BF57003B2FB9 /* MFTabBarSwipeAnimator.m in Sources */, + D2E2A98323D8B32D000B42E6 /* EyebrowHeadlineBodyLinkModel.swift in Sources */, + 012A88AD238C418100FE3DA1 /* TemplateProtocol.swift in Sources */, + D29DF2B421E7B76D003B2FB9 /* MFLoadingSpinner.m in Sources */, + D260106323D0C05000764D80 /* StackItemModel.swift in Sources */, + D2E2A99823D8D63C000B42E6 /* ActionDetailWithImageModel.swift in Sources */, + D2E2A99D23DA3217000B42E6 /* UIStackViewAlignment+Extension.swift in Sources */, + 01EB369423609801006832FA /* HeadlineBodyModel.swift in Sources */, + 0A21DB7F235DECC500C160A2 /* EntryField.swift in Sources */, + D2E2A99F23E07F8A000B42E6 /* PillButton.swift in Sources */, + D2C5001921F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.m in Sources */, + D29DF12E21E6851E003B2FB9 /* MVMCoreUITopAlertView.m in Sources */, + D29DF2CF21E7C104003B2FB9 /* MFLoadingViewController.m in Sources */, + D28A837B23C928DA00DFE4FC /* MoleculeListCellProtocol.swift in Sources */, + 014AA72F23C5059B006F3E93 /* ThreeLayerPageTemplateModel.swift in Sources */, + 0A21DB91235E0EDB00C160A2 /* DigitBox.swift in Sources */, + D22D1F572204CE5D0077CEC0 /* MVMCoreUIStackableViewController.m in Sources */, + D28A838B23CCDA6B00DFE4FC /* ButtonModel.swift in Sources */, + D28A838D23CCDCC200DFE4FC /* PrimaryButton+MoleculeProtocolExtension.swift in Sources */, + D2A5145F2211DDC100345BFB /* MoleculeStackView.swift in Sources */, + D29DF27621E79E81003B2FB9 /* MVMCoreUILoggingHandler.m in Sources */, + C695A69623C990BC00BFB94E /* DoughnutChart.swift in Sources */, + 014AA72D23C5059B006F3E93 /* StackPageTemplateModel.swift in Sources */, + D260106123D0C02A00764D80 /* StackItemModelProtocol.swift in Sources */, + 012A88C4238D86E600FE3DA1 /* CarouselItemModelProtocol.swift in Sources */, + D2E2A9A123E095AB000B42E6 /* ButtonModelProtocol.swift in Sources */, + 94C2D9AB23872EB50006CF46 /* LabelAttributeActionModel.swift in Sources */, + D2E2A99A23D8D6B4000B42E6 /* HeadlineBodyButtonModel.swift in Sources */, + 014AA73123C5059B006F3E93 /* ListPageTemplateModel.swift in Sources */, + 017BEB4023620A230024EF95 /* TextFieldModel.swift in Sources */, + D29DF2A221E7AF4E003B2FB9 /* MVMCoreUIUtility.m in Sources */, + D29DF12B21E6851E003B2FB9 /* MVMCoreUITopAlertExpandableView.m in Sources */, + 94C2D9A723872DA90006CF46 /* LabelAttributeColorModel.swift in Sources */, + 0103B84E23D7E33A009C315C /* HeadlineBodyToggleModel.swift in Sources */, + D2755D7B23689C7500485468 /* TableViewCell.swift in Sources */, + 0A21DB85235E06EF00C160A2 /* MFTextField.m in Sources */, + 014AA72623C501E2006F3E93 /* ContainerModelProtocol.swift in Sources */, + 01EB369223609801006832FA /* MoleculeStackModel.swift in Sources */, + 012CA99E2385A2D3003F810F /* MFView+ModelExtension.swift in Sources */, + D282AABA224131D100C46919 /* MFTransparentGIFView.swift in Sources */, + 944589232385DA9600DE9FD4 /* ImageViewModel.swift in Sources */, + D213347723843825008E41B3 /* Line.swift in Sources */, + D28A837723C79FC600DFE4FC /* MFCustomButton+ActionModel.swift in Sources */, + D2E2A99C23D8D975000B42E6 /* ImageHeadlineBodyModel.swift in Sources */, + D28A837F23CCA96400DFE4FC /* TabsModel.swift in Sources */, + 012A88EC238F084D00FE3DA1 /* FooterModel.swift in Sources */, + D2A514672213885800345BFB /* HeaderView.swift in Sources */, + D29E28D823D21AB800ACEA85 /* StringAndMoleculeView.swift in Sources */, + 01EB369023609801006832FA /* ListItemModel.swift in Sources */, + D28A838323CCBD3F00DFE4FC /* CircleProgressModel.swift in Sources */, + D268C70C2386DFFD007F2C1C /* MoleculeStackItemModel.swift in Sources */, + DBEFFA04225A829700230692 /* Label.swift in Sources */, + D2D6CD4022E78C1A00D701B8 /* Scroller.swift in Sources */, + 0A7EF85F23D8ABC500B2AAD1 /* MdnEntryFieldModel.swift in Sources */, + 01509D952327ED1900EF99AA /* HeadlineBodyLinkToggle.swift in Sources */, + 31BE15CB23D8924D00452370 /* CheckboxLabelModel.swift in Sources */, + D260105523CEA7DC00764D80 /* MVMCoreUISwitch+Model.swift in Sources */, + D29DF13021E6851E003B2FB9 /* MVMCoreUITopAlertShortView.m in Sources */, + 0ABD136D237CAD1E0081388D /* DateDropdownEntryField.swift in Sources */, + 0A7EF85B23D8A52800B2AAD1 /* EntryFieldModel.swift in Sources */, + 94F217B723E0BF6100A47C06 /* PrimaryButtonView.m in Sources */, + 0A1B4A96233BB18F005B3FB4 /* CheckboxLabel.swift in Sources */, + 0A21DB8B235E06EF00C160A2 /* MFDigitTextBox.m in Sources */, + D260D7B222D65BDD007E7233 /* MVMCoreUIPageControl.m in Sources */, + D2B18B812360945C00A9AEDC /* View.swift in Sources */, + C6FA7D5423C77A4A00A3614A /* NumberedList.swift in Sources */, + D29DF26D21E6AA0B003B2FB9 /* FLAnimatedImageView.m in Sources */, + 0A7EF86723D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift in Sources */, + 94FB966323D797DA003D482B /* MFTextButton.m in Sources */, + D260105323CEA61600764D80 /* ToggleModel.swift in Sources */, + 014AA72523C501E2006F3E93 /* ContainerModel.swift in Sources */, + 0A7EF86523D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift in Sources */, + D29DF2EF21ECEAE1003B2FB9 /* MFFonts.m in Sources */, + D22479942316AE5E003FCCF9 /* NSLayoutConstraintExtension.swift in Sources */, + D2B18B94236214AD00A9AEDC /* NavigationController.swift in Sources */, + D29E28DA23D21AFA00ACEA85 /* StringAndMoleculeModel.swift in Sources */, + D282AACB2243C61700C46919 /* ButtonView.swift in Sources */, + D260105D23D0BCD400764D80 /* Stack.swift in Sources */, + 0A7EF85D23D8A95600B2AAD1 /* TextEntryFieldModel.swift in Sources */, + D2D6CD4222E78FAB00D701B8 /* ThreeLayerTemplate.swift in Sources */, + 01EB368F23609801006832FA /* LabelModel.swift in Sources */, + 0105618F224BBE7700E1557D /* FormValidator+FormParams.swift in Sources */, + 01F2A03223A4498200D954D8 /* CaretLinkModel.swift in Sources */, + 0A7BAFA1232BE61800FB8E22 /* Checkbox.swift in Sources */, + 011B58F023A2AA980085F53C /* ListItemModelProtocol.swift in Sources */, + 0A14F6A923E8750300EDF7F7 /* CarouselIndicatorModel.swift in Sources */, + D22479962316AF6E003FCCF9 /* HeadlineBodyLink.swift in Sources */, + D29DF2AE21E7B3A4003B2FB9 /* MFTextView.m in Sources */, + 0A41BA7F23453A6400D4C0BC /* TextEntryField.swift in Sources */, + 017BEB382360C6AC0024EF95 /* RadioButtonLabel.swift in Sources */, + D29DF18121E69E50003B2FB9 /* MFView.m in Sources */, + D28A837923C7D5BC00DFE4FC /* PageModelProtocol.swift in Sources */, + D29DF18321E69E54003B2FB9 /* SeparatorView.m in Sources */, + D29DF17A21E69E1F003B2FB9 /* MFCustomButton.m in Sources */, + 017BEB7B236763000024EF95 /* LineModel.swift in Sources */, + 94C2D9A523872C350006CF46 /* LabelAttributeFontModel.swift in Sources */, + 017BEB7F23676E870024EF95 /* MoleculeObjectMapping.swift in Sources */, + D274CA332236A78900B01B62 /* FooterView.swift in Sources */, + D29DF2BF21E7BEA4003B2FB9 /* MVMCoreUITabBarPageControlViewController.m in Sources */, + 0A14F69323E349EF00EDF7F7 /* CarouselIndicator.swift in Sources */, + 014AA72423C501E2006F3E93 /* MoleculeContainerModel.swift in Sources */, + D29DF28321E7AB24003B2FB9 /* MVMCoreUICommonViewsUtility.m in Sources */, + 011B58F223A2AE2C0085F53C /* DropDownListItemModel.swift in Sources */, + 94C2D9842386F3F80006CF46 /* LabelAttributeModel.swift in Sources */, + 944589212385D6E900DE9FD4 /* DashLineModel.swift in Sources */, + D2E2A99623D8CF85000B42E6 /* HeadlineBodyLinkToggleModel.swift in Sources */, + C6FA7D5323C77A4A00A3614A /* StringAndMoleculeStack.swift in Sources */, + 94AF4A3F23E9D13900676048 /* MFCaretButton.m in Sources */, + D29DF27A21E7A533003B2FB9 /* MVMCoreUISession.m in Sources */, + D2A5146B2214905000345BFB /* ThreeLayerViewController.swift in Sources */, + D28A838F23CCDEDE00DFE4FC /* TwoButtonViewModel.swift in Sources */, + 012A88B1238C880100FE3DA1 /* CarouselPagingModelProtocol.swift in Sources */, + D29DF2C921E7BFC6003B2FB9 /* MFSizeObject.m in Sources */, + 9445890E2385C3F800DE9FD4 /* MultiProgressModel.swift in Sources */, + D2A6390522CBCE160052ED1F /* MoleculeCollectionViewCell.swift in Sources */, + D2A6390122CBB1820052ED1F /* Carousel.swift in Sources */, + 0A14F6B423E8C29700EDF7F7 /* NumericIndicatorView.swift in Sources */, + D29DF2C721E7BF57003B2FB9 /* MFTabBarInteractor.m in Sources */, + D29DF29521E7ADB8003B2FB9 /* ProgrammaticScrollViewController.m in Sources */, + D2FB151B23A2B65B00C20E10 /* MoleculeContainer.swift in Sources */, + D2A638FD22CA98280052ED1F /* HeadlineBody.swift in Sources */, + D29DF16121E69996003B2FB9 /* MFViewController.m in Sources */, + 0ABD1371237DB0450081388D /* ItemDropdownEntryField.swift in Sources */, + D2E1FAE12268E81D00AEFD8C /* MoleculeListTemplate.swift in Sources */, + DB06250B2293456500B72DD3 /* LeftRightLabelView.swift in Sources */, + 0A21DB89235E06EF00C160A2 /* MFMdnTextField.m in Sources */, + D224798A2314445E003FCCF9 /* LabelToggle.swift in Sources */, + D22D1F47220496A30077CEC0 /* MVMCoreUISwitch.m in Sources */, + C695A67F23C9830600BFB94E /* UnOrderedListModel.swift in Sources */, + 017BEB4223620AD20024EF95 /* FormModelProtocol.swift in Sources */, + 012A88DB238ED45900FE3DA1 /* CarouselModel.swift in Sources */, + D29DF28C21E7AC2B003B2FB9 /* ViewConstrainingView.m in Sources */, + 0AE14F64238315D2005417F8 /* TextField.swift in Sources */, + D29DF17B21E69E1F003B2FB9 /* PrimaryButton.m in Sources */, + 017BEB4A236235BA0024EF95 /* ModelMoleculeViewProtocol.swift in Sources */, + C695A68123C9830D00BFB94E /* NumberedListModel.swift in Sources */, + 012CA99A2384A687003F810F /* MFTextField+ModelExtension.swift in Sources */, + 01EB3684236097C0006832FA /* MoleculeModelProtocol.swift in Sources */, + D27CD4102339057800C1DC07 /* EyebrowHeadlineBodyLink.swift in Sources */, + D29DF11D21E684A9003B2FB9 /* MVMCoreUISplitViewController.m in Sources */, + 0198F79F225679880066C936 /* FormValidationProtocol.swift in Sources */, + D243859923A16B1800332775 /* Container.swift in Sources */, + D260105B23D0BB7100764D80 /* StackModelProtocol.swift in Sources */, + D29DF29821E7ADB8003B2FB9 /* MFScrollingViewController.m in Sources */, + D28A839323CE828900DFE4FC /* HeadlineBodyCaretLinkImageModel.swift in Sources */, + D29770C821F7C4AE00B2F0D0 /* TopLabelsView.m in Sources */, + D260105F23D0BFFC00764D80 /* StackItem.swift in Sources */, + 9432A79F23DB47BA00719041 /* EntryFieldContainer.swift in Sources */, + 01EB369323609801006832FA /* HeaderModel.swift in Sources */, + D2E1FADF2268B8E700AEFD8C /* ThreeLayerTableViewController.swift in Sources */, + 0A21DB83235DFBC500C160A2 /* MdnEntryField.swift in Sources */, + D28A837D23CCA86A00DFE4FC /* TabsListItemModel.swift in Sources */, + 012A88C6238DA34000FE3DA1 /* ModuleMoleculeModel.swift in Sources */, + 94C2D9A123872BCC0006CF46 /* LabelAttributeUnderlineModel.swift in Sources */, + D20A9A5E2243D3E300ADE781 /* TwoButtonView.swift in Sources */, + D2B1E3E522F37D6A0065F95C /* ImageHeadlineBody.swift in Sources */, + 0A21DB94235E24ED00C160A2 /* DigitEntryField.swift in Sources */, + 0A21DB8D235E06EF00C160A2 /* MFDigitTextField.m in Sources */, + 94AF4A4323E9D19E00676048 /* MFCaretView.m in Sources */, + 943784F6236B77BB006A1E82 /* GraphViewAnimationHandler.swift in Sources */, + D29DF2AA21E7B2F9003B2FB9 /* MVMCoreUIConstants.m in Sources */, + 948DB67E2326DCD90011F916 /* MultiProgress.swift in Sources */, + D2A5146122121FBF00345BFB /* MoleculeStackTemplate.swift in Sources */, + D2E2A9A323E096B1000B42E6 /* DisableableModelProtocol.swift in Sources */, + D29DF11821E6805F003B2FB9 /* NSLayoutConstraint+MFConvenience.m in Sources */, + 94C2D9A323872C110006CF46 /* LabelAttributeStrikeThroughModel.swift in Sources */, + D28A838523CCCA8900DFE4FC /* ScrollerModel.swift in Sources */, + D29DF26C21E6AA0B003B2FB9 /* FLAnimatedImage.m in Sources */, + D28A839123CD4FD400DFE4FC /* CornerLabelsModel.swift in Sources */, + 012A88F123985E0100FE3DA1 /* Color.swift in Sources */, + 012A889C23889E8400FE3DA1 /* TemplateModelProtocol.swift in Sources */, + D29770FC21F7C77400B2F0D0 /* MVMCoreUITextFieldView.m in Sources */, + C003506123AA94CD00B6AC29 /* Button.swift in Sources */, +<<<<<<< HEAD + 0A14F6A523E4803A00EDF7F7 /* StackView.swift in Sources */, + DBC4391B224421A0001AB423 /* CaretButton.swift in Sources */, +======= + DBC4391B224421A0001AB423 /* CaretLink.swift in Sources */, +>>>>>>> develop + 0198F7A82256A80B0066C936 /* MFRadioButton.m in Sources */, + 0A6BF4722360C56C0028F841 /* BaseDropdownEntryField.swift in Sources */, + 0A41BA6E2344FCD400D4C0BC /* CATransaction+Extension.swift in Sources */, + C7192E7D23C301750050C2A0 /* HeadLineBodyCaretLinkImage.swift in Sources */, + D29DF13221E6851E003B2FB9 /* MVMCoreUITopAlertBaseView.m in Sources */, + D29DF29C21E7ADB9003B2FB9 /* MFProgrammaticTableViewController.m in Sources */, + 0105618E224BBE7700E1557D /* FormValidator+TextFields.swift in Sources */, + 0A7EF86323D8AFA000B2AAD1 /* BaseDropdownEntryFieldModel.swift in Sources */, + 0A1214A022C11A18007C7030 /* ActionDetailWithImage.swift in Sources */, + D2B18B922361E65A00A9AEDC /* CoreUIObject.swift in Sources */, + D29DF2BE21E7BEA4003B2FB9 /* TopTabbar.m in Sources */, + 014AA72E23C5059B006F3E93 /* StackCenteredPageTemplateModel.swift in Sources */, + 0A14F6B223E8C28D00EDF7F7 /* BarsIndicatorView.swift in Sources */, + D2A514632213643100345BFB /* MoleculeStackCenteredTemplate.swift in Sources */, + D260105923D0A92900764D80 /* ContainerProtocol.swift in Sources */, + C695A69423C9909000BFB94E /* DoughnutChartModel.swift in Sources */, + D29DF32421ED0DA2003B2FB9 /* TextButtonView.m in Sources */, + D29E28DD23D7404C00ACEA85 /* ContainerHelper.swift in Sources */, + 012A88C2238D7BCA00FE3DA1 /* CarouselItemModel.swift in Sources */, + D29DF29E21E7AE3B003B2FB9 /* MFStyler.m in Sources */, + D2A514592211C53C00345BFB /* MVMCoreUIMoleculeMappingObject.m in Sources */, + 94C661D923CCF4B400D9FE5B /* LeftRightLabelModel.swift in Sources */, + D21EE53C23AD3AD4003D1A30 /* NSLayoutConstraintAxis+Extension.swift in Sources */, + C6FA7D5223C77A4A00A3614A /* UnOrderedList.swift in Sources */, + 01509D8F2327EC6F00EF99AA /* MoleculeTableViewCell.swift in Sources */, + 0105618D224BBE7700E1557D /* FormValidator.swift in Sources */, + 01509D912327ECE600EF99AA /* CornerLabels.swift in Sources */, + D22D1F1B220341F60077CEC0 /* MVMCoreUICheckBox.m in Sources */, + C695A69823C990C200BFB94E /* DoughnutChartView.swift in Sources */, + D29DF2CB21E7BFCC003B2FB9 /* MFSizeThreshold.m in Sources */, + 946EE1BA237B66D80036751F /* MoleculeModelHelper.swift in Sources */, + 01509D932327ECFB00EF99AA /* ProgressBar.swift in Sources */, + D260106523D0CEA700764D80 /* StackModel.swift in Sources */, + D29770F521F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsViewController.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + D29DF32821EE8736003B2FB9 /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + D29DF32921EE8736003B2FB9 /* en */, + D29DF32A21EE8736003B2FB9 /* es */, + D29DF32B21EE8736003B2FB9 /* es-MX */, + ); + name = Localizable.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + D29DF0D221E404D4003B2FB9 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + D29DF0D321E404D4003B2FB9 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + D29DF0D521E404D4003B2FB9 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BITCODE_GENERATION_MODE = bitcode; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Automatic; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = FCMA4QKS77; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../SharedFrameworks"; + INFOPLIST_FILE = MVMCoreUI/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.vzw.MVMCoreUI; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + D29DF0D621E404D4003B2FB9 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BITCODE_GENERATION_MODE = bitcode; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Automatic; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = FCMA4QKS77; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../SharedFrameworks"; + INFOPLIST_FILE = MVMCoreUI/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.vzw.MVMCoreUI; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + D29DF0C621E404D4003B2FB9 /* Build configuration list for PBXProject "MVMCoreUI" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D29DF0D221E404D4003B2FB9 /* Debug */, + D29DF0D321E404D4003B2FB9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + D29DF0D421E404D4003B2FB9 /* Build configuration list for PBXNativeTarget "MVMCoreUI" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D29DF0D521E404D4003B2FB9 /* Debug */, + D29DF0D621E404D4003B2FB9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = D29DF0C321E404D4003B2FB9 /* Project object */; +} From 4577274e08f149f9c9709669a893a92cb7d69df2 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Fri, 7 Feb 2020 10:55:06 -0500 Subject: [PATCH 05/78] latest state of the page control --- .../CarouselIndicator/CarouselIndicator.swift | 15 ++++-- .../CarouselIndicatorModel.swift | 27 +++++++---- .../IndicatorViews/BarsIndicatorView.swift | 48 ++++++++----------- .../IndicatorViews/NumericIndicatorView.swift | 17 ++----- 4 files changed, 52 insertions(+), 55 deletions(-) diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift index 5201b920..fbd42691 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift @@ -9,7 +9,7 @@ import Foundation public protocol IndicatorViewProtocol { - func updateUI() + func updateUI(oldIndex: Int, newIndex: Int) var isEnabled: Bool { get set } var currentIndex: Int? { get set } var numberOfPages: Int? { get } @@ -118,13 +118,18 @@ open class CarouselIndicator: Control { } } + private(set) var oldIndex = 0 private var _currentIndex = 0 public var currentIndex: Int { get { return _currentIndex } - set { - guard _currentIndex != newValue else { return } - _currentIndex = newValue + set (newIndex) { + guard _currentIndex != newIndex else { return } + oldIndex = _currentIndex + _currentIndex = newIndex + sendActions(for: .valueChanged) + indicatorTappedBlock?(newIndex) + indicatorView?.updateUI(oldIndex: oldIndex, newIndex: newIndex) } } @@ -143,7 +148,7 @@ open class CarouselIndicator: Control { indicatorView = BarsIndicatorView(numberOfBars: numberOfPages) } - indicatorView?.updateUI() + indicatorView?.updateUI(oldIndex: oldIndex, newIndex: currentIndex) } } diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift index 7796b89c..04583fcc 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift @@ -10,16 +10,23 @@ import Foundation public class CarouselIndicatorModel: MoleculeModelProtocol { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- public var backgroundColor: Color? - public var barsColor: Color? - + public static var identifier: String { return "carouselIndicator" } public var moleculeName: String? public var type: String? = "hybrid" + public var barsColor: Color? + + //-------------------------------------------------- + // MARK: - Keys + //-------------------------------------------------- private enum CodingKeys: String, CodingKey { case moleculeName @@ -28,16 +35,20 @@ public class CarouselIndicatorModel: MoleculeModelProtocol { case barsColor } + //-------------------------------------------------- + // MARK: - Codec + //-------------------------------------------------- + required public init(from decoder: Decoder) throws { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) -// if let state = try typeContainer.decodeIfPresent(Bool.self, forKey: .state) { -// self.state = state -// } -// action = try typeContainer.decodeModelIfPresent(codingKey: .action, typeCodingKey: ActionCodingKey.actionType) -// alternateAction = try typeContainer.decodeModelIfPresent(codingKey: .alternateAction, typeCodingKey: ActionCodingKey.actionType) + // if let state = try typeContainer.decodeIfPresent(Bool.self, forKey: .state) { + // self.state = state + // } + // action = try typeContainer.decodeModelIfPresent(codingKey: .action, typeCodingKey: ActionCodingKey.actionType) + // alternateAction = try typeContainer.decodeModelIfPresent(codingKey: .alternateAction, typeCodingKey: ActionCodingKey.actionType) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) barsColor = try typeContainer.decodeIfPresent(Color.self, forKey: .barsColor) - type = try typeContainer.decodeIfPresent(String.self, forKey: .type) ?? "hybrid" + type = try typeContainer.decodeIfPresent(String.self, forKey: .type) ?? "hybrid" } public func encode(to encoder: Encoder) throws { diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift index 57c2530d..5122adc4 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift @@ -22,7 +22,7 @@ open class BarsIndicatorView: View, IndicatorViewProtocol { return stackView }() - var barsReference: [(View, NSLayoutConstraint)] = [] + var barsReference: [(view: View, constraint: NSLayoutConstraint)] = [] // Dimensions are based on InVision Design Guidelines. public static let indicatorBarWidth: CGFloat = 24 @@ -55,10 +55,8 @@ open class BarsIndicatorView: View, IndicatorViewProtocol { open var isEnabled: Bool = true { didSet { - if isEnabled { - - } else { - + barsReference.forEach { view, heightConstraint in + view.backgroundColor = isEnabled ? enabledColor : disabledColor } } } @@ -94,7 +92,7 @@ open class BarsIndicatorView: View, IndicatorViewProtocol { stackView.leadingAnchor.constraint(greaterThanOrEqualTo: leadingAnchor).isActive = true trailingAnchor.constraint(lessThanOrEqualTo: stackView.trailingAnchor).isActive = true - removeIndicators() + clearBars() let tapGesture = UITapGestureRecognizer() tapGesture.addTarget(self, action: #selector(indicatorTapped(_:))) @@ -114,20 +112,20 @@ open class BarsIndicatorView: View, IndicatorViewProtocol { let bar = View() bar.widthAnchor.constraint(equalToConstant: BarsIndicatorView.indicatorBarWidth).isActive = true bar.backgroundColor = enabledColor -// let barHeight = i == currentIndex ? indicatorBarWidth.indicatorBarHeight.selected : indicatorBarWidth.indicatorBarHeight.unselected -// let heightConstraint = bar.heightAnchor.constraint(equalToConstant: barHeight) -// heightConstraint.isActive = true + // let barHeight = i == currentIndex ? indicatorBarWidth.indicatorBarHeight.selected : indicatorBarWidth.indicatorBarHeight.unselected + // let heightConstraint = bar.heightAnchor.constraint(equalToConstant: barHeight) + // heightConstraint.isActive = true -// stackView.app -// bars.append((bar, heightConstraint)) + // stackView.app + // bars.append((bar, heightConstraint)) } barsReference = bars } - func removeIndicators() { - // indicatorBars.forEach { $0.removeFromSuperview() } - // indicatorBars = [] + func clearBars() { + barsReference.forEach { $0.view.removeFromSuperview() } + barsReference = [] } func indicatorTapped(_ tapGesture: UITapGestureRecognizer?) { @@ -135,15 +133,9 @@ open class BarsIndicatorView: View, IndicatorViewProtocol { if isEnabled { let touchPoint_X = tapGesture?.location(in: self).x ?? 0.0 -// let index = (indicatorView as? BarsIndicatorView)?.stackView.arrangedSubviews.firstIndex { indicator in -// return indicator.frame.maxX >= touchPoint_X && indicator.frame.minX <= touchPoint_X -// } -// -// if let selectIndex = index { -// currentIndex = selectIndex -// (indicatorView as? BarsIndicatorView)?sendActions(for: .valueChanged) -// indicatorTappedBlock?(selectIndex) -// } + currentIndex = barsReference.firstIndex { view, _ in + return view.frame.maxX >= touchPoint_X && view.frame.minX <= touchPoint_X + } } } @@ -151,14 +143,14 @@ open class BarsIndicatorView: View, IndicatorViewProtocol { // MARK: - IndicatorViewProtocol //-------------------------------------------------- - public func updateUI() { + public func updateUI(oldIndex: Int, newIndex: Int) { let expression = { -// stackView.arrangedSubviews[oldIndex].heightConstraint?.constant = BarsIndicatorView.indicatorBarHeight.unselected -// self.heightConstraint?.constant = BarsIndicatorView.indicatorBarHeight.selected -// self.layoutIfNeeded() + self.barsReference[oldIndex].constraint.constant = BarsIndicatorView.indicatorBarHeight.unselected + self.barsReference[newIndex].constraint.constant = BarsIndicatorView.indicatorBarHeight.selected + self.layoutIfNeeded() } -// isAnimated ? UIView.animate(withDuration: 0.3) { expression() } : expression() + isAnimated ? UIView.animate(withDuration: 0.3) { expression() } : expression() } } diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/NumericIndicatorView.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/NumericIndicatorView.swift index 4607dd2c..c4b7ae39 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/NumericIndicatorView.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/NumericIndicatorView.swift @@ -22,22 +22,11 @@ open class NumericIndicatorView: View, IndicatorViewProtocol { return label }() - // Left and right arrows for Numeric indicator open var leftArrow = MFLoadImageView() open var rightArrow = MFLoadImageView() - // open var activeColor: (enabled: UIColor, disabled: UIColor) - - open var isEnabled: Bool = true { - didSet { - if isEnabled { - - } else { - - } - } - } + open var isEnabled: Bool = true /// Returns the currentIndex from its parent CarouselIndicator. public var currentIndex: Int? { @@ -148,12 +137,12 @@ open class NumericIndicatorView: View, IndicatorViewProtocol { // MARK: - IndicatorViewProtocol //-------------------------------------------------- - open func updateUI() { + open func updateUI(oldIndex: Int, newIndex: Int) { DispatchQueue.main.async { [weak self] in guard let self = self else { return } - self.titleLabel.text = "\(self.currentIndex)/\(self.numberOfPages)" + self.titleLabel.text = "\(newIndex)/\(self.numberOfPages ?? 0)" self.layoutIfNeeded() (self.superview as? CarouselIndicator)?.sendActions(for: .valueChanged) } From fd72f5ff9553bfef5bdf8bed7685f4487ec7a33d Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Thu, 13 Feb 2020 12:42:38 -0500 Subject: [PATCH 06/78] work in progress --- MVMCoreUI.xcodeproj/project.pbxproj | 16 +- MVMCoreUI/Atoms/Views/Arrow.swift | 24 +++ MVMCoreUI/Atoms/Views/ArrowModel.swift | 61 ++++++ .../CarouselIndicator/CarouselIndicator.swift | 183 +++++++++--------- .../CarouselIndicatorModel.swift | 21 +- .../IndicatorViews/BarsIndicatorView.swift | 156 --------------- .../IndicatorViews/NumericIndicatorView.swift | 63 ++---- .../CarouselPagingModelProtocol.swift | 3 +- .../Molecules/Items/CarouselItemModel.swift | 12 ++ MVMCoreUI/Organisms/Carousel.swift | 81 ++++---- MVMCoreUI/Organisms/CarouselModel.swift | 70 ++++--- .../OtherHandlers/MoleculeObjectMapping.swift | 2 + 12 files changed, 323 insertions(+), 369 deletions(-) create mode 100644 MVMCoreUI/Atoms/Views/Arrow.swift create mode 100644 MVMCoreUI/Atoms/Views/ArrowModel.swift delete mode 100644 MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift diff --git a/MVMCoreUI.xcodeproj/project.pbxproj b/MVMCoreUI.xcodeproj/project.pbxproj index a9d17c99..081f3f68 100644 --- a/MVMCoreUI.xcodeproj/project.pbxproj +++ b/MVMCoreUI.xcodeproj/project.pbxproj @@ -63,7 +63,6 @@ 0A14F69323E349EF00EDF7F7 /* CarouselIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A14F69223E349EF00EDF7F7 /* CarouselIndicator.swift */; }; 0A14F6A523E4803A00EDF7F7 /* StackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A14F6A423E4803A00EDF7F7 /* StackView.swift */; }; 0A14F6A923E8750300EDF7F7 /* CarouselIndicatorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A14F6A823E8750300EDF7F7 /* CarouselIndicatorModel.swift */; }; - 0A14F6B223E8C28D00EDF7F7 /* BarsIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A14F6B123E8C28D00EDF7F7 /* BarsIndicatorView.swift */; }; 0A14F6B423E8C29700EDF7F7 /* NumericIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A14F6B323E8C29700EDF7F7 /* NumericIndicatorView.swift */; }; 0A1B4A96233BB18F005B3FB4 /* CheckboxLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7BAFA2232BE63400FB8E22 /* CheckboxLabel.swift */; }; 0A21DB7F235DECC500C160A2 /* EntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A21DB7E235DECC500C160A2 /* EntryField.swift */; }; @@ -94,7 +93,10 @@ 0A7EF86323D8AFA000B2AAD1 /* BaseDropdownEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF86223D8AFA000B2AAD1 /* BaseDropdownEntryFieldModel.swift */; }; 0A7EF86523D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF86423D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift */; }; 0A7EF86723D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF86623D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift */; }; + 0A9F3DE823EDE9F200318918 /* Arrow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A9F3DE723EDE9F200318918 /* Arrow.swift */; }; + 0A9F3DEA23EDEA1A00318918 /* ArrowModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A9F3DE923EDEA1A00318918 /* ArrowModel.swift */; }; 0AA33B3A2398524F0067DD0F /* Toggle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AA33B392398524F0067DD0F /* Toggle.swift */; }; + 0AB2AA2323F19CFA00C6D3CF /* BarsIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AB2AA2223F19CFA00C6D3CF /* BarsIndicatorView.swift */; }; 0ABD136D237CAD1E0081388D /* DateDropdownEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ABD136C237CAD1E0081388D /* DateDropdownEntryField.swift */; }; 0ABD1371237DB0450081388D /* ItemDropdownEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ABD1370237DB0450081388D /* ItemDropdownEntryField.swift */; }; 0AE14F64238315D2005417F8 /* TextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AE14F63238315D2005417F8 /* TextField.swift */; }; @@ -394,7 +396,6 @@ 0A14F69223E349EF00EDF7F7 /* CarouselIndicator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarouselIndicator.swift; sourceTree = ""; }; 0A14F6A423E4803A00EDF7F7 /* StackView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StackView.swift; sourceTree = ""; }; 0A14F6A823E8750300EDF7F7 /* CarouselIndicatorModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarouselIndicatorModel.swift; sourceTree = ""; }; - 0A14F6B123E8C28D00EDF7F7 /* BarsIndicatorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BarsIndicatorView.swift; sourceTree = ""; }; 0A14F6B323E8C29700EDF7F7 /* NumericIndicatorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NumericIndicatorView.swift; sourceTree = ""; }; 0A209CD223A7E2810068F8B0 /* UIStackViewAlignment+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIStackViewAlignment+Extension.swift"; sourceTree = ""; }; 0A21DB7E235DECC500C160A2 /* EntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EntryField.swift; sourceTree = ""; }; @@ -415,8 +416,11 @@ 0A7EF86423D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemDropdownEntryFieldModel.swift; sourceTree = ""; }; 0A7EF86623D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateDropdownEntryFieldModel.swift; sourceTree = ""; }; 0A8321AE2355FE9500CB7F00 /* DigitBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DigitBox.swift; sourceTree = ""; }; + 0A9F3DE723EDE9F200318918 /* Arrow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Arrow.swift; sourceTree = ""; }; + 0A9F3DE923EDEA1A00318918 /* ArrowModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArrowModel.swift; sourceTree = ""; }; 0AA33B33239813C50067DD0F /* UIColor+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+Extension.swift"; sourceTree = ""; }; 0AA33B392398524F0067DD0F /* Toggle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Toggle.swift; sourceTree = ""; }; + 0AB2AA2223F19CFA00C6D3CF /* BarsIndicatorView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BarsIndicatorView.swift; sourceTree = ""; }; 0ABD136C237CAD1E0081388D /* DateDropdownEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateDropdownEntryField.swift; sourceTree = ""; }; 0ABD1370237DB0450081388D /* ItemDropdownEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemDropdownEntryField.swift; sourceTree = ""; }; 0AE14F63238315D2005417F8 /* TextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextField.swift; sourceTree = ""; }; @@ -742,7 +746,7 @@ 0A14F6B723ECA7F900EDF7F7 /* IndicatorViews */ = { isa = PBXGroup; children = ( - 0A14F6B123E8C28D00EDF7F7 /* BarsIndicatorView.swift */, + 0AB2AA2223F19CFA00C6D3CF /* BarsIndicatorView.swift */, 0A14F6B323E8C29700EDF7F7 /* NumericIndicatorView.swift */, ); path = IndicatorViews; @@ -1241,6 +1245,8 @@ 0AA33B392398524F0067DD0F /* Toggle.swift */, D260105423CEA7DC00764D80 /* MVMCoreUISwitch+Model.swift */, 012CA99D2385A2D3003F810F /* MFView+ModelExtension.swift */, + 0A9F3DE723EDE9F200318918 /* Arrow.swift */, + 0A9F3DE923EDEA1A00318918 /* ArrowModel.swift */, ); path = Views; sourceTree = ""; @@ -1688,6 +1694,7 @@ D2B18B94236214AD00A9AEDC /* NavigationController.swift in Sources */, D29E28DA23D21AFA00ACEA85 /* StringAndMoleculeModel.swift in Sources */, D282AACB2243C61700C46919 /* ButtonView.swift in Sources */, + 0A9F3DE823EDE9F200318918 /* Arrow.swift in Sources */, D260105D23D0BCD400764D80 /* Stack.swift in Sources */, 0A7EF85D23D8A95600B2AAD1 /* TextEntryFieldModel.swift in Sources */, D2D6CD4222E78FAB00D701B8 /* ThreeLayerTemplate.swift in Sources */, @@ -1773,9 +1780,11 @@ 943784F6236B77BB006A1E82 /* GraphViewAnimationHandler.swift in Sources */, D29DF2AA21E7B2F9003B2FB9 /* MVMCoreUIConstants.m in Sources */, 948DB67E2326DCD90011F916 /* MultiProgress.swift in Sources */, + 0A9F3DEA23EDEA1A00318918 /* ArrowModel.swift in Sources */, D2A5146122121FBF00345BFB /* MoleculeStackTemplate.swift in Sources */, D2E2A9A323E096B1000B42E6 /* DisableableModelProtocol.swift in Sources */, D29DF11821E6805F003B2FB9 /* NSLayoutConstraint+MFConvenience.m in Sources */, + 0AB2AA2323F19CFA00C6D3CF /* BarsIndicatorView.swift in Sources */, 94C2D9A323872C110006CF46 /* LabelAttributeStrikeThroughModel.swift in Sources */, D28A838523CCCA8900DFE4FC /* ScrollerModel.swift in Sources */, D29DF26C21E6AA0B003B2FB9 /* FLAnimatedImage.m in Sources */, @@ -1798,7 +1807,6 @@ D2B18B922361E65A00A9AEDC /* CoreUIObject.swift in Sources */, D29DF2BE21E7BEA4003B2FB9 /* TopTabbar.m in Sources */, 014AA72E23C5059B006F3E93 /* StackCenteredPageTemplateModel.swift in Sources */, - 0A14F6B223E8C28D00EDF7F7 /* BarsIndicatorView.swift in Sources */, D2A514632213643100345BFB /* MoleculeStackCenteredTemplate.swift in Sources */, D260105923D0A92900764D80 /* ContainerProtocol.swift in Sources */, C695A69423C9909000BFB94E /* DoughnutChartModel.swift in Sources */, diff --git a/MVMCoreUI/Atoms/Views/Arrow.swift b/MVMCoreUI/Atoms/Views/Arrow.swift new file mode 100644 index 00000000..12179dba --- /dev/null +++ b/MVMCoreUI/Atoms/Views/Arrow.swift @@ -0,0 +1,24 @@ +// +// Arrow.swift +// MVMCoreUI +// +// Created by Kevin Christiano on 2/7/20. +// Copyright © 2020 Verizon Wireless. All rights reserved. +// + +import Foundation + + +open class Arrow: View { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + + public var color: Color? + + //-------------------------------------------------- + // MARK: - Initializers + //-------------------------------------------------- + + +} diff --git a/MVMCoreUI/Atoms/Views/ArrowModel.swift b/MVMCoreUI/Atoms/Views/ArrowModel.swift new file mode 100644 index 00000000..eff64b97 --- /dev/null +++ b/MVMCoreUI/Atoms/Views/ArrowModel.swift @@ -0,0 +1,61 @@ + +// +// ArrowModel.swift +// MVMCoreUI +// +// Created by Kevin Christiano on 2/7/20. +// Copyright © 2020 Verizon Wireless. All rights reserved. +// + +import Foundation + +public class ArrowModel: MoleculeModelProtocol { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + + public var moleculeName: String? + public var backgroundColor: Color? + + public static var identifier: String { + return "arrow" + } + + public var enabledColor: Color? + public var disabledColor: Color? + + //-------------------------------------------------- + // MARK: - Keys + //-------------------------------------------------- + + private enum CodingKeys: String, CodingKey { + case moleculeName + case backgroundColor + case enabledColor + case disabledColor + } + + //-------------------------------------------------- + // MARK: - Codec + //-------------------------------------------------- + + required public init(from decoder: Decoder) throws { + let typeContainer = try decoder.container(keyedBy: CodingKeys.self) + // if let state = try typeContainer.decodeIfPresent(Bool.self, forKey: .state) { + // self.state = state + // } + // action = try typeContainer.decodeModelIfPresent(codingKey: .action, typeCodingKey: ActionCodingKey.actionType) + // alternateAction = try typeContainer.decodeModelIfPresent(codingKey: .alternateAction, typeCodingKey: ActionCodingKey.actionType) + backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) + disabledColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledColor) + enabledColor = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledColor) + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) + try container.encodeIfPresent(enabledColor, forKey: .enabledColor) + try container.encode(moleculeName, forKey: .moleculeName) + try container.encodeIfPresent(disabledColor, forKey: .disabledColor) + } +} diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift index fbd42691..f263d7b9 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift @@ -9,13 +9,19 @@ import Foundation public protocol IndicatorViewProtocol { - func updateUI(oldIndex: Int, newIndex: Int) + func updateUI(previousIndex: Int, newIndex: Int, totalCount: Int, isAnimated: Bool) + func reset() var isEnabled: Bool { get set } - var currentIndex: Int? { get set } - var numberOfPages: Int? { get } } + open class CarouselIndicator: Control { + //-------------------------------------------------- + // MARK: - Outlets + //-------------------------------------------------- + + public typealias IndicatorView = UIView & IndicatorViewProtocol + //-------------------------------------------------- // MARK: - Constraints //-------------------------------------------------- @@ -27,8 +33,6 @@ open class CarouselIndicator: Control { // MARK: - Properties //-------------------------------------------------- - public typealias IndicatorView = UIView & IndicatorViewProtocol - /// The types of indicators that can appear. public enum IndicatorType: String { case bar @@ -38,47 +42,42 @@ open class CarouselIndicator: Control { /// Determines interactivity and appearance of the indicator. public var indicatorType: IndicatorType = .hybrid { - didSet { - assignIndicatorView() - } + didSet { assignIndicatorView() } + } + + /// The currently active indicator view. + public var currentIndicator: IndicatorView? + + public var carouselIndicatorModel: CarouselIndicatorModel? { + return model as? CarouselIndicatorModel } /// The view control relative to the state of the indicator type. private(set) var indicatorView: IndicatorView? { didSet { - topConstraint = indicatorView!.topAnchor.constraint(equalTo: topAnchor, constant: PaddingTwo) + topConstraint = indicatorView?.topAnchor.constraint(equalTo: topAnchor, constant: PaddingTwo) topConstraint?.isActive = true - bottomConstraint = bottomAnchor.constraint(equalTo: indicatorView!.bottomAnchor, constant: PaddingTwo) - bottomConstraint?.isActive = true + if let indicatorView = indicatorView { + bottomConstraint = bottomAnchor.constraint(equalTo: indicatorView.bottomAnchor, constant: PaddingTwo) + bottomConstraint?.isActive = true + } } } /// The maxmum count of pages before the indicatorView forces a numeric Indicator insead of Bar. public var hybridThreshold: Int = 5 - /// Spacing used between bars of the Bars Indicator and between the title and arrows of the Numeric Indicator - public var indicatorBarSpacing: CGFloat = 6 { - didSet { - if let stackView = indicatorView as? StackView { - stackView.spacing = indicatorBarSpacing - stackView.layoutIfNeeded() - } - } - } - - // private(set) var indicatorBars = [BarIndicator]() - /// Set this closure to perform an action when a different indicator was selected. - public var indicatorTappedBlock: ((Int)->())? + public var indicatorTouchAction: ((Int)->())? /// Allows sendActions() to trigger even if index is min/max index. - public var alwaysSendControlEvent = false + public var alwaysSendEvent = false /// Set true to make the accessibility value as "Slide #currentPage of #totalPage", otherwise will be "Page #currentPage of #totalPage", default is false - public var isSlidesAccessibile = false + public var accessibilityHasSlidesInsteadOfPage = false - public var isAnimated = false + public var isAnimated = true /// Will hide this control if page count is 1. public var hidesForSinglePage = false { @@ -97,11 +96,7 @@ open class CarouselIndicator: Control { } else { if let stackView = indicatorView as? BarsIndicatorView { - stackView.stackView.arrangedSubviews.forEach { view in - // if let indicator = { - (view as? BarsIndicatorView)?.isEnabled = isEnabled - // } - } + stackView.stackView.arrangedSubviews.forEach { ($0 as? BarsIndicatorView)?.isEnabled = isEnabled } } } } @@ -111,25 +106,22 @@ open class CarouselIndicator: Control { // MARK: - Computed Properties //-------------------------------------------------- - /// The currently active indicator view. - public weak var currentIndicator: IndicatorView? { - didSet { - - } - } - - private(set) var oldIndex = 0 + private(set) var previousIndex = 0 private var _currentIndex = 0 public var currentIndex: Int { get { return _currentIndex } set (newIndex) { guard _currentIndex != newIndex else { return } - oldIndex = _currentIndex + + previousIndex = _currentIndex _currentIndex = newIndex sendActions(for: .valueChanged) - indicatorTappedBlock?(newIndex) - indicatorView?.updateUI(oldIndex: oldIndex, newIndex: newIndex) + indicatorTouchAction?(newIndex) + indicatorView?.updateUI(previousIndex: previousIndex, + newIndex: newIndex, + totalCount: numberOfPages, + isAnimated: isAnimated) } } @@ -137,44 +129,46 @@ open class CarouselIndicator: Control { public var numberOfPages: Int { get { return _numberOfPages } - set { - guard _numberOfPages != newValue else { return } - _numberOfPages = newValue + set (newTotal) { + guard _numberOfPages != newTotal else { return } + _numberOfPages = newTotal - if hidesForSinglePage && newValue <= 1 { + if hidesForSinglePage && newTotal <= 1 { isHidden = true } else { isHidden = false - indicatorView = BarsIndicatorView(numberOfBars: numberOfPages) + indicatorView = BarsIndicatorView() } - indicatorView?.updateUI(oldIndex: oldIndex, newIndex: currentIndex) + if alwaysSendEvent { + sendActions(for: .valueChanged) + } + + indicatorView?.updateUI(previousIndex: previousIndex, + newIndex: currentIndex, + totalCount: newTotal, + isAnimated: isAnimated) } } - private var _indicatorTintColor: UIColor = .mvmCoolGray6 + public var disabledIndicatorColor: UIColor = .mvmCoolGray3 + + private var _indicatorTintColor: UIColor = .black public var indicatorTintColor: UIColor { get { return _indicatorTintColor } - set { - _indicatorTintColor = newValue - if isBarIndicator(), let barsView = (indicatorView as? BarsIndicatorView)?.stackView.arrangedSubviews.isEmpty { - indicatorView = BarsIndicatorView(numberOfBars: numberOfPages) - } - (indicatorView as? BarsIndicatorView)?.stackView.arrangedSubviews.forEach { $0.backgroundColor = newValue} + set (newColor) { + _indicatorTintColor = newColor } } - private var _currentPageIndicatorTintColor: UIColor = .black + private var _currentIndicatorColor: UIColor = .black - public var currentPageIndicatorTintColor: UIColor { - get { return _currentPageIndicatorTintColor } - set { - _currentPageIndicatorTintColor = newValue - if ((indicatorView as? BarsIndicatorView)?.stackView.arrangedSubviews.isEmpty)! { - indicatorView = BarsIndicatorView(numberOfBars: numberOfPages) - } - currentIndicator?.backgroundColor = newValue + /// Colors the currently selected index, unique from other indicators + public var currentIndicatorColor: UIColor { + get { return _currentIndicatorColor } + set (newColor) { + _currentIndicatorColor = newColor } } @@ -213,45 +207,57 @@ open class CarouselIndicator: Control { open override func setupView() { super.setupView() - if indicatorView == nil { - - assignIndicatorView() - - if let accessibleValue = MVMCoreUIUtility.hardcodedString(withKey: isSlidesAccessibile ? "MVMCoreUIPageControlslides_currentpage_index" : "MVMCoreUIPageControl_currentpage_index") { - accessibilityValue = String(format: accessibleValue, currentIndex + 1, numberOfPages) - } + guard indicatorView == nil else { return } + + assignIndicatorView() + + if let accessibleValue = MVMCoreUIUtility.hardcodedString(withKey: accessibilityHasSlidesInsteadOfPage ? "MVMCoreUIPageControlslides_currentpage_index" : "MVMCoreUIPageControl_currentpage_index") { + accessibilityValue = String(format: accessibleValue, currentIndex + 1, numberOfPages) } } - open override func updateView(_ size: CGFloat) { - super.updateView(size) + //-------------------------------------------------- + // MARK: - UITouch + //-------------------------------------------------- + + @objc func pageValueIncrement() { + + currentIndex = min(currentIndex + 1, numberOfPages - 1) + } + + @objc func pageValueDecrement() { + + currentIndex = max(0, currentIndex - 1) + } + + func indicatorTapped(_ tapGesture: UITapGestureRecognizer?) { + + if isEnabled, let bars = (indicatorView as? BarsIndicatorView)?.barsReference { + let touchPoint_X = tapGesture?.location(in: self).x ?? 0.0 + + currentIndex = bars.firstIndex { $0.0.frame.maxX >= touchPoint_X && $0.0.frame.minX <= touchPoint_X } ?? 0 + } } //-------------------------------------------------- // MARK: - Methods //-------------------------------------------------- + /// Sets the indicatorView based on the current indicatorType. func assignIndicatorView() { switch indicatorType { case .bar: - indicatorView = BarsIndicatorView(numberOfBars: numberOfPages) + indicatorView = BarsIndicatorView() case .numeric: indicatorView = NumericIndicatorView() case .hybrid: - indicatorView = numberOfPages >= hybridThreshold ? NumericIndicatorView() : BarsIndicatorView(numberOfBars: numberOfPages) + indicatorView = numberOfPages >= hybridThreshold ? NumericIndicatorView() : BarsIndicatorView() } } - /// Removes all indicators from their subview and then clears the holding array. - func removeIndicatorView() { - - // indicatorBars.forEach { $0.removeFromSuperview() } - // indicatorBars = [] - } - /// Convenience to determine if current view is displaying bars. func isBarIndicator() -> Bool { return indicatorType != .bar && numberOfPages > hybridThreshold @@ -266,11 +272,8 @@ open class CarouselIndicator: Control { guard let model = model as? CarouselIndicatorModel else { return } - if let type = model.type, let indicator = IndicatorType(rawValue: type) { - indicatorType = indicator - } - - // backgroundColor = model.backgroundColor?.uiColor + indicatorType = IndicatorType(rawValue: model.type ?? "") ?? .hybrid + backgroundColor = model.backgroundColor?.uiColor // barsColor = model.barsColor // pageIndicatorTintColor // currentPageIndicatorTintColor @@ -290,11 +293,11 @@ open class CarouselIndicator: Control { func accessibilityAdjust(toPage index: Int) { - if (index < numberOfPages && index >= 0) || alwaysSendControlEvent { + if (index < numberOfPages && index >= 0) || alwaysSendEvent { isAnimated = false currentIndex = index sendActions(for: .valueChanged) - indicatorTappedBlock?(index) + indicatorTouchAction?(index) } } diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift index 04583fcc..074b0570 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift @@ -22,7 +22,19 @@ public class CarouselIndicatorModel: MoleculeModelProtocol { public var moleculeName: String? public var type: String? = "hybrid" + public var hybridThreshold: Int = 5 public var barsColor: Color? + public var currentBarColor: Color? + public var currentIndex: Int? = 0 + public var numberOfPages: Int? = 0 + public var alwaysSendEvent: Bool? = false + public var isAnimated: Bool? = true + public var hidesForSinglePage: Bool? = false + public var accessibilityHasSlidesInsteadOfPage: Bool? = false + public var isEnabled: Bool? = false + public var disabledIndicatorColor: Color? = Color(uiColor: .mvmCoolGray3) + public var indicatorTintColor: Color? = Color(uiColor: .black) + public var currentIndicatorColor: Color? = Color(uiColor: .black) //-------------------------------------------------- // MARK: - Keys @@ -33,6 +45,7 @@ public class CarouselIndicatorModel: MoleculeModelProtocol { case backgroundColor case type case barsColor + case currentBarColor } //-------------------------------------------------- @@ -41,11 +54,8 @@ public class CarouselIndicatorModel: MoleculeModelProtocol { required public init(from decoder: Decoder) throws { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) - // if let state = try typeContainer.decodeIfPresent(Bool.self, forKey: .state) { - // self.state = state - // } - // action = try typeContainer.decodeModelIfPresent(codingKey: .action, typeCodingKey: ActionCodingKey.actionType) - // alternateAction = try typeContainer.decodeModelIfPresent(codingKey: .alternateAction, typeCodingKey: ActionCodingKey.actionType) + + currentBarColor = try typeContainer.decodeIfPresent(Color.self, forKey: .currentBarColor) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) barsColor = try typeContainer.decodeIfPresent(Color.self, forKey: .barsColor) type = try typeContainer.decodeIfPresent(String.self, forKey: .type) ?? "hybrid" @@ -55,6 +65,7 @@ public class CarouselIndicatorModel: MoleculeModelProtocol { var container = encoder.container(keyedBy: CodingKeys.self) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) try container.encodeIfPresent(barsColor, forKey: .barsColor) + try container.encodeIfPresent(currentBarColor, forKey: .currentBarColor) try container.encode(moleculeName, forKey: .moleculeName) try container.encodeIfPresent(type, forKey: .type) } diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift deleted file mode 100644 index 5122adc4..00000000 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift +++ /dev/null @@ -1,156 +0,0 @@ -// -// BarIndicatorView.swift -// MVMCoreUI -// -// Created by Kevin Christiano on 2/3/20. -// Copyright © 2020 Verizon Wireless. All rights reserved. -// - -import UIKit - - -open class BarsIndicatorView: View, IndicatorViewProtocol { - //-------------------------------------------------- - // MARK: - Properties - //-------------------------------------------------- - - let stackView: StackView = { - let stackView = StackView() - stackView.axis = .horizontal - stackView.distribution = .equalSpacing - stackView.spacing = PaddingOne - return stackView - }() - - var barsReference: [(view: View, constraint: NSLayoutConstraint)] = [] - - // Dimensions are based on InVision Design Guidelines. - public static let indicatorBarWidth: CGFloat = 24 - public static let indicatorBarHeight: (selected: CGFloat, unselected: CGFloat) = (selected: 4, unselected: 1) - - public var enabledColor: UIColor = .black - public var disabledColor: UIColor = .mvmCoolGray3 - - private var oldIndex: Int = 0 - - /// Returns the currentIndex from its parent CarouselIndicator. - public var currentIndex: Int? { - get { return (superview as? CarouselIndicator)?.currentIndex } - set { - guard let newValue = newValue else { return } - (superview as? CarouselIndicator)?.currentIndex = newValue - } - } - - /// Returns the numberOfPages count from its parent CarouselIndicator. - public var numberOfPages: Int? { - return (superview as? CarouselIndicator)?.numberOfPages - } - - public var numberOfBars: Int = 0 { - didSet { - // TODO: Generate bars... - } - } - - open var isEnabled: Bool = true { - didSet { - barsReference.forEach { view, heightConstraint in - view.backgroundColor = isEnabled ? enabledColor : disabledColor - } - } - } - - open var isAnimated: Bool { - return (superview as? CarouselIndicator)?.isAnimated ?? true - } - - //-------------------------------------------------- - // MARK: - Initializers - //-------------------------------------------------- - - public init(numberOfBars: Int) { - super.init(frame: .zero) - self.numberOfBars = numberOfBars - } - - public required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - //-------------------------------------------------- - // MARK: - Setup - //-------------------------------------------------- - - open override func setupView() { - super.setupView() - - if subviews.isEmpty { - addSubview(stackView) - - stackView.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true - stackView.leadingAnchor.constraint(greaterThanOrEqualTo: leadingAnchor).isActive = true - trailingAnchor.constraint(lessThanOrEqualTo: stackView.trailingAnchor).isActive = true - - clearBars() - - let tapGesture = UITapGestureRecognizer() - tapGesture.addTarget(self, action: #selector(indicatorTapped(_:))) - addGestureRecognizer(tapGesture) - } - } - - //-------------------------------------------------- - // MARK: - Methods - //-------------------------------------------------- - - func generateBars() { - - var bars = [(View, NSLayoutConstraint)]() - - for i in 0..= touchPoint_X && view.frame.minX <= touchPoint_X - } - } - } - - //-------------------------------------------------- - // MARK: - IndicatorViewProtocol - //-------------------------------------------------- - - public func updateUI(oldIndex: Int, newIndex: Int) { - - let expression = { - self.barsReference[oldIndex].constraint.constant = BarsIndicatorView.indicatorBarHeight.unselected - self.barsReference[newIndex].constraint.constant = BarsIndicatorView.indicatorBarHeight.selected - self.layoutIfNeeded() - } - - isAnimated ? UIView.animate(withDuration: 0.3) { expression() } : expression() - } -} diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/NumericIndicatorView.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/NumericIndicatorView.swift index c4b7ae39..95ea16d1 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/NumericIndicatorView.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/NumericIndicatorView.swift @@ -22,24 +22,24 @@ open class NumericIndicatorView: View, IndicatorViewProtocol { return label }() - // Left and right arrows for Numeric indicator - open var leftArrow = MFLoadImageView() - open var rightArrow = MFLoadImageView() - open var isEnabled: Bool = true + public var parentCarouselIndicator: CarouselIndicator? { + return superview as? CarouselIndicator + } + /// Returns the currentIndex from its parent CarouselIndicator. public var currentIndex: Int? { - get { return (superview as? CarouselIndicator)?.currentIndex } + get { return parentCarouselIndicator?.currentIndex } set { guard let newValue = newValue else { return } - (superview as? CarouselIndicator)?.currentIndex = newValue + parentCarouselIndicator?.currentIndex = newValue } } /// Returns the numberOfPages count from its parent CarouselIndicator. public var numberOfPages: Int? { - return (superview as? CarouselIndicator)?.numberOfPages + return parentCarouselIndicator?.numberOfPages } //-------------------------------------------------- @@ -76,37 +76,27 @@ open class NumericIndicatorView: View, IndicatorViewProtocol { guard subviews.isEmpty else { return } + isUserInteractionEnabled = false + addSubview(titleLabel) titleLabel.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true NSLayoutConstraint.constraintPinSubview(titleLabel, pinTop: true, pinBottom: true, pinLeft: false, pinRight: false) + let arrow = UIImage(named: "peakingRightArrow")?.withHorizontallyFlippedOrientation() + let leftArrow = UIImageView(image: arrow) + leftArrow.isUserInteractionEnabled = true + addSubview(leftArrow) NSLayoutConstraint.constraintPinView(leftArrow, heightConstraint: true, heightConstant: PaddingTwo, widthConstraint: true, widthConstant: PaddingTwo) leftArrow.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true - leftArrow.isUserInteractionEnabled = true - leftArrow.loadImage(withName: "peakingRightArrow", width: nil, height: nil) { [weak self] image, _, _ in - DispatchQueue.main.async { [weak self] in - guard let image = image else { return } - self?.leftArrow.imageView.image = image.withHorizontallyFlippedOrientation() - self?.leftArrow.layoutIfNeeded() - } - } - - let leftTap = UITapGestureRecognizer() - leftTap.addTarget(self, action: #selector(pageValueDecrement)) - leftArrow.addGestureRecognizer(leftTap) - - rightArrow.loadImage(withName: "peakingRightArrow") + let rightArrow = UIImageView(image: UIImage(named: "peakingRightArrow")) addSubview(rightArrow) + NSLayoutConstraint.constraintPinView(rightArrow, heightConstraint: true, heightConstant: PaddingTwo, widthConstraint: true, widthConstant: PaddingTwo) rightArrow.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true rightArrow.isUserInteractionEnabled = true - let rightTap = UITapGestureRecognizer() - rightTap.addTarget(self, action: #selector(pageValueIncrement)) - rightArrow.addGestureRecognizer(rightTap) - NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: "H:|-0-[leftArrowView]-(padding)-[titleLabel]-(padding)-[rightArrowView]-0-|", options: .directionLeadingToTrailing, metrics: ["padding": PaddingOne], @@ -115,36 +105,17 @@ open class NumericIndicatorView: View, IndicatorViewProtocol { "rightArrowView": rightArrow])) } - //-------------------------------------------------- - // MARK: - Actions - //-------------------------------------------------- - - @objc func pageValueIncrement() { - guard let currentIndex = currentIndex, - let numberOfPages = numberOfPages - else { return } - - self.currentIndex = min(currentIndex + 1, numberOfPages - 1) - } - - @objc func pageValueDecrement() { - guard let currentIndex = currentIndex else { return } - - self.currentIndex = max(0, currentIndex - 1) - } - //-------------------------------------------------- // MARK: - IndicatorViewProtocol //-------------------------------------------------- - open func updateUI(oldIndex: Int, newIndex: Int) { + open func updateUI(previousIndex oldIndex: Int, newIndex: Int, totalCount: Int, isAnimated: Bool) { DispatchQueue.main.async { [weak self] in guard let self = self else { return } - self.titleLabel.text = "\(newIndex)/\(self.numberOfPages ?? 0)" + self.titleLabel.text = "\(newIndex)/\(totalCount)" self.layoutIfNeeded() - (self.superview as? CarouselIndicator)?.sendActions(for: .valueChanged) } } } diff --git a/MVMCoreUI/Models/ModelProtocols/CarouselPagingModelProtocol.swift b/MVMCoreUI/Models/ModelProtocols/CarouselPagingModelProtocol.swift index 5f593d3b..94b1277a 100644 --- a/MVMCoreUI/Models/ModelProtocols/CarouselPagingModelProtocol.swift +++ b/MVMCoreUI/Models/ModelProtocols/CarouselPagingModelProtocol.swift @@ -8,6 +8,7 @@ import Foundation + public protocol CarouselPagingModelProtocol: MoleculeModelProtocol { - var position: Float? {get} + var position: Float? { get } } diff --git a/MVMCoreUI/Molecules/Items/CarouselItemModel.swift b/MVMCoreUI/Molecules/Items/CarouselItemModel.swift index f2c88e9b..996ad4e9 100644 --- a/MVMCoreUI/Molecules/Items/CarouselItemModel.swift +++ b/MVMCoreUI/Molecules/Items/CarouselItemModel.swift @@ -10,12 +10,20 @@ import Foundation @objcMembers public class CarouselItemModel: MoleculeContainerModel, CarouselItemModelProtocol { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + public static var identifier: String = "carouselItem" public var backgroundColor: Color? public var peakingUI: Bool? public var peakingArrowColor: Color? public var moleculeName: String? + //-------------------------------------------------- + // MARK: - Keys + //-------------------------------------------------- + private enum CodingKeys: String, CodingKey { case moleculeName case backgroundColor @@ -23,6 +31,10 @@ import Foundation case peakingArrowColor } + //-------------------------------------------------- + // MARK: - Codec + //-------------------------------------------------- + required public init(from decoder: Decoder) throws { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) moleculeName = try typeContainer.decodeIfPresent(String.self, forKey: .moleculeName) diff --git a/MVMCoreUI/Organisms/Carousel.swift b/MVMCoreUI/Organisms/Carousel.swift index 7262e122..46c6f269 100644 --- a/MVMCoreUI/Organisms/Carousel.swift +++ b/MVMCoreUI/Organisms/Carousel.swift @@ -9,7 +9,7 @@ import UIKit open class Carousel: View { - + let collectionView = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout()) /// The current index of the collection view. Includes dummy cells when looping. @@ -17,10 +17,8 @@ open class Carousel: View { /// The index of the page, does not include dummy cells. var pageIndex: Int { - get { - return loop ? currentIndex - 2 : currentIndex - } - set(newIndex) { + get { return loop ? currentIndex - 2 : currentIndex } + set (newIndex) { currentIndex = loop ? newIndex + 2 : newIndex } } @@ -30,7 +28,7 @@ open class Carousel: View { /// The json for the molecules. var molecules: [MoleculeModelProtocol]? - + /// The horizontal alignment of the cell in the collection view. Only noticeable if the itemWidthPercent is less than 100%. var itemAlignment = UICollectionView.ScrollPosition.left @@ -53,9 +51,8 @@ open class Carousel: View { // MARK: - MVMCoreViewProtocol open override func setupView() { super.setupView() - guard collectionView.superview == nil else { - return - } + guard collectionView.superview == nil else { return } + collectionView.translatesAutoresizingMaskIntoConstraints = false collectionView.dataSource = self collectionView.delegate = self @@ -73,7 +70,7 @@ open class Carousel: View { super.updateView(size) collectionView.collectionViewLayout.invalidateLayout() showPeaking(false) - + // Go to current cell. layoutIfNeeded is needed otherwise cellForItem returns nil for peaking logic. The dispatch is a sad way to ensure the collection view is ready to be scrolled. DispatchQueue.main.async { self.collectionView.scrollToItem(at: IndexPath(row: self.currentIndex, section: 0), at: self.itemAlignment, animated: false) @@ -83,32 +80,35 @@ open class Carousel: View { } // MARK: - MVMCoreUIMoleculeViewProtocol + public override func setWithModel(_ model: MoleculeModelProtocol?, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { super.setWithModel(model, delegateObject, additionalData) + guard let carouselModel = model as? CarouselModel else { return } + collectionView.backgroundColor = backgroundColor collectionView.layer.borderColor = backgroundColor?.cgColor collectionView.layer.borderWidth = (carouselModel.border ?? false) ? 1 : 0 backgroundColor = .white - + registerCells(with: carouselModel, delegateObject: delegateObject) setupLayout(with: carouselModel) prepareMolecules(with: carouselModel) itemWidthPercent = (carouselModel.itemWidthPercent ?? 100) / 100 setAlignment(with: carouselModel.itemAlignment) - + if let height = carouselModel.height { collectionViewHeight?.constant = CGFloat(height) collectionViewHeight?.isActive = true } - + setupPagingMolecule(carouselModel.pagingMolecule, delegateObject: delegateObject) collectionView.reloadData() } // MARK: - JSON Setters /// Updates the layout being used - + func setupLayout(with carouselModel: CarouselModel?) { let layout = UICollectionViewFlowLayout() layout.scrollDirection = .horizontal @@ -116,14 +116,14 @@ open class Carousel: View { layout.minimumInteritemSpacing = 0 collectionView.collectionViewLayout = layout } - + func prepareMolecules(with carouselModel: CarouselModel?) { guard let newMolecules = carouselModel?.molecules else { numberOfPages = 0 molecules = nil return } - + numberOfPages = newMolecules.count molecules = newMolecules if carouselModel?.loop ?? false && newMolecules.count > 2 { @@ -136,16 +136,17 @@ open class Carousel: View { } pageIndex = 0 } - + /// Sets up the paging molecule open func setupPagingMolecule(_ molecule: CarouselPagingModelProtocol?, delegateObject: MVMCoreUIDelegateObject?) { + var pagingView: (UIView & MVMCoreUIPagingProtocol)? = nil if let molecule = molecule { pagingView = MVMCoreUIMoleculeMappingObject.shared()?.createMolecule(molecule, delegateObject, false) as? (UIView & MVMCoreUIPagingProtocol) } addPaging(view: pagingView, position: (CGFloat(molecule?.position ?? 20))) } - + /// Registers the cells with the collection view func registerCells(with carouselModel: CarouselModel, delegateObject: MVMCoreUIDelegateObject?) { for molecule in carouselModel.molecules { @@ -154,19 +155,20 @@ open class Carousel: View { } } } - + // MARK: - Convenience /// Returns the (identifier, class) of the molecule for the given map. func getMoleculeInfo(with molecule: MoleculeModelProtocol, delegateObject: MVMCoreUIDelegateObject?) -> (identifier: String, class: AnyClass, molecule: MoleculeModelProtocol)? { - guard let className = MVMCoreUIMoleculeMappingObject.shared()?.getMoleculeClass(molecule) , - let moleculeName = (className as? ModelMoleculeViewProtocol.Type)?.nameForReuse(molecule, delegateObject) ?? molecule.moleculeName else { - return nil - } + guard let className = MVMCoreUIMoleculeMappingObject.shared()?.getMoleculeClass(molecule), + let moleculeName = (className as? ModelMoleculeViewProtocol.Type)?.nameForReuse(molecule, delegateObject) ?? molecule.moleculeName + else { return nil } + return (moleculeName, className, molecule) } /// Sets the alignment from the string. open func setAlignment(with string: String?) { + switch string { case "leading": itemAlignment = .left @@ -213,6 +215,7 @@ open class Carousel: View { } open func showPeaking(_ peaking: Bool) { + if peaking && !UIAccessibility.isVoiceOverRunning { // Show overlay and arrow in peaking Cell let visibleItemsPaths = collectionView.indexPathsForVisibleItems.sorted { $0.row < $1.row } @@ -231,9 +234,8 @@ open class Carousel: View { } func setAccessiblity(_ cell: UICollectionViewCell?, index: Int) { - guard let cell = cell else { - return - } + guard let cell = cell else { return } + if index == currentIndex { cell.accessibilityElementsHidden = false var array = cell.accessibilityElements @@ -269,9 +271,9 @@ extension Carousel: UICollectionViewDataSource { public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { guard let molecule = molecules?[indexPath.row], - let moleculeInfo = getMoleculeInfo(with: molecule, delegateObject: nil) else { - return UICollectionViewCell() - } + let moleculeInfo = getMoleculeInfo(with: molecule, delegateObject: nil) + else { return UICollectionViewCell() } + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: moleculeInfo.identifier, for: indexPath) if let protocolCell = cell as? MVMCoreUIMoleculeViewProtocol & ModelMoleculeViewProtocol { protocolCell.reset?() @@ -286,6 +288,7 @@ extension Carousel: UICollectionViewDataSource { extension Carousel: UIScrollViewDelegate { func goTo(_ index: Int, animated: Bool) { + showPeaking(false) setAccessiblity(collectionView.cellForItem(at: IndexPath(row: self.currentIndex, section: 0)), index: index) self.currentIndex = index @@ -297,17 +300,15 @@ extension Carousel: UIScrollViewDelegate { } func handleUserOnBufferCell() { - guard loop else { - return - } - + guard loop else { return } + let lastPageIndex = numberOfPages + 1 let goToIndex = {(index: Int) in self.goTo(index, animated: false) self.collectionView.layoutIfNeeded() self.pagingView?.setPage(self.pageIndex) } - + if currentIndex < 2 { // If on a "buffer" last row (which is the first index), go to the real last row secretly. layoutIfNeeded is needed otherwise cellForItem returns nil for peaking. goToIndex(lastPageIndex) @@ -318,9 +319,8 @@ extension Carousel: UIScrollViewDelegate { } func checkForDraggingOutOfBounds(_ scrollView: UIScrollView) { - guard loop, dragging else { - return - } + guard loop, dragging else { return } + // Checks if the user is not paging but attempting to drag endlessly and goes out of bounds. Caps the index. if let separatorWidth = (collectionView.collectionViewLayout as? UICollectionViewFlowLayout)?.minimumLineSpacing { let itemWidth = collectionView.bounds.width * CGFloat(itemWidthPercent) @@ -346,24 +346,25 @@ extension Carousel: UIScrollViewDelegate { } public func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { + dragging = true showPeaking(false) } public func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer) { + dragging = false targetContentOffset.pointee = scrollView.contentOffset // This is for setting up smooth custom paging. (Since UICollectionView only handles paging based on collection view size and not cell size). - guard let separatorWidth = (collectionView.collectionViewLayout as? UICollectionViewFlowLayout)?.minimumLineSpacing else { - return - } + guard let separatorWidth = (collectionView.collectionViewLayout as? UICollectionViewFlowLayout)?.minimumLineSpacing else { return } // We switch cards if we pass the velocity threshold or position threshold (currently 50%). let itemWidth = collectionView.bounds.width * CGFloat(itemWidthPercent) var cellToSwipeTo = Int(scrollView.contentOffset.x/(itemWidth + separatorWidth) + 0.5) let lastCellIndex = collectionView(collectionView, numberOfItemsInSection: 0) - 1 let velocityThreshold: CGFloat = 1.1 + if velocity.x > velocityThreshold { cellToSwipeTo = currentIndex + 1 } else if velocity.x < -velocityThreshold { diff --git a/MVMCoreUI/Organisms/CarouselModel.swift b/MVMCoreUI/Organisms/CarouselModel.swift index e43e6caa..c68f083a 100644 --- a/MVMCoreUI/Organisms/CarouselModel.swift +++ b/MVMCoreUI/Organisms/CarouselModel.swift @@ -9,10 +9,14 @@ import UIKit @objcMembers public class CarouselModel: MoleculeModelProtocol { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + public static var identifier: String = "carousel" public var backgroundColor: Color? public var molecules: [CarouselItemModel] - + public var moleculeName: String? public var spacing: Float? public var border: Bool? public var loop: Bool? @@ -20,12 +24,20 @@ import UIKit public var itemWidthPercent: Float? public var itemAlignment: String? public var pagingMolecule: CarouselPagingModelProtocol? - + + //-------------------------------------------------- + // MARK: - Initializer + //-------------------------------------------------- + public init(molecules: [CarouselItemModel]){ self.molecules = molecules } - - private enum CodingKeys: String, CodingKey { + + //-------------------------------------------------- + // MARK: - Keys + //-------------------------------------------------- + + private enum CodingKeys: String, CodingKey { case moleculeName case backgroundColor case molecules @@ -36,32 +48,36 @@ import UIKit case itemWidthPercent case itemAlignment case pagingMolecule - } - - required public init(from decoder: Decoder) throws { + } + + //-------------------------------------------------- + // MARK: - Codec + //-------------------------------------------------- + + required public init(from decoder: Decoder) throws { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) - self.molecules = try typeContainer.decode([CarouselItemModel].self, forKey: .molecules) - self.backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) - self.spacing = try typeContainer.decode(Float.self, forKey: .spacing) - self.border = try typeContainer.decode(Bool.self, forKey: .border) - self.loop = try typeContainer.decode(Bool.self, forKey: .loop) - self.height = try typeContainer.decode(Float.self, forKey: .height) - self.itemWidthPercent = try typeContainer.decode(Float.self, forKey: .itemWidthPercent) - self.itemAlignment = try typeContainer.decode(String.self, forKey: .itemAlignment) - self.pagingMolecule = try typeContainer.decodeMoleculeIfPresent(codingKey: .pagingMolecule) as? CarouselPagingModelProtocol - } - - public func encode(to encoder: Encoder) throws { + molecules = try typeContainer.decode([CarouselItemModel].self, forKey: .molecules) + backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) + spacing = try typeContainer.decodeIfPresent(Float.self, forKey: .spacing) + border = try typeContainer.decodeIfPresent(Bool.self, forKey: .border) + loop = try typeContainer.decodeIfPresent(Bool.self, forKey: .loop) + height = try typeContainer.decodeIfPresent(Float.self, forKey: .height) + itemWidthPercent = try typeContainer.decodeIfPresent(Float.self, forKey: .itemWidthPercent) + itemAlignment = try typeContainer.decodeIfPresent(String.self, forKey: .itemAlignment) + pagingMolecule = try typeContainer.decodeMoleculeIfPresent(codingKey: .pagingMolecule) as? CarouselPagingModelProtocol + } + + public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encodeIfPresent(moleculeName, forKey: .moleculeName) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) - try container.encode(molecules, forKey: .molecules) - try container.encode(spacing, forKey: .spacing) - try container.encode(border, forKey: .border) - try container.encode(loop, forKey: .loop) - try container.encode(height, forKey: .height) - try container.encode(itemWidthPercent, forKey: .itemWidthPercent) - try container.encode(itemAlignment, forKey: .itemAlignment) + try container.encodeIfPresent(molecules, forKey: .molecules) + try container.encodeIfPresent(spacing, forKey: .spacing) + try container.encodeIfPresent(border, forKey: .border) + try container.encodeIfPresent(loop, forKey: .loop) + try container.encodeIfPresent(height, forKey: .height) + try container.encodeIfPresent(itemWidthPercent, forKey: .itemWidthPercent) + try container.encodeIfPresent(itemAlignment, forKey: .itemAlignment) try container.encodeModelIfPresent(pagingMolecule, forKey: .pagingMolecule) - } + } } diff --git a/MVMCoreUI/OtherHandlers/MoleculeObjectMapping.swift b/MVMCoreUI/OtherHandlers/MoleculeObjectMapping.swift index 8c1a36e3..ff285e2a 100644 --- a/MVMCoreUI/OtherHandlers/MoleculeObjectMapping.swift +++ b/MVMCoreUI/OtherHandlers/MoleculeObjectMapping.swift @@ -94,6 +94,8 @@ import Foundation // Other Organisms MVMCoreUIMoleculeMappingObject.shared()?.register(viewClass: Carousel.self, viewModelClass: CarouselModel.self) + MVMCoreUIMoleculeMappingObject.shared()?.register(viewClass: CarouselIndicator.self, viewModelClass: CarouselIndicatorModel.self) + // TODO: Need model MVMCoreUIMoleculeMappingObject.shared()?.moleculeMapping.setObject(DigitEntryField.self, forKey: "digitTextField" as NSString) MVMCoreUIMoleculeMappingObject.shared()?.moleculeMapping.setObject(DateDropdownEntryField.self, forKey: "dateDropdownEntryField" as NSString) From 4bfa87a901568f2d3464bc658d79a8e481b22c47 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Thu, 13 Feb 2020 12:46:15 -0500 Subject: [PATCH 07/78] aligning --- MVMCoreUI.xcodeproj/project.pbxproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/MVMCoreUI.xcodeproj/project.pbxproj b/MVMCoreUI.xcodeproj/project.pbxproj index ca84e335..ffa59aaa 100644 --- a/MVMCoreUI.xcodeproj/project.pbxproj +++ b/MVMCoreUI.xcodeproj/project.pbxproj @@ -82,6 +82,7 @@ 0A21DB94235E24ED00C160A2 /* DigitEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A21DB93235E24ED00C160A2 /* DigitEntryField.swift */; }; 0A41BA6E2344FCD400D4C0BC /* CATransaction+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A41BA6D2344FCD400D4C0BC /* CATransaction+Extension.swift */; }; 0A41BA7F23453A6400D4C0BC /* TextEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A41BA7E23453A6400D4C0BC /* TextEntryField.swift */; }; + 0A4253AF23F5C2C100554656 /* BarsIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A4253AE23F5C2C000554656 /* BarsIndicatorView.swift */; }; 0A5D59C223AD2F5700EFD9E9 /* AppleGuidelinesProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A5D59C123AD2F5700EFD9E9 /* AppleGuidelinesProtocol.swift */; }; 0A6BF4722360C56C0028F841 /* BaseDropdownEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A6BF4712360C56C0028F841 /* BaseDropdownEntryField.swift */; }; 0A7BAD74232A8DC700FB8E22 /* HeadlineBodyButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7BAD73232A8DC700FB8E22 /* HeadlineBodyButton.swift */; }; @@ -96,7 +97,6 @@ 0A9F3DE823EDE9F200318918 /* Arrow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A9F3DE723EDE9F200318918 /* Arrow.swift */; }; 0A9F3DEA23EDEA1A00318918 /* ArrowModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A9F3DE923EDEA1A00318918 /* ArrowModel.swift */; }; 0AA33B3A2398524F0067DD0F /* Toggle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AA33B392398524F0067DD0F /* Toggle.swift */; }; - 0AB2AA2323F19CFA00C6D3CF /* BarsIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AB2AA2223F19CFA00C6D3CF /* BarsIndicatorView.swift */; }; 0ABD136D237CAD1E0081388D /* DateDropdownEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ABD136C237CAD1E0081388D /* DateDropdownEntryField.swift */; }; 0ABD1371237DB0450081388D /* ItemDropdownEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ABD1370237DB0450081388D /* ItemDropdownEntryField.swift */; }; 0AE14F64238315D2005417F8 /* TextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AE14F63238315D2005417F8 /* TextField.swift */; }; @@ -409,6 +409,7 @@ 0A21DB93235E24ED00C160A2 /* DigitEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DigitEntryField.swift; sourceTree = ""; }; 0A41BA6D2344FCD400D4C0BC /* CATransaction+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CATransaction+Extension.swift"; sourceTree = ""; }; 0A41BA7E23453A6400D4C0BC /* TextEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextEntryField.swift; sourceTree = ""; }; + 0A4253AE23F5C2C000554656 /* BarsIndicatorView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BarsIndicatorView.swift; sourceTree = ""; }; 0A5D59C123AD2F5700EFD9E9 /* AppleGuidelinesProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppleGuidelinesProtocol.swift; sourceTree = ""; }; 0A6BF4712360C56C0028F841 /* BaseDropdownEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseDropdownEntryField.swift; sourceTree = ""; }; 0A7BAD73232A8DC700FB8E22 /* HeadlineBodyButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadlineBodyButton.swift; sourceTree = ""; }; @@ -426,7 +427,6 @@ 0A9F3DE923EDEA1A00318918 /* ArrowModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArrowModel.swift; sourceTree = ""; }; 0AA33B33239813C50067DD0F /* UIColor+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+Extension.swift"; sourceTree = ""; }; 0AA33B392398524F0067DD0F /* Toggle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Toggle.swift; sourceTree = ""; }; - 0AB2AA2223F19CFA00C6D3CF /* BarsIndicatorView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BarsIndicatorView.swift; sourceTree = ""; }; 0ABD136C237CAD1E0081388D /* DateDropdownEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateDropdownEntryField.swift; sourceTree = ""; }; 0ABD1370237DB0450081388D /* ItemDropdownEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemDropdownEntryField.swift; sourceTree = ""; }; 0AE14F63238315D2005417F8 /* TextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextField.swift; sourceTree = ""; }; @@ -757,7 +757,7 @@ 0A14F6B723ECA7F900EDF7F7 /* IndicatorViews */ = { isa = PBXGroup; children = ( - 0AB2AA2223F19CFA00C6D3CF /* BarsIndicatorView.swift */, + 0A4253AE23F5C2C000554656 /* BarsIndicatorView.swift */, 0A14F6B323E8C29700EDF7F7 /* NumericIndicatorView.swift */, ); path = IndicatorViews; @@ -1684,6 +1684,7 @@ 01EB369423609801006832FA /* HeadlineBodyModel.swift in Sources */, 0A21DB7F235DECC500C160A2 /* EntryField.swift in Sources */, D2E2A99F23E07F8A000B42E6 /* PillButton.swift in Sources */, + 0A4253AF23F5C2C100554656 /* BarsIndicatorView.swift in Sources */, D2C5001921F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.m in Sources */, D29DF12E21E6851E003B2FB9 /* MVMCoreUITopAlertView.m in Sources */, D29DF2CF21E7C104003B2FB9 /* MFLoadingViewController.m in Sources */, @@ -1846,7 +1847,6 @@ D2A5146122121FBF00345BFB /* MoleculeStackTemplate.swift in Sources */, D2E2A9A323E096B1000B42E6 /* DisableableModelProtocol.swift in Sources */, D29DF11821E6805F003B2FB9 /* NSLayoutConstraint+MFConvenience.m in Sources */, - 0AB2AA2323F19CFA00C6D3CF /* BarsIndicatorView.swift in Sources */, 94C2D9A323872C110006CF46 /* LabelAttributeStrikeThroughModel.swift in Sources */, D28A838523CCCA8900DFE4FC /* ScrollerModel.swift in Sources */, D29DF26C21E6AA0B003B2FB9 /* FLAnimatedImage.m in Sources */, From 6ede310cd032696d4d53069056a0c6751693f2a2 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Thu, 13 Feb 2020 12:47:07 -0500 Subject: [PATCH 08/78] bar indicator add --- .../IndicatorViews/BarsIndicatorView.swift | 141 ++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift new file mode 100644 index 00000000..e20b5489 --- /dev/null +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift @@ -0,0 +1,141 @@ +// +// BarIndicatorView.swift +// MVMCoreUI +// +// Created by Kevin Christiano on 2/3/20. +// Copyright © 2020 Verizon Wireless. All rights reserved. +// + +import UIKit + + +open class BarsIndicatorView: View, IndicatorViewProtocol { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + + let stackView: StackView = { + let stackView = StackView() + stackView.axis = .horizontal + stackView.distribution = .equalSpacing + stackView.spacing = 6 + return stackView + }() + + public var barsReference: [(view: View, constraint: NSLayoutConstraint)] = [] + + // Dimensions are based on InVision Design Guidelines. + public static let indicatorBarWidth: CGFloat = 24 + public static let indicatorBarHeight: (selected: CGFloat, unselected: CGFloat) = (selected: 4, unselected: 1) + + public var enabledColor: UIColor { + return (superview as? CarouselIndicator)?.indicatorTintColor ?? .black + } + + public var currentIndexColor: UIColor { + return (superview as? CarouselIndicator)?.currentIndicatorColor ?? .black + } + + public var disabledColor: UIColor { + return (superview as? CarouselIndicator)?.disabledIndicatorColor ?? .mvmCoolGray3 + } + + /// Returns the numberOfPages count from its parent CarouselIndicator. + public var numberOfPages: Int? { + return (superview as? CarouselIndicator)?.numberOfPages + } + + /// Returns the numberOfPages count from its parent CarouselIndicator. + public var currentIndex: Int? { + return (superview as? CarouselIndicator)?.currentIndex + } + + open var isEnabled: Bool = true { + didSet { + barsReference.forEach { view, heightConstraint in + view.backgroundColor = isEnabled ? enabledColor : disabledColor + } + } + } + + //-------------------------------------------------- + // MARK: - Initializers + //-------------------------------------------------- + + public init() { + super.init(frame: .zero) + } + + public required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + //-------------------------------------------------- + // MARK: - Setup + //-------------------------------------------------- + + open override func setupView() { + super.setupView() + + guard subviews.isEmpty else { return } + + addSubview(stackView) + isUserInteractionEnabled = false + + stackView.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true + stackView.leadingAnchor.constraint(greaterThanOrEqualTo: leadingAnchor).isActive = true + trailingAnchor.constraint(lessThanOrEqualTo: stackView.trailingAnchor).isActive = true + + generateBars() + } + + //-------------------------------------------------- + // MARK: - Methods + //-------------------------------------------------- + + func generateBars() { + + guard let numberOfPages = numberOfPages, + let currentIndex = currentIndex + else { return } + + var bars = [(View, NSLayoutConstraint)]() + + for i in 0.. Date: Thu, 13 Feb 2020 15:33:55 -0500 Subject: [PATCH 09/78] adding new base class. improving carousel logic. --- MVMCoreUI.xcodeproj/project.pbxproj | 4 + .../CarouselIndicator/CarouselIndicator.swift | 139 ++++++++++++------ .../CarouselIndicatorModel.swift | 1 - .../IndicatorViews/BarsIndicatorView.swift | 2 - .../IndicatorViews/NumericIndicatorView.swift | 47 ++++-- MVMCoreUI/BaseClasses/ImageView.swift | 102 +++++++++++++ MVMCoreUI/BaseClasses/View.swift | 4 + MVMCoreUI/Organisms/Carousel.swift | 67 ++++++--- 8 files changed, 291 insertions(+), 75 deletions(-) create mode 100644 MVMCoreUI/BaseClasses/ImageView.swift diff --git a/MVMCoreUI.xcodeproj/project.pbxproj b/MVMCoreUI.xcodeproj/project.pbxproj index ffa59aaa..25481035 100644 --- a/MVMCoreUI.xcodeproj/project.pbxproj +++ b/MVMCoreUI.xcodeproj/project.pbxproj @@ -85,6 +85,7 @@ 0A4253AF23F5C2C100554656 /* BarsIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A4253AE23F5C2C000554656 /* BarsIndicatorView.swift */; }; 0A5D59C223AD2F5700EFD9E9 /* AppleGuidelinesProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A5D59C123AD2F5700EFD9E9 /* AppleGuidelinesProtocol.swift */; }; 0A6BF4722360C56C0028F841 /* BaseDropdownEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A6BF4712360C56C0028F841 /* BaseDropdownEntryField.swift */; }; + 0A7918F523F5E7EA00772FF4 /* ImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7918F423F5E7EA00772FF4 /* ImageView.swift */; }; 0A7BAD74232A8DC700FB8E22 /* HeadlineBodyButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7BAD73232A8DC700FB8E22 /* HeadlineBodyButton.swift */; }; 0A7BAFA1232BE61800FB8E22 /* Checkbox.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7BAFA0232BE61800FB8E22 /* Checkbox.swift */; }; 0A7EF85B23D8A52800B2AAD1 /* EntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF85A23D8A52800B2AAD1 /* EntryFieldModel.swift */; }; @@ -412,6 +413,7 @@ 0A4253AE23F5C2C000554656 /* BarsIndicatorView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BarsIndicatorView.swift; sourceTree = ""; }; 0A5D59C123AD2F5700EFD9E9 /* AppleGuidelinesProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppleGuidelinesProtocol.swift; sourceTree = ""; }; 0A6BF4712360C56C0028F841 /* BaseDropdownEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseDropdownEntryField.swift; sourceTree = ""; }; + 0A7918F423F5E7EA00772FF4 /* ImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageView.swift; sourceTree = ""; }; 0A7BAD73232A8DC700FB8E22 /* HeadlineBodyButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadlineBodyButton.swift; sourceTree = ""; }; 0A7BAFA0232BE61800FB8E22 /* Checkbox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Checkbox.swift; sourceTree = ""; }; 0A7BAFA2232BE63400FB8E22 /* CheckboxLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckboxLabel.swift; sourceTree = ""; }; @@ -1471,6 +1473,7 @@ D2755D7A23689C7500485468 /* TableViewCell.swift */, 0A5D59C323AD488600EFD9E9 /* Protocols */, 0A14F6A423E4803A00EDF7F7 /* StackView.swift */, + 0A7918F423F5E7EA00772FF4 /* ImageView.swift */, ); path = BaseClasses; sourceTree = ""; @@ -1819,6 +1822,7 @@ 01EB3684236097C0006832FA /* MoleculeModelProtocol.swift in Sources */, D27CD4102339057800C1DC07 /* EyebrowHeadlineBodyLink.swift in Sources */, D29DF11D21E684A9003B2FB9 /* MVMCoreUISplitViewController.m in Sources */, + 0A7918F523F5E7EA00772FF4 /* ImageView.swift in Sources */, 0198F79F225679880066C936 /* FormValidationProtocol.swift in Sources */, D243859923A16B1800332775 /* Container.swift in Sources */, D2C521A923EDE79E00CA2634 /* ViewController.swift in Sources */, diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift index f263d7b9..7a776a94 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift @@ -8,14 +8,24 @@ import Foundation +/// Set protocols for all indicator faces of the Carousel Indicator. public protocol IndicatorViewProtocol { func updateUI(previousIndex: Int, newIndex: Int, totalCount: Int, isAnimated: Bool) func reset() var isEnabled: Bool { get set } } +/// Contracts behavior between carousel and its page control. +public protocol CarouselPageControlProtocol { + typealias PagingTouchBlock = ((CarouselPageControlProtocol)) -> () + var currentIndex: Int { get set } + var numberOfPages: Int { get set } + var indicatorTouchAction: PagingTouchBlock? { get set } + func scrollViewDidScroll(_ collectionView: UICollectionView) +} -open class CarouselIndicator: Control { + +open class CarouselIndicator: Control, CarouselPageControlProtocol { //-------------------------------------------------- // MARK: - Outlets //-------------------------------------------------- @@ -45,9 +55,12 @@ open class CarouselIndicator: Control { didSet { assignIndicatorView() } } + public var uiGestures: Set = [] + /// The currently active indicator view. public var currentIndicator: IndicatorView? + /// Convenience to access the model. public var carouselIndicatorModel: CarouselIndicatorModel? { return model as? CarouselIndicatorModel } @@ -65,14 +78,15 @@ open class CarouselIndicator: Control { } } - /// The maxmum count of pages before the indicatorView forces a numeric Indicator insead of Bar. + /// The maxmum count of pages before the indicatorView forces a Numeric Indicator in place of Bar. public var hybridThreshold: Int = 5 /// Set this closure to perform an action when a different indicator was selected. - public var indicatorTouchAction: ((Int)->())? + /// Passes through oldInde and newIndex, respectively. + public var indicatorTouchAction: CarouselIndicator.PagingTouchBlock? - /// Allows sendActions() to trigger even if index is min/max index. - public var alwaysSendEvent = false + /// Allows sendActions() to trigger even if index is already at min/max index. + public var alwaysSendAction = false /// Set true to make the accessibility value as "Slide #currentPage of #totalPage", otherwise will be "Page #currentPage of #totalPage", default is false public var accessibilityHasSlidesInsteadOfPage = false @@ -91,17 +105,9 @@ open class CarouselIndicator: Control { didSet { isUserInteractionEnabled = isEnabled indicatorView?.isEnabled = isEnabled - - if indicatorType != .bar && numberOfPages > hybridThreshold { - - } else { - if let stackView = indicatorView as? BarsIndicatorView { - stackView.stackView.arrangedSubviews.forEach { ($0 as? BarsIndicatorView)?.isEnabled = isEnabled } - } - } } } - + //-------------------------------------------------- // MARK: - Computed Properties //-------------------------------------------------- @@ -112,21 +118,21 @@ open class CarouselIndicator: Control { public var currentIndex: Int { get { return _currentIndex } set (newIndex) { - guard _currentIndex != newIndex else { return } + if !allowIndexWraparound { + guard _currentIndex != newIndex else { return } + } previousIndex = _currentIndex _currentIndex = newIndex - sendActions(for: .valueChanged) - indicatorTouchAction?(newIndex) - indicatorView?.updateUI(previousIndex: previousIndex, - newIndex: newIndex, - totalCount: numberOfPages, - isAnimated: isAnimated) + performAction() + updateUI() } } private var _numberOfPages = 0 + /// Holds the total number of pages displayed by the carousel. + /// Updating this property will potentially update the UI. public var numberOfPages: Int { get { return _numberOfPages } set (newTotal) { @@ -140,14 +146,7 @@ open class CarouselIndicator: Control { indicatorView = BarsIndicatorView() } - if alwaysSendEvent { - sendActions(for: .valueChanged) - } - - indicatorView?.updateUI(previousIndex: previousIndex, - newIndex: currentIndex, - totalCount: newTotal, - isAnimated: isAnimated) + updateUI() } } @@ -159,6 +158,12 @@ open class CarouselIndicator: Control { get { return _indicatorTintColor } set (newColor) { _indicatorTintColor = newColor + + if isBarIndicator(), let barIndicator = indicatorView as? BarsIndicatorView { + for (i, barTuple) in barIndicator.barsReference.enumerated() where i != currentIndex { + barTuple.view.backgroundColor = newColor + } + } } } @@ -169,6 +174,12 @@ open class CarouselIndicator: Control { get { return _currentIndicatorColor } set (newColor) { _currentIndicatorColor = newColor + + if isBarIndicator() { + if let barIndicator = indicatorView as? BarsIndicatorView { + barIndicator.barsReference[currentIndex].view.backgroundColor = newColor + } + } } } @@ -207,9 +218,8 @@ open class CarouselIndicator: Control { open override func setupView() { super.setupView() - guard indicatorView == nil else { return } - assignIndicatorView() + setupGestures() if let accessibleValue = MVMCoreUIUtility.hardcodedString(withKey: accessibilityHasSlidesInsteadOfPage ? "MVMCoreUIPageControlslides_currentpage_index" : "MVMCoreUIPageControl_currentpage_index") { accessibilityValue = String(format: accessibleValue, currentIndex + 1, numberOfPages) @@ -220,22 +230,49 @@ open class CarouselIndicator: Control { // MARK: - UITouch //-------------------------------------------------- - @objc func pageValueIncrement() { + private func setupGestures() { + let tap = UITapGestureRecognizer(target: self, action: #selector(indicatorTapped(_:))) + let leftSwipe = UISwipeGestureRecognizer(target: self, action: #selector(swipeLeft)) + let rightSwipe = UISwipeGestureRecognizer(target: self, action: #selector(swipeRight)) + + uiGestures.insert(tap) + uiGestures.insert(leftSwipe) + uiGestures.insert(rightSwipe) + } + + func incrementCurrentIndex() { currentIndex = min(currentIndex + 1, numberOfPages - 1) } - @objc func pageValueDecrement() { - + func decrementCurrentIndex() { currentIndex = max(0, currentIndex - 1) } - func indicatorTapped(_ tapGesture: UITapGestureRecognizer?) { + /// Increments the currentIndex value. + @objc func swipeLeft() { + incrementCurrentIndex() + } + + /// Decrement the currentIndex value + @objc func swipeRight() { + decrementCurrentIndex() + } + + /// Handles tap logic for Indicator + @objc func indicatorTapped(_ tapGesture: UITapGestureRecognizer?) { - if isEnabled, let bars = (indicatorView as? BarsIndicatorView)?.barsReference { - let touchPoint_X = tapGesture?.location(in: self).x ?? 0.0 - + let touchPoint = tapGesture?.location(in: self) + let touchPoint_X = touchPoint?.x ?? 0.0 + + if isEnabled, indicatorType == .bar, let bars = (indicatorView as? BarsIndicatorView)?.barsReference { currentIndex = bars.firstIndex { $0.0.frame.maxX >= touchPoint_X && $0.0.frame.minX <= touchPoint_X } ?? 0 + } else { + if touchPoint_X > bounds.width / 2 { + incrementCurrentIndex() + } else { + decrementCurrentIndex() + } } } @@ -243,6 +280,20 @@ open class CarouselIndicator: Control { // MARK: - Methods //-------------------------------------------------- + public func updateUI() { + + indicatorView?.updateUI(previousIndex: previousIndex, + newIndex: currentIndex, + totalCount: numberOfPages, + isAnimated: isAnimated) + } + + public func performAction() { + + sendActions(for: .valueChanged) + indicatorTouchAction?(self) + } + /// Sets the indicatorView based on the current indicatorType. func assignIndicatorView() { @@ -260,9 +311,13 @@ open class CarouselIndicator: Control { /// Convenience to determine if current view is displaying bars. func isBarIndicator() -> Bool { + return indicatorType != .bar && numberOfPages > hybridThreshold } + public func scrollViewDidScroll(_ collectionView: UICollectionView) { + + } //-------------------------------------------------- // MARK: - MoleculeViewProtocol //-------------------------------------------------- @@ -284,20 +339,22 @@ open class CarouselIndicator: Control { //-------------------------------------------------- open override func accessibilityIncrement() { + accessibilityAdjust(toPage: currentIndex + 1) } open override func accessibilityDecrement() { + accessibilityAdjust(toPage: currentIndex - 1) } func accessibilityAdjust(toPage index: Int) { - if (index < numberOfPages && index >= 0) || alwaysSendEvent { + if (index < numberOfPages && index >= 0) || alwaysSendAction { isAnimated = false + previousIndex = currentIndex currentIndex = index - sendActions(for: .valueChanged) - indicatorTouchAction?(index) + performAction() } } diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift index 074b0570..0cff8f2e 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift @@ -54,7 +54,6 @@ public class CarouselIndicatorModel: MoleculeModelProtocol { required public init(from decoder: Decoder) throws { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) - currentBarColor = try typeContainer.decodeIfPresent(Color.self, forKey: .currentBarColor) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) barsColor = try typeContainer.decodeIfPresent(Color.self, forKey: .barsColor) diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift index e20b5489..53ebd1a8 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift @@ -77,8 +77,6 @@ open class BarsIndicatorView: View, IndicatorViewProtocol { open override func setupView() { super.setupView() - guard subviews.isEmpty else { return } - addSubview(stackView) isUserInteractionEnabled = false diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/NumericIndicatorView.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/NumericIndicatorView.swift index 95ea16d1..ed215632 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/NumericIndicatorView.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/NumericIndicatorView.swift @@ -11,7 +11,7 @@ import UIKit open class NumericIndicatorView: View, IndicatorViewProtocol { //-------------------------------------------------- - // MARK: - Properties + // MARK: - Outlets //-------------------------------------------------- /// Text to display the current count of total pages for viewing. @@ -22,7 +22,41 @@ open class NumericIndicatorView: View, IndicatorViewProtocol { return label }() - open var isEnabled: Bool = true + let leftArrow: ImageView = { + let arrow = UIImage(named: "peakingRightArrow")?.withRenderingMode(.alwaysTemplate).withHorizontallyFlippedOrientation() + let imageView = ImageView(image: arrow) + imageView.isUserInteractionEnabled = true + imageView.tintColor = .mvmBlack + return imageView + }() + + let rightArrow: ImageView = { + let arrow = UIImage(named: "peakingRightArrow")?.withRenderingMode(.alwaysTemplate) + let imageView = ImageView(image: arrow) + imageView.isUserInteractionEnabled = true + imageView.tintColor = .mvmBlack + return imageView + }() + + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + + open var isEnabled: Bool = true { + didSet { + titleLabel.isEnabled = isEnabled + leftArrow.tintColor = isEnabled ? enabledColor : disabledColor + rightArrow.tintColor = isEnabled ? enabledColor : disabledColor + } + } + + public var enabledColor: UIColor { + return (superview as? CarouselIndicator)?.indicatorTintColor ?? .black + } + + public var disabledColor: UIColor { + return (superview as? CarouselIndicator)?.disabledIndicatorColor ?? .mvmCoolGray3 + } public var parentCarouselIndicator: CarouselIndicator? { return superview as? CarouselIndicator @@ -74,23 +108,18 @@ open class NumericIndicatorView: View, IndicatorViewProtocol { open override func setupView() { super.setupView() - guard subviews.isEmpty else { return } - isUserInteractionEnabled = false + leftArrow.tintColor = isEnabled ? enabledColor : disabledColor + rightArrow.tintColor = isEnabled ? enabledColor : disabledColor addSubview(titleLabel) titleLabel.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true NSLayoutConstraint.constraintPinSubview(titleLabel, pinTop: true, pinBottom: true, pinLeft: false, pinRight: false) - let arrow = UIImage(named: "peakingRightArrow")?.withHorizontallyFlippedOrientation() - let leftArrow = UIImageView(image: arrow) - leftArrow.isUserInteractionEnabled = true - addSubview(leftArrow) NSLayoutConstraint.constraintPinView(leftArrow, heightConstraint: true, heightConstant: PaddingTwo, widthConstraint: true, widthConstant: PaddingTwo) leftArrow.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true - let rightArrow = UIImageView(image: UIImage(named: "peakingRightArrow")) addSubview(rightArrow) NSLayoutConstraint.constraintPinView(rightArrow, heightConstraint: true, heightConstant: PaddingTwo, widthConstraint: true, widthConstant: PaddingTwo) diff --git a/MVMCoreUI/BaseClasses/ImageView.swift b/MVMCoreUI/BaseClasses/ImageView.swift new file mode 100644 index 00000000..788be939 --- /dev/null +++ b/MVMCoreUI/BaseClasses/ImageView.swift @@ -0,0 +1,102 @@ +// +// ImageView.swift +// MVMCoreUI +// +// Created by Kevin Christiano on 2/13/20. +// Copyright © 2020 Verizon Wireless. All rights reserved. +// + +import UIKit + +class ImageView: UIImageView, ModelMoleculeViewProtocol { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + + open var json: [AnyHashable: Any]? + open var model: MoleculeModelProtocol? + + private var initialSetupPerformed = false + + //-------------------------------------------------- + // MARK: - Initialization + //-------------------------------------------------- + + public override init(frame: CGRect) { + super.init(frame: .zero) + initialSetup() + } + + override init(image: UIImage?) { + super.init(image: image) + initialSetup() + } + + public convenience init() { + self.init(frame: .zero) + } + + public required init?(coder: NSCoder) { + super.init(coder: coder) + initialSetup() + } + + public func initialSetup() { + if !initialSetupPerformed { + initialSetupPerformed = true + setupView() + } + } + + // MARK:- ModelMoleculeViewProtocol + open func setWithModel(_ model: MoleculeModelProtocol?, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { + self.model = model + if let backgroundColor = model?.backgroundColor { + self.backgroundColor = backgroundColor.uiColor + } + } + + open class func nameForReuse(_ model: MoleculeModelProtocol?, _ delegateObject: MVMCoreUIDelegateObject?) -> String? { + return model?.moleculeName + } + + open class func estimatedHeight(forRow molecule: MoleculeModelProtocol?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat? { + return nil + } + + open class func requiredModules(_ molecule: MoleculeModelProtocol?, delegateObject: MVMCoreUIDelegateObject?, error: AutoreleasingUnsafeMutablePointer?) -> [String]? { + return nil + } +} + +// MARK:- MVMCoreViewProtocol +extension ImageView: MVMCoreViewProtocol { + + open func updateView(_ size: CGFloat) {} + + /// Will be called only once. + open func setupView() { + translatesAutoresizingMaskIntoConstraints = false + insetsLayoutMarginsFromSafeArea = false + MVMCoreUIUtility.setMarginsFor(self, leading: 0, top: 0, trailing: 0, bottom: 0) + } +} + +// MARK:- MVMCoreUIMoleculeViewProtocol +extension ImageView: MVMCoreUIMoleculeViewProtocol { + + open func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) { + self.json = json + + if let backgroundColorString = json?.optionalStringForKey(KeyBackgroundColor) { + backgroundColor = UIColor.mfGet(forHex: backgroundColorString) + } + } + + open func reset() { + backgroundColor = .clear + } + + open func setAsMolecule() { } +} + diff --git a/MVMCoreUI/BaseClasses/View.swift b/MVMCoreUI/BaseClasses/View.swift index a117d60a..19e139b9 100644 --- a/MVMCoreUI/BaseClasses/View.swift +++ b/MVMCoreUI/BaseClasses/View.swift @@ -9,6 +9,10 @@ import UIKit @objcMembers open class View: UIView, ModelMoleculeViewProtocol { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + open var json: [AnyHashable: Any]? open var model: MoleculeModelProtocol? diff --git a/MVMCoreUI/Organisms/Carousel.swift b/MVMCoreUI/Organisms/Carousel.swift index 46c6f269..f332a6be 100644 --- a/MVMCoreUI/Organisms/Carousel.swift +++ b/MVMCoreUI/Organisms/Carousel.swift @@ -9,6 +9,9 @@ import UIKit open class Carousel: View { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- let collectionView = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout()) @@ -45,13 +48,15 @@ open class Carousel: View { var loop = false private var dragging = false - // For adding pager + /// For adding pager private var bottomPin: NSLayoutConstraint? + //-------------------------------------------------- // MARK: - MVMCoreViewProtocol + //-------------------------------------------------- + open override func setupView() { super.setupView() - guard collectionView.superview == nil else { return } collectionView.translatesAutoresizingMaskIntoConstraints = false collectionView.dataSource = self @@ -68,6 +73,7 @@ open class Carousel: View { open override func updateView(_ size: CGFloat) { super.updateView(size) + collectionView.collectionViewLayout.invalidateLayout() showPeaking(false) @@ -79,7 +85,9 @@ open class Carousel: View { } } + //-------------------------------------------------- // MARK: - MVMCoreUIMoleculeViewProtocol + //-------------------------------------------------- public override func setWithModel(_ model: MoleculeModelProtocol?, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { super.setWithModel(model, delegateObject, additionalData) @@ -106,10 +114,13 @@ open class Carousel: View { collectionView.reloadData() } + //-------------------------------------------------- // MARK: - JSON Setters - /// Updates the layout being used + //-------------------------------------------------- + /// Updates the layout being used func setupLayout(with carouselModel: CarouselModel?) { + let layout = UICollectionViewFlowLayout() layout.scrollDirection = .horizontal layout.minimumLineSpacing = CGFloat(carouselModel?.spacing ?? 1) @@ -126,6 +137,7 @@ open class Carousel: View { numberOfPages = newMolecules.count molecules = newMolecules + if carouselModel?.loop ?? false && newMolecules.count > 2 { // Sets up the row data with buffer cells on each side (for illusion of endless scroll... also has one more buffer cell on each side in case we can peek that cell). loop = true @@ -134,6 +146,7 @@ open class Carousel: View { molecules?.append(newMolecules.first!) molecules?.append(newMolecules[1]) } + pageIndex = 0 } @@ -144,6 +157,7 @@ open class Carousel: View { if let molecule = molecule { pagingView = MVMCoreUIMoleculeMappingObject.shared()?.createMolecule(molecule, delegateObject, false) as? (UIView & MVMCoreUIPagingProtocol) } + addPaging(view: pagingView, position: (CGFloat(molecule?.position ?? 20))) } @@ -156,7 +170,10 @@ open class Carousel: View { } } + //-------------------------------------------------- // MARK: - Convenience + //-------------------------------------------------- + /// Returns the (identifier, class) of the molecule for the given map. func getMoleculeInfo(with molecule: MoleculeModelProtocol, delegateObject: MVMCoreUIDelegateObject?) -> (identifier: String, class: AnyClass, molecule: MoleculeModelProtocol)? { guard let className = MVMCoreUIMoleculeMappingObject.shared()?.getMoleculeClass(molecule), @@ -182,6 +199,7 @@ open class Carousel: View { /// Adds a paging view. Centers it horizontally with the collection view. The position is the vertical distance from the center of the page view to the bottom of the collection view. open func addPaging(view: (UIView & MVMCoreUIPagingProtocol)?, position: CGFloat) { + pagingView?.removeFromSuperview() guard let pagingView = view else { bottomPin?.isActive = false @@ -189,6 +207,7 @@ open class Carousel: View { bottomPin?.isActive = true return } + pagingView.translatesAutoresizingMaskIntoConstraints = false addSubview(pagingView) pagingView.centerXAnchor.constraint(equalTo: collectionView.centerXAnchor).isActive = true @@ -201,15 +220,13 @@ open class Carousel: View { pagingView.setNumberOfPages(numberOfPages) (pagingView as? MVMCoreUIViewConstrainingProtocol)?.alignHorizontal?(.fill) - pagingView.setPagingTouch { [weak self] (pager) in - MVMCoreDispatchUtility.performBlock(onMainThread: { - guard let localSelf = self else { - return - } + pagingView.setPagingTouch { [weak self] pager in + DispatchQueue.main.async { + guard let self = self else { return } let currentPage = pager.currentPage() - localSelf.pageIndex = currentPage - localSelf.goTo(localSelf.currentIndex, animated: !UIAccessibility.isVoiceOverRunning) - }) + self.pageIndex = currentPage + self.goTo(self.currentIndex, animated: !UIAccessibility.isVoiceOverRunning) + } } self.pagingView = pagingView } @@ -246,7 +263,7 @@ open class Carousel: View { array?.append(pagingView!) } - self.accessibilityElements = array + accessibilityElements = array } else { cell.accessibilityElementsHidden = true } @@ -254,6 +271,7 @@ open class Carousel: View { } extension Carousel: UICollectionViewDelegateFlowLayout { + public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { let itemWidth = collectionView.bounds.width * CGFloat(itemWidthPercent) return CGSize(width: itemWidth, height: collectionView.bounds.height) @@ -265,6 +283,7 @@ extension Carousel: UICollectionViewDelegateFlowLayout { } extension Carousel: UICollectionViewDataSource { + public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return molecules?.count ?? 0 } @@ -280,6 +299,7 @@ extension Carousel: UICollectionViewDataSource { protocolCell.setWithModel(moleculeInfo.molecule, nil, nil) protocolCell.updateView(collectionView.bounds.width) } + setAccessiblity(cell, index: indexPath.row) return cell } @@ -290,20 +310,22 @@ extension Carousel: UIScrollViewDelegate { func goTo(_ index: Int, animated: Bool) { showPeaking(false) - setAccessiblity(collectionView.cellForItem(at: IndexPath(row: self.currentIndex, section: 0)), index: index) - self.currentIndex = index - self.collectionView.scrollToItem(at: IndexPath(row: self.currentIndex, section: 0), at: self.itemAlignment, animated: animated) - if let cell = collectionView.cellForItem(at: IndexPath(row: self.currentIndex, section: 0)) { - setAccessiblity(collectionView.cellForItem(at: IndexPath(row: self.currentIndex, section: 0)), index: index) + setAccessiblity(collectionView.cellForItem(at: IndexPath(row: currentIndex, section: 0)), index: index) + currentIndex = index + collectionView.scrollToItem(at: IndexPath(row: currentIndex, section: 0), at: itemAlignment, animated: animated) + + if let cell = collectionView.cellForItem(at: IndexPath(row: currentIndex, section: 0)) { + setAccessiblity(collectionView.cellForItem(at: IndexPath(row: currentIndex, section: 0)), index: index) UIAccessibility.post(notification: .layoutChanged, argument: cell) } } func handleUserOnBufferCell() { + guard loop else { return } let lastPageIndex = numberOfPages + 1 - let goToIndex = {(index: Int) in + let goToIndex = { (index: Int) in self.goTo(index, animated: false) self.collectionView.layoutIfNeeded() self.pagingView?.setPage(self.pageIndex) @@ -319,6 +341,7 @@ extension Carousel: UIScrollViewDelegate { } func checkForDraggingOutOfBounds(_ scrollView: UIScrollView) { + guard loop, dragging else { return } // Checks if the user is not paging but attempting to drag endlessly and goes out of bounds. Caps the index. @@ -326,10 +349,12 @@ extension Carousel: UIScrollViewDelegate { let itemWidth = collectionView.bounds.width * CGFloat(itemWidthPercent) let index = scrollView.contentOffset.x / (itemWidth + separatorWidth) let lastCellIndex = collectionView(collectionView, numberOfItemsInSection: 0) - 1 + if index < 1 { - self.currentIndex = 0 + currentIndex = 0 + } else if index > CGFloat(lastCellIndex - 1) { - self.currentIndex = lastCellIndex + currentIndex = lastCellIndex } } @@ -379,9 +404,7 @@ extension Carousel: UIScrollViewDelegate { public func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) { // Cycle to other end if on buffer cell. handleUserOnBufferCell() - pagingView?.setPage(pageIndex) - showPeaking(true) } } From faa9c94f9089c0873a424717cb1b511c2d0f4345 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Mon, 17 Feb 2020 13:33:25 -0500 Subject: [PATCH 10/78] latest carousel state --- .../CarouselIndicator/CarouselIndicator.swift | 29 +++----- .../CarouselIndicatorModel.swift | 47 +++++++++++- .../IndicatorViews/BarsIndicatorView.swift | 43 ++++++----- .../IndicatorViews/NumericIndicatorView.swift | 49 ++++++------- MVMCoreUI/BaseClasses/ImageView.swift | 28 ++++--- .../Views/MoleculeContainerModel.swift | 12 +++ MVMCoreUI/Organisms/Carousel.swift | 73 +++++++++++++------ MVMCoreUI/Organisms/CarouselModel.swift | 8 +- ...MoleculeMappingObject+ModelExtension.swift | 4 +- .../OtherHandlers/MoleculeObjectMapping.swift | 3 +- 10 files changed, 193 insertions(+), 103 deletions(-) diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift index 7a776a94..441fa416 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift @@ -15,15 +15,6 @@ public protocol IndicatorViewProtocol { var isEnabled: Bool { get set } } -/// Contracts behavior between carousel and its page control. -public protocol CarouselPageControlProtocol { - typealias PagingTouchBlock = ((CarouselPageControlProtocol)) -> () - var currentIndex: Int { get set } - var numberOfPages: Int { get set } - var indicatorTouchAction: PagingTouchBlock? { get set } - func scrollViewDidScroll(_ collectionView: UICollectionView) -} - open class CarouselIndicator: Control, CarouselPageControlProtocol { //-------------------------------------------------- @@ -83,7 +74,7 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { /// Set this closure to perform an action when a different indicator was selected. /// Passes through oldInde and newIndex, respectively. - public var indicatorTouchAction: CarouselIndicator.PagingTouchBlock? + public var indicatorTouchAction: ((CarouselPageControlProtocol) -> ())? /// Allows sendActions() to trigger even if index is already at min/max index. public var alwaysSendAction = false @@ -107,7 +98,7 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { indicatorView?.isEnabled = isEnabled } } - + //-------------------------------------------------- // MARK: - Computed Properties //-------------------------------------------------- @@ -160,7 +151,7 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { _indicatorTintColor = newColor if isBarIndicator(), let barIndicator = indicatorView as? BarsIndicatorView { - for (i, barTuple) in barIndicator.barsReference.enumerated() where i != currentIndex { + for (i, barTuple) in barIndicator.barReferences.enumerated() where i != currentIndex { barTuple.view.backgroundColor = newColor } } @@ -177,7 +168,7 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { if isBarIndicator() { if let barIndicator = indicatorView as? BarsIndicatorView { - barIndicator.barsReference[currentIndex].view.backgroundColor = newColor + barIndicator.barReferences[currentIndex].view.backgroundColor = newColor } } } @@ -265,9 +256,11 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { let touchPoint = tapGesture?.location(in: self) let touchPoint_X = touchPoint?.x ?? 0.0 - if isEnabled, indicatorType == .bar, let bars = (indicatorView as? BarsIndicatorView)?.barsReference { + if isBarIndicator(), let bars = (indicatorView as? BarsIndicatorView)?.barReferences { currentIndex = bars.firstIndex { $0.0.frame.maxX >= touchPoint_X && $0.0.frame.minX <= touchPoint_X } ?? 0 + } else { + // Determine which half of the view was touched. if touchPoint_X > bounds.width / 2 { incrementCurrentIndex() } else { @@ -289,7 +282,7 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { } public func performAction() { - + sendActions(for: .valueChanged) indicatorTouchAction?(self) } @@ -311,13 +304,11 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { /// Convenience to determine if current view is displaying bars. func isBarIndicator() -> Bool { - return indicatorType != .bar && numberOfPages > hybridThreshold } - public func scrollViewDidScroll(_ collectionView: UICollectionView) { - - } + public func scrollViewDidScroll(_ collectionView: UICollectionView) { } + //-------------------------------------------------- // MARK: - MoleculeViewProtocol //-------------------------------------------------- diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift index 0cff8f2e..fd39d90c 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift @@ -15,7 +15,7 @@ public class CarouselIndicatorModel: MoleculeModelProtocol { //-------------------------------------------------- public var backgroundColor: Color? - + public static var identifier: String { return "carouselIndicator" } @@ -33,8 +33,9 @@ public class CarouselIndicatorModel: MoleculeModelProtocol { public var accessibilityHasSlidesInsteadOfPage: Bool? = false public var isEnabled: Bool? = false public var disabledIndicatorColor: Color? = Color(uiColor: .mvmCoolGray3) - public var indicatorTintColor: Color? = Color(uiColor: .black) - public var currentIndicatorColor: Color? = Color(uiColor: .black) + public var indicatorTintColor: Color? = Color(uiColor: .mvmBlack) + public var currentIndicatorColor: Color? = Color(uiColor: .mvmBlack) +// public var position: Float? //-------------------------------------------------- // MARK: - Keys @@ -44,8 +45,19 @@ public class CarouselIndicatorModel: MoleculeModelProtocol { case moleculeName case backgroundColor case type + case hybridThreshold case barsColor case currentBarColor + case currentIndex + case numberOfPages + case alwaysSendEvent + case isAnimated + case hidesForSinglePage + case accessibilityHasSlidesInsteadOfPage + case isEnabled + case disabledIndicatorColor + case indicatorTintColor + case currentIndicatorColor } //-------------------------------------------------- @@ -54,18 +66,45 @@ public class CarouselIndicatorModel: MoleculeModelProtocol { required public init(from decoder: Decoder) throws { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) + moleculeName = try typeContainer.decodeIfPresent(String.self, forKey: .moleculeName) currentBarColor = try typeContainer.decodeIfPresent(Color.self, forKey: .currentBarColor) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) barsColor = try typeContainer.decodeIfPresent(Color.self, forKey: .barsColor) type = try typeContainer.decodeIfPresent(String.self, forKey: .type) ?? "hybrid" + hybridThreshold = try typeContainer.decodeIfPresent(Int.self, forKey: .hybridThreshold) ?? 5 + barsColor = try typeContainer.decodeIfPresent(Color.self, forKey: .barsColor) + currentBarColor = try typeContainer.decodeIfPresent(Color.self, forKey: .currentBarColor) + currentIndex = try typeContainer.decodeIfPresent(Int.self, forKey: .currentIndex) ?? 0 + numberOfPages = try typeContainer.decodeIfPresent(Int.self, forKey: .numberOfPages) ?? 0 + alwaysSendEvent = try typeContainer.decodeIfPresent(Bool.self, forKey: .alwaysSendEvent) ?? false + isAnimated = try typeContainer.decodeIfPresent(Bool.self, forKey: .isAnimated) ?? true + hidesForSinglePage = try typeContainer.decodeIfPresent(Bool.self, forKey: .hidesForSinglePage) ?? false + accessibilityHasSlidesInsteadOfPage = try typeContainer.decodeIfPresent(Bool.self, forKey: .accessibilityHasSlidesInsteadOfPage) ?? false + isEnabled = try typeContainer.decodeIfPresent(Bool.self, forKey: .isEnabled) ?? false + disabledIndicatorColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledIndicatorColor) ?? Color(uiColor: .mvmCoolGray3) + indicatorTintColor = try typeContainer.decodeIfPresent(Color.self, forKey: .indicatorTintColor) ?? Color(uiColor: .mvmBlack) + currentIndicatorColor = try typeContainer.decodeIfPresent(Color.self, forKey: .currentIndicatorColor) ?? Color(uiColor: .mvmBlack) } public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(moleculeName, forKey: .moleculeName) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) try container.encodeIfPresent(barsColor, forKey: .barsColor) try container.encodeIfPresent(currentBarColor, forKey: .currentBarColor) - try container.encode(moleculeName, forKey: .moleculeName) try container.encodeIfPresent(type, forKey: .type) + try container.encodeIfPresent(hybridThreshold, forKey: .hybridThreshold) + try container.encodeIfPresent(barsColor, forKey: .barsColor) + try container.encodeIfPresent(currentBarColor, forKey: .currentBarColor) + try container.encodeIfPresent(currentIndex, forKey: .currentIndex) + try container.encodeIfPresent(numberOfPages, forKey: .numberOfPages) + try container.encodeIfPresent(alwaysSendEvent, forKey: .alwaysSendEvent) + try container.encodeIfPresent(isAnimated, forKey: .isAnimated) + try container.encodeIfPresent(hidesForSinglePage, forKey: .hidesForSinglePage) + try container.encodeIfPresent(accessibilityHasSlidesInsteadOfPage, forKey: .accessibilityHasSlidesInsteadOfPage) + try container.encodeIfPresent(isEnabled, forKey: .isEnabled) + try container.encodeIfPresent(disabledIndicatorColor, forKey: .disabledIndicatorColor) + try container.encodeIfPresent(indicatorTintColor, forKey: .indicatorTintColor) + try container.encodeIfPresent(currentIndicatorColor, forKey: .currentIndicatorColor) } } diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift index 53ebd1a8..91fa6e29 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift @@ -11,7 +11,7 @@ import UIKit open class BarsIndicatorView: View, IndicatorViewProtocol { //-------------------------------------------------- - // MARK: - Properties + // MARK: - Stored Properties //-------------------------------------------------- let stackView: StackView = { @@ -19,40 +19,49 @@ open class BarsIndicatorView: View, IndicatorViewProtocol { stackView.axis = .horizontal stackView.distribution = .equalSpacing stackView.spacing = 6 + stackView.heightAnchor.constraint(greaterThanOrEqualToConstant: BarsIndicatorView.indicatorBarHeight.selected).isActive = true return stackView }() - public var barsReference: [(view: View, constraint: NSLayoutConstraint)] = [] + public var barReferences: [(view: View, constraint: NSLayoutConstraint)] = [] // Dimensions are based on InVision Design Guidelines. public static let indicatorBarWidth: CGFloat = 24 public static let indicatorBarHeight: (selected: CGFloat, unselected: CGFloat) = (selected: 4, unselected: 1) + //-------------------------------------------------- + // MARK: - Computed Properties + //-------------------------------------------------- + + public var parentCarouselIndicator: CarouselIndicator? { + return superview as? CarouselIndicator + } + public var enabledColor: UIColor { - return (superview as? CarouselIndicator)?.indicatorTintColor ?? .black + return parentCarouselIndicator?.indicatorTintColor ?? .mvmBlack } public var currentIndexColor: UIColor { - return (superview as? CarouselIndicator)?.currentIndicatorColor ?? .black + return parentCarouselIndicator?.currentIndicatorColor ?? .mvmBlack } public var disabledColor: UIColor { - return (superview as? CarouselIndicator)?.disabledIndicatorColor ?? .mvmCoolGray3 + return parentCarouselIndicator?.disabledIndicatorColor ?? .mvmCoolGray3 } /// Returns the numberOfPages count from its parent CarouselIndicator. public var numberOfPages: Int? { - return (superview as? CarouselIndicator)?.numberOfPages + return parentCarouselIndicator?.numberOfPages } /// Returns the numberOfPages count from its parent CarouselIndicator. public var currentIndex: Int? { - return (superview as? CarouselIndicator)?.currentIndex + return parentCarouselIndicator?.currentIndex } open var isEnabled: Bool = true { didSet { - barsReference.forEach { view, heightConstraint in + barReferences.forEach { view, heightConstraint in view.backgroundColor = isEnabled ? enabledColor : disabledColor } } @@ -82,7 +91,7 @@ open class BarsIndicatorView: View, IndicatorViewProtocol { stackView.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true stackView.leadingAnchor.constraint(greaterThanOrEqualTo: leadingAnchor).isActive = true - trailingAnchor.constraint(lessThanOrEqualTo: stackView.trailingAnchor).isActive = true + trailingAnchor.constraint(greaterThanOrEqualTo: stackView.trailingAnchor).isActive = true generateBars() } @@ -102,7 +111,7 @@ open class BarsIndicatorView: View, IndicatorViewProtocol { for i in 0.. String? { @@ -72,8 +79,8 @@ class ImageView: UIImageView, ModelMoleculeViewProtocol { // MARK:- MVMCoreViewProtocol extension ImageView: MVMCoreViewProtocol { - open func updateView(_ size: CGFloat) {} - + open func updateView(_ size: CGFloat) { } + /// Will be called only once. open func setupView() { translatesAutoresizingMaskIntoConstraints = false @@ -99,4 +106,3 @@ extension ImageView: MVMCoreUIMoleculeViewProtocol { open func setAsMolecule() { } } - diff --git a/MVMCoreUI/Containers/Views/MoleculeContainerModel.swift b/MVMCoreUI/Containers/Views/MoleculeContainerModel.swift index 0421b3d1..f54cfb7a 100644 --- a/MVMCoreUI/Containers/Views/MoleculeContainerModel.swift +++ b/MVMCoreUI/Containers/Views/MoleculeContainerModel.swift @@ -9,17 +9,29 @@ import Foundation public class MoleculeContainerModel: ContainerModel { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + public var molecule: MoleculeModelProtocol private enum CodingKeys: String, CodingKey { case molecule } + //-------------------------------------------------- + // MARK: - Initializer + //-------------------------------------------------- + public init(with moleculeModel: MoleculeModelProtocol) { molecule = moleculeModel super.init() } + //-------------------------------------------------- + // MARK: - Codec + //-------------------------------------------------- + required public init(from decoder: Decoder) throws { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) molecule = try typeContainer.decodeMolecule(codingKey: .molecule) diff --git a/MVMCoreUI/Organisms/Carousel.swift b/MVMCoreUI/Organisms/Carousel.swift index f332a6be..06be4f71 100644 --- a/MVMCoreUI/Organisms/Carousel.swift +++ b/MVMCoreUI/Organisms/Carousel.swift @@ -8,6 +8,15 @@ import UIKit +/// Contracts behavior between carousel and its page control. +public protocol CarouselPageControlProtocol { + var currentIndex: Int { get set } + var numberOfPages: Int { get set } + var indicatorTouchAction: ((CarouselPageControlProtocol) -> ())? { get set } + func scrollViewDidScroll(_ collectionView: UICollectionView) +} + + open class Carousel: View { //-------------------------------------------------- // MARK: - Properties @@ -33,7 +42,7 @@ open class Carousel: View { var molecules: [MoleculeModelProtocol]? /// The horizontal alignment of the cell in the collection view. Only noticeable if the itemWidthPercent is less than 100%. - var itemAlignment = UICollectionView.ScrollPosition.left + var itemAlignment: UICollectionView.ScrollPosition = .left /// From 0-1. The item width as a percent of the carousel width. var itemWidthPercent: Float = 1 @@ -42,10 +51,11 @@ open class Carousel: View { var collectionViewHeight: NSLayoutConstraint? /// The view that we use for paging - var pagingView: (UIView & MVMCoreUIPagingProtocol)? + var pagingView: (UIView & CarouselPageControlProtocol)? /// If the carousel should loop after scrolling past the first and final cells. var loop = false + private var dragging = false /// For adding pager @@ -141,9 +151,17 @@ open class Carousel: View { if carouselModel?.loop ?? false && newMolecules.count > 2 { // Sets up the row data with buffer cells on each side (for illusion of endless scroll... also has one more buffer cell on each side in case we can peek that cell). loop = true - molecules?.insert(newMolecules.last!, at: 0) + + if let last = newMolecules.last { + molecules?.insert(last, at: 0) + } + molecules?.insert(newMolecules[(newMolecules.count - 2)], at: 0) - molecules?.append(newMolecules.first!) + + if let first = newMolecules.first { + molecules?.append(first) + } + molecules?.append(newMolecules[1]) } @@ -153,9 +171,10 @@ open class Carousel: View { /// Sets up the paging molecule open func setupPagingMolecule(_ molecule: CarouselPagingModelProtocol?, delegateObject: MVMCoreUIDelegateObject?) { - var pagingView: (UIView & MVMCoreUIPagingProtocol)? = nil + var pagingView: (UIView & CarouselPageControlProtocol)? = nil + if let molecule = molecule { - pagingView = MVMCoreUIMoleculeMappingObject.shared()?.createMolecule(molecule, delegateObject, false) as? (UIView & MVMCoreUIPagingProtocol) + pagingView = MVMCoreUIMoleculeMappingObject.shared()?.createMolecule(molecule, delegateObject, false) as? (UIView & CarouselPageControlProtocol) } addPaging(view: pagingView, position: (CGFloat(molecule?.position ?? 20))) @@ -163,6 +182,7 @@ open class Carousel: View { /// Registers the cells with the collection view func registerCells(with carouselModel: CarouselModel, delegateObject: MVMCoreUIDelegateObject?) { + for molecule in carouselModel.molecules { if let info = getMoleculeInfo(with: molecule, delegateObject: delegateObject) { collectionView.register(info.class, forCellWithReuseIdentifier: info.identifier) @@ -176,6 +196,7 @@ open class Carousel: View { /// Returns the (identifier, class) of the molecule for the given map. func getMoleculeInfo(with molecule: MoleculeModelProtocol, delegateObject: MVMCoreUIDelegateObject?) -> (identifier: String, class: AnyClass, molecule: MoleculeModelProtocol)? { + guard let className = MVMCoreUIMoleculeMappingObject.shared()?.getMoleculeClass(molecule), let moleculeName = (className as? ModelMoleculeViewProtocol.Type)?.nameForReuse(molecule, delegateObject) ?? molecule.moleculeName else { return nil } @@ -189,26 +210,29 @@ open class Carousel: View { switch string { case "leading": itemAlignment = .left + case "trailing": itemAlignment = .right + case "center": itemAlignment = .centeredHorizontally - default: break + + default: + break } } /// Adds a paging view. Centers it horizontally with the collection view. The position is the vertical distance from the center of the page view to the bottom of the collection view. - open func addPaging(view: (UIView & MVMCoreUIPagingProtocol)?, position: CGFloat) { + open func addPaging(view: (UIView & CarouselPageControlProtocol)?, position: CGFloat) { pagingView?.removeFromSuperview() - guard let pagingView = view else { + guard var pagingView = view else { bottomPin?.isActive = false bottomPin = bottomAnchor.constraint(equalTo: collectionView.bottomAnchor) bottomPin?.isActive = true return } - - pagingView.translatesAutoresizingMaskIntoConstraints = false + addSubview(pagingView) pagingView.centerXAnchor.constraint(equalTo: collectionView.centerXAnchor).isActive = true collectionView.bottomAnchor.constraint(equalTo: pagingView.centerYAnchor, constant: position).isActive = true @@ -218,16 +242,17 @@ open class Carousel: View { bottomPin?.priority = .defaultLow bottomPin?.isActive = true - pagingView.setNumberOfPages(numberOfPages) + pagingView.numberOfPages = numberOfPages (pagingView as? MVMCoreUIViewConstrainingProtocol)?.alignHorizontal?(.fill) - pagingView.setPagingTouch { [weak self] pager in + pagingView.indicatorTouchAction = { [weak self] pager in DispatchQueue.main.async { guard let self = self else { return } - let currentPage = pager.currentPage() + let currentPage = pager.currentIndex self.pageIndex = currentPage self.goTo(self.currentIndex, animated: !UIAccessibility.isVoiceOverRunning) } } + self.pagingView = pagingView } @@ -236,6 +261,7 @@ open class Carousel: View { if peaking && !UIAccessibility.isVoiceOverRunning { // Show overlay and arrow in peaking Cell let visibleItemsPaths = collectionView.indexPathsForVisibleItems.sorted { $0.row < $1.row } + if let firstItem = visibleItemsPaths.first, firstItem.row != currentIndex { (collectionView.cellForItem(at: firstItem) as? MoleculeCollectionViewCell)?.setPeaking(true, animated: true) } @@ -257,10 +283,12 @@ open class Carousel: View { cell.accessibilityElementsHidden = false var array = cell.accessibilityElements - if let acc = pagingView?.accessibilityElements { - array?.append(contentsOf: acc) - } else { - array?.append(pagingView!) + if let pagingView = pagingView { + if let acc = pagingView.accessibilityElements { + array?.append(contentsOf: acc) + } else { + array?.append(pagingView) + } } accessibilityElements = array @@ -328,7 +356,7 @@ extension Carousel: UIScrollViewDelegate { let goToIndex = { (index: Int) in self.goTo(index, animated: false) self.collectionView.layoutIfNeeded() - self.pagingView?.setPage(self.pageIndex) + self.pagingView?.currentIndex = self.pageIndex } if currentIndex < 2 { @@ -367,7 +395,7 @@ extension Carousel: UIScrollViewDelegate { checkForDraggingOutOfBounds(scrollView) // Let the pager know our progress if needed. - pagingView?.scrollViewDidScroll?(collectionView) + pagingView?.scrollViewDidScroll(collectionView) } public func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { @@ -386,12 +414,13 @@ extension Carousel: UIScrollViewDelegate { // We switch cards if we pass the velocity threshold or position threshold (currently 50%). let itemWidth = collectionView.bounds.width * CGFloat(itemWidthPercent) - var cellToSwipeTo = Int(scrollView.contentOffset.x/(itemWidth + separatorWidth) + 0.5) + var cellToSwipeTo = Int(scrollView.contentOffset.x / (itemWidth + separatorWidth) + 0.5) let lastCellIndex = collectionView(collectionView, numberOfItemsInSection: 0) - 1 let velocityThreshold: CGFloat = 1.1 if velocity.x > velocityThreshold { cellToSwipeTo = currentIndex + 1 + } else if velocity.x < -velocityThreshold { cellToSwipeTo = currentIndex - 1 } @@ -404,7 +433,7 @@ extension Carousel: UIScrollViewDelegate { public func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) { // Cycle to other end if on buffer cell. handleUserOnBufferCell() - pagingView?.setPage(pageIndex) + pagingView?.currentIndex = pageIndex showPeaking(true) } } diff --git a/MVMCoreUI/Organisms/CarouselModel.swift b/MVMCoreUI/Organisms/CarouselModel.swift index c68f083a..9194e32c 100644 --- a/MVMCoreUI/Organisms/CarouselModel.swift +++ b/MVMCoreUI/Organisms/CarouselModel.swift @@ -13,7 +13,10 @@ import UIKit // MARK: - Properties //-------------------------------------------------- - public static var identifier: String = "carousel" + public static var identifier: String { + return "carousel" + } + public var backgroundColor: Color? public var molecules: [CarouselItemModel] public var moleculeName: String? @@ -29,7 +32,7 @@ import UIKit // MARK: - Initializer //-------------------------------------------------- - public init(molecules: [CarouselItemModel]){ + public init(molecules: [CarouselItemModel]) { self.molecules = molecules } @@ -56,6 +59,7 @@ import UIKit required public init(from decoder: Decoder) throws { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) + moleculeName = try typeContainer.decodeIfPresent(String.self, forKey: .moleculeName) molecules = try typeContainer.decode([CarouselItemModel].self, forKey: .molecules) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) spacing = try typeContainer.decodeIfPresent(Float.self, forKey: .spacing) diff --git a/MVMCoreUI/OtherHandlers/MVMCoreUIMoleculeMappingObject+ModelExtension.swift b/MVMCoreUI/OtherHandlers/MVMCoreUIMoleculeMappingObject+ModelExtension.swift index 6249e61e..241e3980 100644 --- a/MVMCoreUI/OtherHandlers/MVMCoreUIMoleculeMappingObject+ModelExtension.swift +++ b/MVMCoreUI/OtherHandlers/MVMCoreUIMoleculeMappingObject+ModelExtension.swift @@ -19,6 +19,7 @@ public extension MVMCoreUIMoleculeMappingObject { if let moleculeName = model.moleculeName { return moleculeMapping.object(forKey: moleculeName) as? AnyClass } + return nil } @@ -32,7 +33,7 @@ public extension MVMCoreUIMoleculeMappingObject { return nil } - let setData = {() in + let setData = { if let molecule = molecule as? ModelMoleculeViewProtocol { molecule.setWithModel(model, delegateObject, nil) } else { @@ -45,6 +46,7 @@ public extension MVMCoreUIMoleculeMappingObject { let view = ViewConstrainingView(molecule: molecule, alignment: castMolecule.horizontalAlignment?() ?? .fill) setData() return view + } else { setData() return molecule diff --git a/MVMCoreUI/OtherHandlers/MoleculeObjectMapping.swift b/MVMCoreUI/OtherHandlers/MoleculeObjectMapping.swift index b06c5fba..8758cb42 100644 --- a/MVMCoreUI/OtherHandlers/MoleculeObjectMapping.swift +++ b/MVMCoreUI/OtherHandlers/MoleculeObjectMapping.swift @@ -8,7 +8,9 @@ import Foundation + @objcMembers public class MoleculeObjectMapping: NSObject { + public static func registerObjects() { // Stacks MVMCoreUIMoleculeMappingObject.shared()?.register(viewClass: MoleculeStackView.self, viewModelClass: MoleculeStackModel.self) @@ -95,7 +97,6 @@ import Foundation // Other Organisms MVMCoreUIMoleculeMappingObject.shared()?.register(viewClass: Carousel.self, viewModelClass: CarouselModel.self) - MVMCoreUIMoleculeMappingObject.shared()?.register(viewClass: CarouselIndicator.self, viewModelClass: CarouselIndicatorModel.self) // TODO: Need model From 1bf1d0221689fd72e7ec1149c7bad6966ccda717 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Mon, 17 Feb 2020 14:18:29 -0500 Subject: [PATCH 11/78] latest carousel state --- .../CarouselIndicator/CarouselIndicator.swift | 20 +++++++++++++------ .../CarouselIndicatorModel.swift | 4 ++-- .../IndicatorViews/BarsIndicatorView.swift | 20 +++++-------------- MVMCoreUI/Organisms/CarouselModel.swift | 1 + 4 files changed, 22 insertions(+), 23 deletions(-) diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift index 441fa416..73e513e3 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift @@ -58,14 +58,18 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { /// The view control relative to the state of the indicator type. private(set) var indicatorView: IndicatorView? { + willSet { + indicatorView?.removeFromSuperview() + } didSet { - topConstraint = indicatorView?.topAnchor.constraint(equalTo: topAnchor, constant: PaddingTwo) + guard let indicatorView = indicatorView else { return } + addSubview(indicatorView) + + topConstraint = indicatorView.topAnchor.constraint(equalTo: topAnchor, constant: PaddingTwo) topConstraint?.isActive = true - if let indicatorView = indicatorView { - bottomConstraint = bottomAnchor.constraint(equalTo: indicatorView.bottomAnchor, constant: PaddingTwo) - bottomConstraint?.isActive = true - } + bottomConstraint = bottomAnchor.constraint(equalTo: indicatorView.bottomAnchor, constant: PaddingTwo) + bottomConstraint?.isActive = true } } @@ -137,6 +141,10 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { indicatorView = BarsIndicatorView() } + if isBarIndicator() { + (indicatorView as? BarsIndicatorView)?.generateBars() + } + updateUI() } } @@ -304,7 +312,7 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { /// Convenience to determine if current view is displaying bars. func isBarIndicator() -> Bool { - return indicatorType != .bar && numberOfPages > hybridThreshold + return indicatorType == .bar || indicatorType == .hybrid && numberOfPages <= hybridThreshold } public func scrollViewDidScroll(_ collectionView: UICollectionView) { } diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift index fd39d90c..70c685a1 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift @@ -9,7 +9,7 @@ import Foundation -public class CarouselIndicatorModel: MoleculeModelProtocol { +public class CarouselIndicatorModel: CarouselPagingModelProtocol { //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- @@ -35,7 +35,7 @@ public class CarouselIndicatorModel: MoleculeModelProtocol { public var disabledIndicatorColor: Color? = Color(uiColor: .mvmCoolGray3) public var indicatorTintColor: Color? = Color(uiColor: .mvmBlack) public var currentIndicatorColor: Color? = Color(uiColor: .mvmBlack) -// public var position: Float? + public var position: Float? //-------------------------------------------------- // MARK: - Keys diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift index 91fa6e29..9f2cb365 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift @@ -19,7 +19,7 @@ open class BarsIndicatorView: View, IndicatorViewProtocol { stackView.axis = .horizontal stackView.distribution = .equalSpacing stackView.spacing = 6 - stackView.heightAnchor.constraint(greaterThanOrEqualToConstant: BarsIndicatorView.indicatorBarHeight.selected).isActive = true + stackView.heightAnchor.constraint(lessThanOrEqualToConstant: BarsIndicatorView.indicatorBarHeight.selected).isActive = true return stackView }() @@ -49,16 +49,6 @@ open class BarsIndicatorView: View, IndicatorViewProtocol { return parentCarouselIndicator?.disabledIndicatorColor ?? .mvmCoolGray3 } - /// Returns the numberOfPages count from its parent CarouselIndicator. - public var numberOfPages: Int? { - return parentCarouselIndicator?.numberOfPages - } - - /// Returns the numberOfPages count from its parent CarouselIndicator. - public var currentIndex: Int? { - return parentCarouselIndicator?.currentIndex - } - open var isEnabled: Bool = true { didSet { barReferences.forEach { view, heightConstraint in @@ -92,8 +82,6 @@ open class BarsIndicatorView: View, IndicatorViewProtocol { stackView.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true stackView.leadingAnchor.constraint(greaterThanOrEqualTo: leadingAnchor).isActive = true trailingAnchor.constraint(greaterThanOrEqualTo: stackView.trailingAnchor).isActive = true - - generateBars() } //-------------------------------------------------- @@ -102,8 +90,8 @@ open class BarsIndicatorView: View, IndicatorViewProtocol { func generateBars() { - guard let numberOfPages = numberOfPages, - let currentIndex = currentIndex + guard let numberOfPages = parentCarouselIndicator?.numberOfPages, + let currentIndex = parentCarouselIndicator?.currentIndex else { return } var bars = [(View, NSLayoutConstraint)]() @@ -135,6 +123,8 @@ open class BarsIndicatorView: View, IndicatorViewProtocol { public func updateUI(previousIndex: Int, newIndex: Int, totalCount: Int, isAnimated: Bool) { + guard !barReferences.isEmpty else { return } + let expression = { self.barReferences[previousIndex].view.backgroundColor = self.enabledColor self.barReferences[newIndex].view.backgroundColor = self.currentIndexColor diff --git a/MVMCoreUI/Organisms/CarouselModel.swift b/MVMCoreUI/Organisms/CarouselModel.swift index 9194e32c..a455e635 100644 --- a/MVMCoreUI/Organisms/CarouselModel.swift +++ b/MVMCoreUI/Organisms/CarouselModel.swift @@ -8,6 +8,7 @@ import UIKit + @objcMembers public class CarouselModel: MoleculeModelProtocol { //-------------------------------------------------- // MARK: - Properties From 3fc41843494f5cd01bf65f0d8d0010e64998236c Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Mon, 17 Feb 2020 15:31:10 -0500 Subject: [PATCH 12/78] general working order --- .../CarouselIndicator/CarouselIndicator.swift | 4 +++ .../IndicatorViews/BarsIndicatorView.swift | 23 ++++--------- .../IndicatorViews/NumericIndicatorView.swift | 34 ++++--------------- MVMCoreUI/Organisms/Carousel.swift | 2 +- 4 files changed, 19 insertions(+), 44 deletions(-) diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift index 73e513e3..a5e00d84 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift @@ -235,6 +235,10 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { let leftSwipe = UISwipeGestureRecognizer(target: self, action: #selector(swipeLeft)) let rightSwipe = UISwipeGestureRecognizer(target: self, action: #selector(swipeRight)) + addGestureRecognizer(tap) + addGestureRecognizer(leftSwipe) + addGestureRecognizer(rightSwipe) + uiGestures.insert(tap) uiGestures.insert(leftSwipe) uiGestures.insert(rightSwipe) diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift index 9f2cb365..cd34003a 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift @@ -17,6 +17,7 @@ open class BarsIndicatorView: View, IndicatorViewProtocol { let stackView: StackView = { let stackView = StackView() stackView.axis = .horizontal + stackView.alignment = .bottom stackView.distribution = .equalSpacing stackView.spacing = 6 stackView.heightAnchor.constraint(lessThanOrEqualToConstant: BarsIndicatorView.indicatorBarHeight.selected).isActive = true @@ -37,22 +38,10 @@ open class BarsIndicatorView: View, IndicatorViewProtocol { return superview as? CarouselIndicator } - public var enabledColor: UIColor { - return parentCarouselIndicator?.indicatorTintColor ?? .mvmBlack - } - - public var currentIndexColor: UIColor { - return parentCarouselIndicator?.currentIndicatorColor ?? .mvmBlack - } - - public var disabledColor: UIColor { - return parentCarouselIndicator?.disabledIndicatorColor ?? .mvmCoolGray3 - } - open var isEnabled: Bool = true { didSet { barReferences.forEach { view, heightConstraint in - view.backgroundColor = isEnabled ? enabledColor : disabledColor + view.backgroundColor = isEnabled ? parentCarouselIndicator?.indicatorTintColor ?? .mvmBlack : parentCarouselIndicator?.disabledIndicatorColor ?? .mvmCoolGray3 } } } @@ -79,6 +68,8 @@ open class BarsIndicatorView: View, IndicatorViewProtocol { addSubview(stackView) isUserInteractionEnabled = false + heightAnchor.constraint(equalToConstant: 4).isActive = true + stackView.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true stackView.leadingAnchor.constraint(greaterThanOrEqualTo: leadingAnchor).isActive = true trailingAnchor.constraint(greaterThanOrEqualTo: stackView.trailingAnchor).isActive = true @@ -99,7 +90,7 @@ open class BarsIndicatorView: View, IndicatorViewProtocol { for i in 0.. Date: Fri, 28 Feb 2020 10:16:40 -0500 Subject: [PATCH 13/78] adjusting --- .../CarouselIndicator/CarouselIndicator.swift | 4 + .../CarouselIndicatorModel.swift | 85 +++++++++++++------ .../IndicatorViews/BarsIndicatorView.swift | 5 +- MVMCoreUI/Organisms/Carousel.swift | 5 +- 4 files changed, 68 insertions(+), 31 deletions(-) diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift index a5e00d84..ecf6089b 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift @@ -173,6 +173,7 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { get { return _currentIndicatorColor } set (newColor) { _currentIndicatorColor = newColor + carouselIndicatorModel?.currentIndicatorColor = Color(uiColor: newColor) if isBarIndicator() { if let barIndicator = indicatorView as? BarsIndicatorView { @@ -235,6 +236,9 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { let leftSwipe = UISwipeGestureRecognizer(target: self, action: #selector(swipeLeft)) let rightSwipe = UISwipeGestureRecognizer(target: self, action: #selector(swipeRight)) + leftSwipe.direction = .left + rightSwipe.direction = .right + addGestureRecognizer(tap) addGestureRecognizer(leftSwipe) addGestureRecognizer(rightSwipe) diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift index 70c685a1..2e9c6c77 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift @@ -14,27 +14,26 @@ public class CarouselIndicatorModel: CarouselPagingModelProtocol { // MARK: - Properties //-------------------------------------------------- - public var backgroundColor: Color? - public static var identifier: String { return "carouselIndicator" } + public var backgroundColor: Color? public var moleculeName: String? - public var type: String? = "hybrid" + public var type: String = "hybrid" public var hybridThreshold: Int = 5 public var barsColor: Color? public var currentBarColor: Color? - public var currentIndex: Int? = 0 - public var numberOfPages: Int? = 0 - public var alwaysSendEvent: Bool? = false - public var isAnimated: Bool? = true - public var hidesForSinglePage: Bool? = false - public var accessibilityHasSlidesInsteadOfPage: Bool? = false - public var isEnabled: Bool? = false - public var disabledIndicatorColor: Color? = Color(uiColor: .mvmCoolGray3) - public var indicatorTintColor: Color? = Color(uiColor: .mvmBlack) - public var currentIndicatorColor: Color? = Color(uiColor: .mvmBlack) + public var currentIndex: Int = 0 + public var numberOfPages: Int = 0 + public var alwaysSendEvent: Bool = false + public var isAnimated: Bool = true + public var hidesForSinglePage: Bool = false + public var accessibilityHasSlidesInsteadOfPage: Bool = false + public var isEnabled: Bool = false + public var disabledIndicatorColor: Color = Color(uiColor: .mvmCoolGray3) + public var indicatorTintColor: Color = Color(uiColor: .mvmBlack) + public var currentIndicatorColor: Color = Color(uiColor: .mvmBlack) public var position: Float? //-------------------------------------------------- @@ -70,20 +69,56 @@ public class CarouselIndicatorModel: CarouselPagingModelProtocol { currentBarColor = try typeContainer.decodeIfPresent(Color.self, forKey: .currentBarColor) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) barsColor = try typeContainer.decodeIfPresent(Color.self, forKey: .barsColor) - type = try typeContainer.decodeIfPresent(String.self, forKey: .type) ?? "hybrid" - hybridThreshold = try typeContainer.decodeIfPresent(Int.self, forKey: .hybridThreshold) ?? 5 barsColor = try typeContainer.decodeIfPresent(Color.self, forKey: .barsColor) currentBarColor = try typeContainer.decodeIfPresent(Color.self, forKey: .currentBarColor) - currentIndex = try typeContainer.decodeIfPresent(Int.self, forKey: .currentIndex) ?? 0 - numberOfPages = try typeContainer.decodeIfPresent(Int.self, forKey: .numberOfPages) ?? 0 - alwaysSendEvent = try typeContainer.decodeIfPresent(Bool.self, forKey: .alwaysSendEvent) ?? false - isAnimated = try typeContainer.decodeIfPresent(Bool.self, forKey: .isAnimated) ?? true - hidesForSinglePage = try typeContainer.decodeIfPresent(Bool.self, forKey: .hidesForSinglePage) ?? false - accessibilityHasSlidesInsteadOfPage = try typeContainer.decodeIfPresent(Bool.self, forKey: .accessibilityHasSlidesInsteadOfPage) ?? false - isEnabled = try typeContainer.decodeIfPresent(Bool.self, forKey: .isEnabled) ?? false - disabledIndicatorColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledIndicatorColor) ?? Color(uiColor: .mvmCoolGray3) - indicatorTintColor = try typeContainer.decodeIfPresent(Color.self, forKey: .indicatorTintColor) ?? Color(uiColor: .mvmBlack) - currentIndicatorColor = try typeContainer.decodeIfPresent(Color.self, forKey: .currentIndicatorColor) ?? Color(uiColor: .mvmBlack) + + if let type = try typeContainer.decodeIfPresent(String.self, forKey: .type) { + self.type = type + } + + if let hybridThreshold = try typeContainer.decodeIfPresent(Int.self, forKey: .hybridThreshold) { + self.hybridThreshold = hybridThreshold + } + + if let currentIndex = try typeContainer.decodeIfPresent(Int.self, forKey: .currentIndex) { + self.currentIndex = currentIndex + } + + if let numberOfPages = try typeContainer.decodeIfPresent(Int.self, forKey: .numberOfPages) { + self.numberOfPages = numberOfPages + } + + if let alwaysSendEvent = try typeContainer.decodeIfPresent(Bool.self, forKey: .alwaysSendEvent) { + self.alwaysSendEvent = alwaysSendEvent + } + + if let isAnimated = try typeContainer.decodeIfPresent(Bool.self, forKey: .isAnimated) { + self.isAnimated = isAnimated + } + + if let hidesForSinglePage = try typeContainer.decodeIfPresent(Bool.self, forKey: .hidesForSinglePage) { + self.hidesForSinglePage = hidesForSinglePage + } + + if let accessibilityHasSlidesInsteadOfPage = try typeContainer.decodeIfPresent(Bool.self, forKey: .accessibilityHasSlidesInsteadOfPage) { + self.accessibilityHasSlidesInsteadOfPage = accessibilityHasSlidesInsteadOfPage + } + + if let isEnabled = try typeContainer.decodeIfPresent(Bool.self, forKey: .isEnabled) { + self.isEnabled = isEnabled + } + + if let disabledIndicatorColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledIndicatorColor) { + self.disabledIndicatorColor = disabledIndicatorColor + } + + if let indicatorTintColor = try typeContainer.decodeIfPresent(Color.self, forKey: .indicatorTintColor) { + self.indicatorTintColor = indicatorTintColor + } + + if let currentIndicatorColor = try typeContainer.decodeIfPresent(Color.self, forKey: .currentIndicatorColor) { + self.currentIndicatorColor = currentIndicatorColor + } } public func encode(to encoder: Encoder) throws { diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift index cd34003a..43e7655d 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift @@ -69,10 +69,9 @@ open class BarsIndicatorView: View, IndicatorViewProtocol { isUserInteractionEnabled = false heightAnchor.constraint(equalToConstant: 4).isActive = true - stackView.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true - stackView.leadingAnchor.constraint(greaterThanOrEqualTo: leadingAnchor).isActive = true - trailingAnchor.constraint(greaterThanOrEqualTo: stackView.trailingAnchor).isActive = true + stackView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true + trailingAnchor.constraint(equalTo: stackView.trailingAnchor).isActive = true } //-------------------------------------------------- diff --git a/MVMCoreUI/Organisms/Carousel.swift b/MVMCoreUI/Organisms/Carousel.swift index b20c1fb3..861642c2 100644 --- a/MVMCoreUI/Organisms/Carousel.swift +++ b/MVMCoreUI/Organisms/Carousel.swift @@ -226,8 +226,9 @@ open class Carousel: View { open func addPaging(view: (UIView & CarouselPageControlProtocol)?, position: CGFloat) { pagingView?.removeFromSuperview() + bottomPin?.isActive = false + guard var pagingView = view else { - bottomPin?.isActive = false bottomPin = bottomAnchor.constraint(equalTo: collectionView.bottomAnchor) bottomPin?.isActive = true return @@ -236,8 +237,6 @@ open class Carousel: View { addSubview(pagingView) pagingView.centerXAnchor.constraint(equalTo: collectionView.centerXAnchor).isActive = true collectionView.bottomAnchor.constraint(equalTo: pagingView.bottomAnchor, constant: position).isActive = true - bottomAnchor.constraint(greaterThanOrEqualTo: pagingView.bottomAnchor).isActive = true - bottomPin?.isActive = false bottomPin = bottomAnchor.constraint(equalTo: collectionView.bottomAnchor) bottomPin?.priority = .defaultLow bottomPin?.isActive = true From 3470e77b76da81330e7f6b307ce538eb8e1e2c7b Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Fri, 28 Feb 2020 13:10:15 -0500 Subject: [PATCH 14/78] latest state --- .../CarouselIndicator/CarouselIndicator.swift | 4 ++- .../IndicatorViews/NumericIndicatorView.swift | 33 ++++++++----------- MVMCoreUI/BaseClasses/ImageView.swift | 2 +- MVMCoreUI/BaseClasses/StackView.swift | 8 ++--- 4 files changed, 20 insertions(+), 27 deletions(-) diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift index 03a590c4..e12b9c0d 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift @@ -329,7 +329,9 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { // MARK: - MoleculeViewProtocol //-------------------------------------------------- - open func setWithModel(_ model: MoleculeModelProtocol?, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { + + + open override func set(with model: MoleculeModelProtocol?, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { // super.setWithModel(model, delegateObject, additionalData) guard let model = model as? CarouselIndicatorModel else { return } diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/NumericIndicatorView.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/NumericIndicatorView.swift index 6515440c..cb91e1d3 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/NumericIndicatorView.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/NumericIndicatorView.swift @@ -22,22 +22,18 @@ open class NumericIndicatorView: View, IndicatorViewProtocol { return label }() - let leftArrow: ImageView = { - let arrow = UIImage(named: "peakingRightArrow")?.withRenderingMode(.alwaysTemplate).withHorizontallyFlippedOrientation() - let imageView = ImageView(image: arrow) - imageView.tintColor = .mvmBlack - imageView.heightAnchor.constraint(equalToConstant: PaddingTwo).isActive = true - imageView.widthAnchor.constraint(equalToConstant: PaddingTwo).isActive = true - return imageView + let leftArrow: Arrow = { + let arrow = Arrow() + (arrow.model as? ArrowModel)?.degrees = 180 + arrow.pinHeightAndWidth() + arrow.setNeedsDisplay() + return arrow }() - let rightArrow: ImageView = { - let arrow = UIImage(named: "peakingRightArrow")?.withRenderingMode(.alwaysTemplate) - let imageView = ImageView(image: arrow) - imageView.tintColor = .mvmBlack - imageView.heightAnchor.constraint(equalToConstant: PaddingTwo).isActive = true - imageView.widthAnchor.constraint(equalToConstant: PaddingTwo).isActive = true - return imageView + let rightArrow: Arrow = { + let arrow = Arrow() + arrow.pinHeightAndWidth() + return arrow }() //-------------------------------------------------- @@ -93,17 +89,16 @@ open class NumericIndicatorView: View, IndicatorViewProtocol { isUserInteractionEnabled = false addSubview(pageCountLabel) + addSubview(leftArrow) + addSubview(rightArrow) + pageCountLabel.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true pageCountLabel.topAnchor.constraint(equalTo: topAnchor).isActive = true bottomAnchor.constraint(equalTo: pageCountLabel.bottomAnchor).isActive = true - - addSubview(leftArrow) leftArrow.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true - - addSubview(rightArrow) rightArrow.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true - NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: "H:|[leftArrow]-(padding)-[pageCountLabel]-(padding)-[rightArrow]|", + NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: "H:|-[leftArrow]-(padding)-[pageCountLabel]-(padding)-[rightArrow]-|", options: .directionLeadingToTrailing, metrics: ["padding": PaddingOne], views: ["leftArrow": leftArrow, diff --git a/MVMCoreUI/BaseClasses/ImageView.swift b/MVMCoreUI/BaseClasses/ImageView.swift index b240bbeb..461397a8 100644 --- a/MVMCoreUI/BaseClasses/ImageView.swift +++ b/MVMCoreUI/BaseClasses/ImageView.swift @@ -60,7 +60,7 @@ open class ImageView: UIImageView, ModelMoleculeViewProtocol { } - open func setWithModel(_ model: MoleculeModelProtocol?, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { + open func set(with model: MoleculeModelProtocol?, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { self.model = model if let backgroundColor = model?.backgroundColor { self.backgroundColor = backgroundColor.uiColor diff --git a/MVMCoreUI/BaseClasses/StackView.swift b/MVMCoreUI/BaseClasses/StackView.swift index 4742972e..4ca167c6 100644 --- a/MVMCoreUI/BaseClasses/StackView.swift +++ b/MVMCoreUI/BaseClasses/StackView.swift @@ -48,13 +48,9 @@ open class StackView: UIStackView, ModelMoleculeViewProtocol { // MARK: - ModelMoleculeViewProtocol //-------------------------------------------------- - public func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable : Any]?) { - - } - - open func setWithModel(_ model: MoleculeModelProtocol?, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { + open func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { self.model = model - if let backgroundColor = model?.backgroundColor { + if let backgroundColor = model.backgroundColor { self.backgroundColor = backgroundColor.uiColor } } From 64ada3e61da50fe93e30ec0679c1846da1abb256 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Mon, 2 Mar 2020 09:24:07 -0500 Subject: [PATCH 15/78] fixed constraints --- .../Views/CarouselIndicator/CarouselIndicator.swift | 3 +++ .../IndicatorViews/BarsIndicatorView.swift | 3 ++- .../IndicatorViews/NumericIndicatorView.swift | 10 +++------- MVMCoreUI/Organisms/Carousel.swift | 8 +++++--- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift index e12b9c0d..f5ca5342 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift @@ -70,6 +70,9 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { bottomConstraint = bottomAnchor.constraint(equalTo: indicatorView.bottomAnchor, constant: PaddingTwo) bottomConstraint?.isActive = true + + indicatorView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true + trailingAnchor.constraint(equalTo: indicatorView.trailingAnchor).isActive = true } } diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift index 43e7655d..5ca80ba7 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift @@ -68,7 +68,8 @@ open class BarsIndicatorView: View, IndicatorViewProtocol { addSubview(stackView) isUserInteractionEnabled = false - heightAnchor.constraint(equalToConstant: 4).isActive = true + stackView.heightAnchor.constraint(equalToConstant: 4).isActive = true +// heightAnchor.constraint(equalToConstant: 4).isActive = true stackView.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true stackView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true trailingAnchor.constraint(equalTo: stackView.trailingAnchor).isActive = true diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/NumericIndicatorView.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/NumericIndicatorView.swift index cb91e1d3..776c9ff6 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/NumericIndicatorView.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/NumericIndicatorView.swift @@ -87,7 +87,7 @@ open class NumericIndicatorView: View, IndicatorViewProtocol { super.setupView() isUserInteractionEnabled = false - + backgroundColor = .black addSubview(pageCountLabel) addSubview(leftArrow) addSubview(rightArrow) @@ -112,11 +112,7 @@ open class NumericIndicatorView: View, IndicatorViewProtocol { open func updateUI(previousIndex oldIndex: Int, newIndex: Int, totalCount: Int, isAnimated: Bool) { - DispatchQueue.main.async { [weak self] in - guard let self = self else { return } - - self.pageCountLabel.text = "\(newIndex)/\(totalCount)" - self.layoutIfNeeded() - } + pageCountLabel.text = "\(newIndex)/\(totalCount)" + layoutIfNeeded() } } diff --git a/MVMCoreUI/Organisms/Carousel.swift b/MVMCoreUI/Organisms/Carousel.swift index cc230e66..928ce8da 100644 --- a/MVMCoreUI/Organisms/Carousel.swift +++ b/MVMCoreUI/Organisms/Carousel.swift @@ -97,6 +97,8 @@ open class Carousel: View { //-------------------------------------------------- // MARK: - MVMCoreUIMoleculeViewProtocol + //-------------------------------------------------- + public override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { super.set(with: model, delegateObject, additionalData) guard let carouselModel = model as? CarouselModel else { return } @@ -194,9 +196,9 @@ open class Carousel: View { /// Returns the (identifier, class) of the molecule for the given map. func getMoleculeInfo(with molecule: MoleculeModelProtocol, delegateObject: MVMCoreUIDelegateObject?) -> (identifier: String, class: AnyClass, molecule: MoleculeModelProtocol)? { guard let className = MVMCoreUIMoleculeMappingObject.shared()?.getMoleculeClass(molecule) , - let moleculeName = (className as? ModelMoleculeViewProtocol.Type)?.nameForReuse(with: molecule, delegateObject) ?? molecule.moleculeName else { - return nil - } + let moleculeName = (className as? ModelMoleculeViewProtocol.Type)?.nameForReuse(with: molecule, delegateObject) ?? molecule.moleculeName + else { return nil } + return (moleculeName, className, molecule) } From 3e3b7dac79be4ea18025a2c2bb6266eea568e7e4 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Mon, 2 Mar 2020 13:01:07 -0500 Subject: [PATCH 16/78] general working order --- MVMCoreUI/Atoms/Views/Arrow.swift | 18 ++++++++ MVMCoreUI/Atoms/Views/ArrowModel.swift | 6 +++ .../CarouselIndicator/CarouselIndicator.swift | 14 ++---- .../IndicatorViews/BarsIndicatorView.swift | 1 - .../IndicatorViews/NumericIndicatorView.swift | 46 +++++++++---------- 5 files changed, 50 insertions(+), 35 deletions(-) diff --git a/MVMCoreUI/Atoms/Views/Arrow.swift b/MVMCoreUI/Atoms/Views/Arrow.swift index e932dd60..2ed4a70d 100644 --- a/MVMCoreUI/Atoms/Views/Arrow.swift +++ b/MVMCoreUI/Atoms/Views/Arrow.swift @@ -34,6 +34,24 @@ open class Arrow: View { widthConstraint?.isActive = true } + //-------------------------------------------------- + // MARK: - Initializers + //-------------------------------------------------- + + public override init(frame: CGRect) { + super.init(frame: frame) + } + + public convenience init(model: ArrowModel, degrees: Float = 0) { + self.init(frame: .zero) + self.model = model + arrowModel?.degrees = degrees + } + + public required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + //-------------------------------------------------- // MARK: - Lifecycle //-------------------------------------------------- diff --git a/MVMCoreUI/Atoms/Views/ArrowModel.swift b/MVMCoreUI/Atoms/Views/ArrowModel.swift index a0f24d15..69a6dd1f 100644 --- a/MVMCoreUI/Atoms/Views/ArrowModel.swift +++ b/MVMCoreUI/Atoms/Views/ArrowModel.swift @@ -29,6 +29,12 @@ open class ArrowModel: MoleculeModelProtocol { public var height: CGFloat = 12 public var width: CGFloat = 12 + + //-------------------------------------------------- + // MARK: - Initializer + //-------------------------------------------------- + + public init() { } //-------------------------------------------------- // MARK: - Keys diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift index f5ca5342..f374fafe 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift @@ -58,10 +58,10 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { /// The view control relative to the state of the indicator type. private(set) var indicatorView: IndicatorView? { - willSet { - indicatorView?.removeFromSuperview() - } + willSet { indicatorView?.removeFromSuperview() } didSet { + indicatorView?.removeFromSuperview() + guard let indicatorView = indicatorView else { return } addSubview(indicatorView) @@ -73,6 +73,7 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { indicatorView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true trailingAnchor.constraint(equalTo: indicatorView.trailingAnchor).isActive = true + updateUI() } } @@ -137,12 +138,7 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { guard _numberOfPages != newTotal else { return } _numberOfPages = newTotal - if hidesForSinglePage && newTotal <= 1 { - isHidden = true - } else { - isHidden = false - indicatorView = BarsIndicatorView() - } + isHidden = hidesForSinglePage && newTotal <= 1 if isBarIndicator() { (indicatorView as? BarsIndicatorView)?.generateBars() diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift index 5ca80ba7..69c34895 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift @@ -69,7 +69,6 @@ open class BarsIndicatorView: View, IndicatorViewProtocol { isUserInteractionEnabled = false stackView.heightAnchor.constraint(equalToConstant: 4).isActive = true -// heightAnchor.constraint(equalToConstant: 4).isActive = true stackView.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true stackView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true trailingAnchor.constraint(equalTo: stackView.trailingAnchor).isActive = true diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/NumericIndicatorView.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/NumericIndicatorView.swift index 776c9ff6..41be20cd 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/NumericIndicatorView.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/NumericIndicatorView.swift @@ -15,7 +15,7 @@ open class NumericIndicatorView: View, IndicatorViewProtocol { //-------------------------------------------------- /// Text to display the current count of total pages for viewing. - open var pageCountLabel: Label = { + open var pageCount: Label = { let label = Label.commonLabelB2(true) label.setContentCompressionResistancePriority(.required, for: .vertical) label.textAlignment = .center @@ -23,15 +23,13 @@ open class NumericIndicatorView: View, IndicatorViewProtocol { }() let leftArrow: Arrow = { - let arrow = Arrow() - (arrow.model as? ArrowModel)?.degrees = 180 + let arrow = Arrow(model: ArrowModel(), degrees: 180) arrow.pinHeightAndWidth() - arrow.setNeedsDisplay() return arrow }() let rightArrow: Arrow = { - let arrow = Arrow() + let arrow = Arrow(model: ArrowModel()) arrow.pinHeightAndWidth() return arrow }() @@ -41,19 +39,19 @@ open class NumericIndicatorView: View, IndicatorViewProtocol { //-------------------------------------------------- public var parentCarouselIndicator: CarouselIndicator? { - return superview as? CarouselIndicator - } + return superview as? CarouselIndicator + } open var isEnabled: Bool = true { didSet { let enabledColor = parentCarouselIndicator?.indicatorTintColor ?? .mvmBlack let disabledColor = parentCarouselIndicator?.disabledIndicatorColor ?? .mvmCoolGray3 - pageCountLabel.textColor = isEnabled ? enabledColor : disabledColor + pageCount.textColor = isEnabled ? enabledColor : disabledColor leftArrow.tintColor = isEnabled ? enabledColor : disabledColor rightArrow.tintColor = isEnabled ? enabledColor : disabledColor } } - + //-------------------------------------------------- // MARK: - Initializers //-------------------------------------------------- @@ -76,7 +74,7 @@ open class NumericIndicatorView: View, IndicatorViewProtocol { open override func updateView(_ size: CGFloat) { super.updateView(size) - pageCountLabel.updateView(size) + pageCount.updateView(size) } //-------------------------------------------------- @@ -87,23 +85,21 @@ open class NumericIndicatorView: View, IndicatorViewProtocol { super.setupView() isUserInteractionEnabled = false - backgroundColor = .black - addSubview(pageCountLabel) + addSubview(pageCount) addSubview(leftArrow) addSubview(rightArrow) - pageCountLabel.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true - pageCountLabel.topAnchor.constraint(equalTo: topAnchor).isActive = true - bottomAnchor.constraint(equalTo: pageCountLabel.bottomAnchor).isActive = true - leftArrow.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true - rightArrow.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true - - NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: "H:|-[leftArrow]-(padding)-[pageCountLabel]-(padding)-[rightArrow]-|", - options: .directionLeadingToTrailing, - metrics: ["padding": PaddingOne], - views: ["leftArrow": leftArrow, - "pageCountLabel": pageCountLabel, - "rightArrow": rightArrow])) + NSLayoutConstraint.activate([ + pageCount.centerXAnchor.constraint(equalTo: centerXAnchor), + pageCount.topAnchor.constraint(equalTo: topAnchor), + bottomAnchor.constraint(equalTo: pageCount.bottomAnchor), + leftArrow.centerYAnchor.constraint(equalTo: centerYAnchor), + rightArrow.centerYAnchor.constraint(equalTo: centerYAnchor), + leftArrow.leadingAnchor.constraint(equalTo: leadingAnchor), + pageCount.leadingAnchor.constraint(equalTo: leftArrow.trailingAnchor, constant: PaddingOne), + rightArrow.leadingAnchor.constraint(equalTo: pageCount.trailingAnchor, constant: PaddingOne), + trailingAnchor.constraint(equalTo: rightArrow.trailingAnchor) + ]) } //-------------------------------------------------- @@ -112,7 +108,7 @@ open class NumericIndicatorView: View, IndicatorViewProtocol { open func updateUI(previousIndex oldIndex: Int, newIndex: Int, totalCount: Int, isAnimated: Bool) { - pageCountLabel.text = "\(newIndex)/\(totalCount)" + pageCount.text = "\(newIndex + 1)/\(totalCount)" layoutIfNeeded() } } From b00485c81af10a92a193fa166217f575d6860c30 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Mon, 2 Mar 2020 15:52:02 -0500 Subject: [PATCH 17/78] transitioning logical view model separation --- .../CarouselIndicator/CarouselIndicator.swift | 75 +++++++------------ .../CarouselIndicatorModel.swift | 56 ++++++-------- .../CarouselPagingModelProtocol.swift | 2 +- MVMCoreUI/Organisms/Carousel.swift | 6 +- 4 files changed, 54 insertions(+), 85 deletions(-) diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift index f374fafe..5b1269fd 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift @@ -36,7 +36,7 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { /// The types of indicators that can appear. public enum IndicatorType: String { - case bar + case bars case numeric case hybrid // bar & numeric } @@ -77,29 +77,10 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { } } - /// The maxmum count of pages before the indicatorView forces a Numeric Indicator in place of Bar. - public var hybridThreshold: Int = 5 - /// Set this closure to perform an action when a different indicator was selected. /// Passes through oldInde and newIndex, respectively. public var indicatorTouchAction: ((CarouselPageControlProtocol) -> ())? - - /// Allows sendActions() to trigger even if index is already at min/max index. - public var alwaysSendAction = false - - /// Set true to make the accessibility value as "Slide #currentPage of #totalPage", otherwise will be "Page #currentPage of #totalPage", default is false - public var accessibilityHasSlidesInsteadOfPage = false - - public var isAnimated = true - - /// Will hide this control if page count is 1. - public var hidesForSinglePage = false { - didSet { isHidden = hidesForSinglePage && numberOfPages <= 1 } - } - - /// If true, then index will wraparound, otherwise it will stop paging at min/max index. - public var allowIndexWraparound = false - + public override var isEnabled: Bool { didSet { isUserInteractionEnabled = isEnabled @@ -117,10 +98,7 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { public var currentIndex: Int { get { return _currentIndex } set (newIndex) { - if !allowIndexWraparound { - guard _currentIndex != newIndex else { return } - } - + previousIndex = _currentIndex _currentIndex = newIndex performAction() @@ -138,7 +116,7 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { guard _numberOfPages != newTotal else { return } _numberOfPages = newTotal - isHidden = hidesForSinglePage && newTotal <= 1 + isHidden = carouselIndicatorModel?.hidesForSinglePage ?? false && newTotal <= 1 if isBarIndicator() { (indicatorView as? BarsIndicatorView)?.generateBars() @@ -148,14 +126,14 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { } } - public var disabledIndicatorColor: UIColor = .mvmCoolGray3 - - private var _indicatorTintColor: UIColor = .black + public var disabledIndicatorColor: UIColor { + return carouselIndicatorModel?.disabledIndicatorColor.uiColor ?? .mvmCoolGray3 + } public var indicatorTintColor: UIColor { - get { return _indicatorTintColor } + get { return carouselIndicatorModel?.indicatorColor.uiColor ?? .black } set (newColor) { - _indicatorTintColor = newColor + carouselIndicatorModel?.indicatorColor = Color(uiColor: newColor) if isBarIndicator(), let barIndicator = indicatorView as? BarsIndicatorView { for (i, barTuple) in barIndicator.barReferences.enumerated() where i != currentIndex { @@ -175,7 +153,7 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { carouselIndicatorModel?.currentIndicatorColor = Color(uiColor: newColor) if isBarIndicator() { - if let barIndicator = indicatorView as? BarsIndicatorView { + if let barIndicator = indicatorView as? BarsIndicatorView, !barIndicator.barReferences.isEmpty { barIndicator.barReferences[currentIndex].view.backgroundColor = newColor } } @@ -219,10 +197,6 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { assignIndicatorView() setupGestures() - - if let accessibleValue = MVMCoreUIUtility.hardcodedString(withKey: accessibilityHasSlidesInsteadOfPage ? "MVMCoreUIPageControlslides_currentpage_index" : "MVMCoreUIPageControl_currentpage_index") { - accessibilityValue = String(format: accessibleValue, currentIndex + 1, numberOfPages) - } } //-------------------------------------------------- @@ -293,7 +267,7 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { indicatorView?.updateUI(previousIndex: previousIndex, newIndex: currentIndex, totalCount: numberOfPages, - isAnimated: isAnimated) + isAnimated: carouselIndicatorModel?.isAnimated ?? true) } public func performAction() { @@ -306,20 +280,21 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { func assignIndicatorView() { switch indicatorType { - case .bar: + case .bars: indicatorView = BarsIndicatorView() case .numeric: indicatorView = NumericIndicatorView() case .hybrid: - indicatorView = numberOfPages >= hybridThreshold ? NumericIndicatorView() : BarsIndicatorView() + + indicatorView = numberOfPages >= carouselIndicatorModel?.hybridThreshold ?? 0 ? NumericIndicatorView() : BarsIndicatorView() } } /// Convenience to determine if current view is displaying bars. func isBarIndicator() -> Bool { - return indicatorType == .bar || indicatorType == .hybrid && numberOfPages <= hybridThreshold + return indicatorType == .bars || indicatorType == .hybrid && numberOfPages <= carouselIndicatorModel?.hybridThreshold ?? 5 } public func scrollViewDidScroll(_ collectionView: UICollectionView) { } @@ -328,18 +303,20 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { // MARK: - MoleculeViewProtocol //-------------------------------------------------- - - open override func set(with model: MoleculeModelProtocol?, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { -// super.setWithModel(model, delegateObject, additionalData) + // super.setWithModel(model, delegateObject, additionalData) guard let model = model as? CarouselIndicatorModel else { return } - indicatorType = IndicatorType(rawValue: model.type ?? "") ?? .hybrid + indicatorType = IndicatorType(rawValue: model.type) ?? .hybrid backgroundColor = model.backgroundColor?.uiColor - // barsColor = model.barsColor - // pageIndicatorTintColor - // currentPageIndicatorTintColor + currentIndicatorColor = model.currentIndicatorColor.uiColor + indicatorTintColor = model.indicatorColor.uiColor + isEnabled = model.isEnabled + + if let accessibleValue = MVMCoreUIUtility.hardcodedString(withKey: model.accessibilityHasSlidesInsteadOfPage ? "MVMCoreUIPageControlslides_currentpage_index" : "MVMCoreUIPageControl_currentpage_index") { + accessibilityValue = String(format: accessibleValue, currentIndex + 1, numberOfPages) + } } //-------------------------------------------------- @@ -358,8 +335,8 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { func accessibilityAdjust(toPage index: Int) { - if (index < numberOfPages && index >= 0) || alwaysSendAction { - isAnimated = false + if (index < numberOfPages && index >= 0) || carouselIndicatorModel?.alwaysSendAction ?? false { + carouselIndicatorModel?.isAnimated = false previousIndex = currentIndex currentIndex = index performAction() diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift index 2e9c6c77..051f25ec 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift @@ -21,20 +21,22 @@ public class CarouselIndicatorModel: CarouselPagingModelProtocol { public var backgroundColor: Color? public var moleculeName: String? public var type: String = "hybrid" + + /// The maxmum count of pages before the indicatorView forces a Numeric Indicator in place of Bar. public var hybridThreshold: Int = 5 - public var barsColor: Color? - public var currentBarColor: Color? - public var currentIndex: Int = 0 public var numberOfPages: Int = 0 - public var alwaysSendEvent: Bool = false public var isAnimated: Bool = true public var hidesForSinglePage: Bool = false + /// Set true to make the accessibility value as "Slide #currentPage of #totalPage", otherwise will be "Page #currentPage of #totalPage", default is false public var accessibilityHasSlidesInsteadOfPage: Bool = false - public var isEnabled: Bool = false + public var isEnabled: Bool = true public var disabledIndicatorColor: Color = Color(uiColor: .mvmCoolGray3) - public var indicatorTintColor: Color = Color(uiColor: .mvmBlack) + public var indicatorColor: Color = Color(uiColor: .mvmBlack) public var currentIndicatorColor: Color = Color(uiColor: .mvmBlack) - public var position: Float? + public var padding: Float? + + /// Allows sendActions() to trigger even if index is already at min/max index. + public var alwaysSendAction = false //-------------------------------------------------- // MARK: - Keys @@ -45,18 +47,16 @@ public class CarouselIndicatorModel: CarouselPagingModelProtocol { case backgroundColor case type case hybridThreshold - case barsColor - case currentBarColor - case currentIndex case numberOfPages - case alwaysSendEvent + case alwaysSendAction case isAnimated case hidesForSinglePage case accessibilityHasSlidesInsteadOfPage case isEnabled case disabledIndicatorColor - case indicatorTintColor + case indicatorColor case currentIndicatorColor + case padding } //-------------------------------------------------- @@ -66,12 +66,8 @@ public class CarouselIndicatorModel: CarouselPagingModelProtocol { required public init(from decoder: Decoder) throws { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) moleculeName = try typeContainer.decodeIfPresent(String.self, forKey: .moleculeName) - currentBarColor = try typeContainer.decodeIfPresent(Color.self, forKey: .currentBarColor) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) - barsColor = try typeContainer.decodeIfPresent(Color.self, forKey: .barsColor) - barsColor = try typeContainer.decodeIfPresent(Color.self, forKey: .barsColor) - currentBarColor = try typeContainer.decodeIfPresent(Color.self, forKey: .currentBarColor) - + if let type = try typeContainer.decodeIfPresent(String.self, forKey: .type) { self.type = type } @@ -80,16 +76,16 @@ public class CarouselIndicatorModel: CarouselPagingModelProtocol { self.hybridThreshold = hybridThreshold } - if let currentIndex = try typeContainer.decodeIfPresent(Int.self, forKey: .currentIndex) { - self.currentIndex = currentIndex - } - if let numberOfPages = try typeContainer.decodeIfPresent(Int.self, forKey: .numberOfPages) { self.numberOfPages = numberOfPages } - if let alwaysSendEvent = try typeContainer.decodeIfPresent(Bool.self, forKey: .alwaysSendEvent) { - self.alwaysSendEvent = alwaysSendEvent + if let alwaysSendAction = try typeContainer.decodeIfPresent(Bool.self, forKey: .alwaysSendAction) { + self.alwaysSendAction = alwaysSendAction + } + + if let padding = try typeContainer.decodeIfPresent(Float.self, forKey: .padding) { + self.padding = padding } if let isAnimated = try typeContainer.decodeIfPresent(Bool.self, forKey: .isAnimated) { @@ -112,8 +108,8 @@ public class CarouselIndicatorModel: CarouselPagingModelProtocol { self.disabledIndicatorColor = disabledIndicatorColor } - if let indicatorTintColor = try typeContainer.decodeIfPresent(Color.self, forKey: .indicatorTintColor) { - self.indicatorTintColor = indicatorTintColor + if let indicatorColor = try typeContainer.decodeIfPresent(Color.self, forKey: .indicatorColor) { + self.indicatorColor = indicatorColor } if let currentIndicatorColor = try typeContainer.decodeIfPresent(Color.self, forKey: .currentIndicatorColor) { @@ -125,21 +121,17 @@ public class CarouselIndicatorModel: CarouselPagingModelProtocol { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(moleculeName, forKey: .moleculeName) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) - try container.encodeIfPresent(barsColor, forKey: .barsColor) - try container.encodeIfPresent(currentBarColor, forKey: .currentBarColor) try container.encodeIfPresent(type, forKey: .type) try container.encodeIfPresent(hybridThreshold, forKey: .hybridThreshold) - try container.encodeIfPresent(barsColor, forKey: .barsColor) - try container.encodeIfPresent(currentBarColor, forKey: .currentBarColor) - try container.encodeIfPresent(currentIndex, forKey: .currentIndex) try container.encodeIfPresent(numberOfPages, forKey: .numberOfPages) - try container.encodeIfPresent(alwaysSendEvent, forKey: .alwaysSendEvent) + try container.encodeIfPresent(alwaysSendAction, forKey: .alwaysSendAction) try container.encodeIfPresent(isAnimated, forKey: .isAnimated) try container.encodeIfPresent(hidesForSinglePage, forKey: .hidesForSinglePage) try container.encodeIfPresent(accessibilityHasSlidesInsteadOfPage, forKey: .accessibilityHasSlidesInsteadOfPage) try container.encodeIfPresent(isEnabled, forKey: .isEnabled) try container.encodeIfPresent(disabledIndicatorColor, forKey: .disabledIndicatorColor) - try container.encodeIfPresent(indicatorTintColor, forKey: .indicatorTintColor) + try container.encodeIfPresent(indicatorColor, forKey: .indicatorColor) try container.encodeIfPresent(currentIndicatorColor, forKey: .currentIndicatorColor) + try container.encodeIfPresent(padding, forKey: .padding) } } diff --git a/MVMCoreUI/Models/ModelProtocols/CarouselPagingModelProtocol.swift b/MVMCoreUI/Models/ModelProtocols/CarouselPagingModelProtocol.swift index 94b1277a..27a35f87 100644 --- a/MVMCoreUI/Models/ModelProtocols/CarouselPagingModelProtocol.swift +++ b/MVMCoreUI/Models/ModelProtocols/CarouselPagingModelProtocol.swift @@ -10,5 +10,5 @@ import Foundation public protocol CarouselPagingModelProtocol: MoleculeModelProtocol { - var position: Float? { get } + var padding: Float? { get } } diff --git a/MVMCoreUI/Organisms/Carousel.swift b/MVMCoreUI/Organisms/Carousel.swift index 928ce8da..17abe0e6 100644 --- a/MVMCoreUI/Organisms/Carousel.swift +++ b/MVMCoreUI/Organisms/Carousel.swift @@ -176,7 +176,7 @@ open class Carousel: View { pagingView = MVMCoreUIMoleculeMappingObject.shared()?.createMolecule(molecule, delegateObject, false) as? (UIView & CarouselPageControlProtocol) } - addPaging(view: pagingView, position: (CGFloat(molecule?.position ?? 20))) + addPaging(view: pagingView, padding: (CGFloat(molecule?.padding ?? 20))) } /// Registers the cells with the collection view @@ -221,7 +221,7 @@ open class Carousel: View { } /// Adds a paging view. Centers it horizontally with the collection view. The position is the vertical distance from the center of the page view to the bottom of the collection view. - open func addPaging(view: (UIView & CarouselPageControlProtocol)?, position: CGFloat) { + open func addPaging(view: (UIView & CarouselPageControlProtocol)?, padding: CGFloat) { pagingView?.removeFromSuperview() bottomPin?.isActive = false @@ -234,7 +234,7 @@ open class Carousel: View { addSubview(pagingView) pagingView.centerXAnchor.constraint(equalTo: collectionView.centerXAnchor).isActive = true - collectionView.bottomAnchor.constraint(equalTo: pagingView.bottomAnchor, constant: position).isActive = true + collectionView.bottomAnchor.constraint(equalTo: pagingView.bottomAnchor, constant: padding).isActive = true bottomPin = bottomAnchor.constraint(equalTo: collectionView.bottomAnchor) bottomPin?.priority = .defaultLow bottomPin?.isActive = true From 61bc283770a4ed98bf5db159ce9f1899db29a7ef Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Mon, 2 Mar 2020 16:11:27 -0500 Subject: [PATCH 18/78] aligning with super --- .../Atoms/Views/CarouselIndicator/CarouselIndicator.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift index 5b1269fd..7ce0fa9f 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift @@ -304,12 +304,12 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { //-------------------------------------------------- open override func set(with model: MoleculeModelProtocol?, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { - // super.setWithModel(model, delegateObject, additionalData) - + guard let model = model as? CarouselIndicatorModel else { return } + super.set(with: model, delegateObject, additionalData) + indicatorType = IndicatorType(rawValue: model.type) ?? .hybrid - backgroundColor = model.backgroundColor?.uiColor currentIndicatorColor = model.currentIndicatorColor.uiColor indicatorTintColor = model.indicatorColor.uiColor isEnabled = model.isEnabled From a011eb73a4b0647dcb87e8f8e007c3734075de60 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Mon, 9 Mar 2020 10:35:45 -0400 Subject: [PATCH 19/78] latest --- MVMCoreUI.xcodeproj/project.pbxproj | 19 +- .../BarsCarouselIndicatorModel.swift | 43 +++++ .../BarsIndicatorView.swift | 22 +-- .../CarouselIndicator/CarouselIndicator.swift | 172 +++++++++--------- .../CarouselIndicatorModel.swift | 16 +- .../NumericCarouselIndicatorModel.swift | 42 +++++ .../NumericIndicatorView.swift | 20 +- 7 files changed, 209 insertions(+), 125 deletions(-) create mode 100644 MVMCoreUI/Atoms/Views/CarouselIndicator/BarsCarouselIndicatorModel.swift rename MVMCoreUI/Atoms/Views/CarouselIndicator/{IndicatorViews => }/BarsIndicatorView.swift (88%) create mode 100644 MVMCoreUI/Atoms/Views/CarouselIndicator/NumericCarouselIndicatorModel.swift rename MVMCoreUI/Atoms/Views/CarouselIndicator/{IndicatorViews => }/NumericIndicatorView.swift (85%) diff --git a/MVMCoreUI.xcodeproj/project.pbxproj b/MVMCoreUI.xcodeproj/project.pbxproj index f55d04b2..a0884e30 100644 --- a/MVMCoreUI.xcodeproj/project.pbxproj +++ b/MVMCoreUI.xcodeproj/project.pbxproj @@ -98,6 +98,8 @@ 0A7EF86523D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF86423D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift */; }; 0A7EF86723D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF86623D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift */; }; 0AA33B3A2398524F0067DD0F /* Toggle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AA33B392398524F0067DD0F /* Toggle.swift */; }; + 0AAF8E2A240EA57D008DD263 /* BarsCarouselIndicatorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AAF8E29240EA57D008DD263 /* BarsCarouselIndicatorModel.swift */; }; + 0AAF8E2C240EA594008DD263 /* NumericCarouselIndicatorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AAF8E2B240EA594008DD263 /* NumericCarouselIndicatorModel.swift */; }; 0ABD136D237CAD1E0081388D /* DateDropdownEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ABD136C237CAD1E0081388D /* DateDropdownEntryField.swift */; }; 0ABD1371237DB0450081388D /* ItemDropdownEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ABD1370237DB0450081388D /* ItemDropdownEntryField.swift */; }; 0AE14F64238315D2005417F8 /* TextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AE14F63238315D2005417F8 /* TextField.swift */; }; @@ -450,6 +452,8 @@ 0A8321AE2355FE9500CB7F00 /* DigitBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DigitBox.swift; sourceTree = ""; }; 0AA33B33239813C50067DD0F /* UIColor+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+Extension.swift"; sourceTree = ""; }; 0AA33B392398524F0067DD0F /* Toggle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Toggle.swift; sourceTree = ""; }; + 0AAF8E29240EA57D008DD263 /* BarsCarouselIndicatorModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BarsCarouselIndicatorModel.swift; sourceTree = ""; }; + 0AAF8E2B240EA594008DD263 /* NumericCarouselIndicatorModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NumericCarouselIndicatorModel.swift; sourceTree = ""; }; 0ABD136C237CAD1E0081388D /* DateDropdownEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateDropdownEntryField.swift; sourceTree = ""; }; 0ABD1370237DB0450081388D /* ItemDropdownEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemDropdownEntryField.swift; sourceTree = ""; }; 0AE14F63238315D2005417F8 /* TextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextField.swift; sourceTree = ""; }; @@ -791,20 +795,14 @@ 0A14F6B023E8C27A00EDF7F7 /* CarouselIndicator */ = { isa = PBXGroup; children = ( - 0A14F6B723ECA7F900EDF7F7 /* IndicatorViews */, 0A14F69223E349EF00EDF7F7 /* CarouselIndicator.swift */, 0A14F6A823E8750300EDF7F7 /* CarouselIndicatorModel.swift */, - ); - path = CarouselIndicator; - sourceTree = ""; - }; - 0A14F6B723ECA7F900EDF7F7 /* IndicatorViews */ = { - isa = PBXGroup; - children = ( + 0AAF8E29240EA57D008DD263 /* BarsCarouselIndicatorModel.swift */, 0A4253AE23F5C2C000554656 /* BarsIndicatorView.swift */, + 0AAF8E2B240EA594008DD263 /* NumericCarouselIndicatorModel.swift */, 0A14F6B323E8C29700EDF7F7 /* NumericIndicatorView.swift */, ); - path = IndicatorViews; + path = CarouselIndicator; sourceTree = ""; }; 0A5D59C323AD488600EFD9E9 /* Protocols */ = { @@ -1096,7 +1094,6 @@ isa = PBXGroup; children = ( 525019E3240684E500EED91C /* FourColumn */, - 52267A0523FFE0A900906CBA /* OneColumn */, D22B38ED23F4E11100490EF6 /* ThreeColumn */, ); path = SectionDividers; @@ -1810,6 +1807,7 @@ 0103B84E23D7E33A009C315C /* HeadlineBodyToggleModel.swift in Sources */, D2755D7B23689C7500485468 /* TableViewCell.swift in Sources */, 0A21DB85235E06EF00C160A2 /* MFTextField.m in Sources */, + 0AAF8E2C240EA594008DD263 /* NumericCarouselIndicatorModel.swift in Sources */, 014AA72623C501E2006F3E93 /* ContainerModelProtocol.swift in Sources */, AA11A42123F15D7000D7962F /* ListRightVariablePaymentsModel.swift in Sources */, 01EB369223609801006832FA /* MoleculeStackModel.swift in Sources */, @@ -1995,6 +1993,7 @@ C6FA7D5223C77A4A00A3614A /* UnOrderedList.swift in Sources */, 01509D8F2327EC6F00EF99AA /* MoleculeTableViewCell.swift in Sources */, 0105618D224BBE7700E1557D /* FormValidator.swift in Sources */, + 0AAF8E2A240EA57D008DD263 /* BarsCarouselIndicatorModel.swift in Sources */, 01509D912327ECE600EF99AA /* CornerLabels.swift in Sources */, D22D1F1B220341F60077CEC0 /* MVMCoreUICheckBox.m in Sources */, C695A69823C990C200BFB94E /* DoughnutChartView.swift in Sources */, diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/BarsCarouselIndicatorModel.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/BarsCarouselIndicatorModel.swift new file mode 100644 index 00000000..70ddac66 --- /dev/null +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/BarsCarouselIndicatorModel.swift @@ -0,0 +1,43 @@ +// +// BarsCarouselIndicatorModel.swift +// MVMCoreUI +// +// Created by Kevin Christiano on 3/3/20. +// Copyright © 2020 Verizon Wireless. All rights reserved. +// + +import UIKit +/* +open class BarsCarouselIndicatorModel: CarouselIndicatorModel { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + + public class var identifier: String { + return "barsCarouselIndicator" + } + + //-------------------------------------------------- + // MARK: - Keys + //-------------------------------------------------- + + private enum CodingKeys: String, CodingKey { + case moleculeName + case backgroundColor + + } + + //-------------------------------------------------- + // MARK: - Codec + //-------------------------------------------------- + + required public init(from decoder: Decoder) throws { + let typeContainer = try decoder.container(keyedBy: CodingKeys.self) + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + + } +} +*/ diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift similarity index 88% rename from MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift rename to MVMCoreUI/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift index 69c34895..936a971a 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/BarsIndicatorView.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift @@ -9,7 +9,7 @@ import UIKit -open class BarsIndicatorView: View, IndicatorViewProtocol { +open class BarsIndicatorView: CarouselIndicator { //-------------------------------------------------- // MARK: - Stored Properties //-------------------------------------------------- @@ -37,15 +37,15 @@ open class BarsIndicatorView: View, IndicatorViewProtocol { public var parentCarouselIndicator: CarouselIndicator? { return superview as? CarouselIndicator } - - open var isEnabled: Bool = true { - didSet { - barReferences.forEach { view, heightConstraint in - view.backgroundColor = isEnabled ? parentCarouselIndicator?.indicatorTintColor ?? .mvmBlack : parentCarouselIndicator?.disabledIndicatorColor ?? .mvmCoolGray3 - } - } - } - +// +// open override var isEnabled: Bool = true { +// didSet { +// barReferences.forEach { view, heightConstraint in +// view.backgroundColor = isEnabled ? parentCarouselIndicator?.indicatorTintColor ?? .mvmBlack : parentCarouselIndicator?.disabledIndicatorColor ?? .mvmCoolGray3 +// } +// } +// } +// //-------------------------------------------------- // MARK: - Initializers //-------------------------------------------------- @@ -89,7 +89,7 @@ open class BarsIndicatorView: View, IndicatorViewProtocol { for i in 0.. = [] /// The currently active indicator view. - public var currentIndicator: IndicatorView? +// public var currentIndicator: IndicatorView? /// Convenience to access the model. public var carouselIndicatorModel: CarouselIndicatorModel? { @@ -57,25 +57,25 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { } /// The view control relative to the state of the indicator type. - private(set) var indicatorView: IndicatorView? { - willSet { indicatorView?.removeFromSuperview() } - didSet { - indicatorView?.removeFromSuperview() - - guard let indicatorView = indicatorView else { return } - addSubview(indicatorView) - - topConstraint = indicatorView.topAnchor.constraint(equalTo: topAnchor, constant: PaddingTwo) - topConstraint?.isActive = true - - bottomConstraint = bottomAnchor.constraint(equalTo: indicatorView.bottomAnchor, constant: PaddingTwo) - bottomConstraint?.isActive = true - - indicatorView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true - trailingAnchor.constraint(equalTo: indicatorView.trailingAnchor).isActive = true - updateUI() - } - } +// private(set) var indicatorView: IndicatorView? { +// willSet { indicatorView?.removeFromSuperview() } +// didSet { +// indicatorView?.removeFromSuperview() +// +// guard let indicatorView = indicatorView else { return } +// addSubview(indicatorView) +// +// topConstraint = indicatorView.topAnchor.constraint(equalTo: topAnchor, constant: PaddingTwo) +// topConstraint?.isActive = true +// +// bottomConstraint = bottomAnchor.constraint(equalTo: indicatorView.bottomAnchor, constant: PaddingTwo) +// bottomConstraint?.isActive = true +// +// indicatorView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true +// trailingAnchor.constraint(equalTo: indicatorView.trailingAnchor).isActive = true +// updateUI() +// } +// } /// Set this closure to perform an action when a different indicator was selected. /// Passes through oldInde and newIndex, respectively. @@ -84,7 +84,7 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { public override var isEnabled: Bool { didSet { isUserInteractionEnabled = isEnabled - indicatorView?.isEnabled = isEnabled +// indicatorView?.isEnabled = isEnabled } } @@ -118,9 +118,9 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { isHidden = carouselIndicatorModel?.hidesForSinglePage ?? false && newTotal <= 1 - if isBarIndicator() { - (indicatorView as? BarsIndicatorView)?.generateBars() - } +// if isBarIndicator() { +// (indicatorView as? BarsIndicatorView)?.generateBars() +// } updateUI() } @@ -135,11 +135,11 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { set (newColor) { carouselIndicatorModel?.indicatorColor = Color(uiColor: newColor) - if isBarIndicator(), let barIndicator = indicatorView as? BarsIndicatorView { - for (i, barTuple) in barIndicator.barReferences.enumerated() where i != currentIndex { - barTuple.view.backgroundColor = newColor - } - } +// if isBarIndicator(), let barIndicator = indicatorView as? BarsIndicatorView { +// for (i, barTuple) in barIndicator.barReferences.enumerated() where i != currentIndex { +// barTuple.view.backgroundColor = newColor +// } +// } } } @@ -152,11 +152,11 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { _currentIndicatorColor = newColor carouselIndicatorModel?.currentIndicatorColor = Color(uiColor: newColor) - if isBarIndicator() { - if let barIndicator = indicatorView as? BarsIndicatorView, !barIndicator.barReferences.isEmpty { - barIndicator.barReferences[currentIndex].view.backgroundColor = newColor - } - } +// if isBarIndicator() { +// if let barIndicator = indicatorView as? BarsIndicatorView, !barIndicator.barReferences.isEmpty { +// barIndicator.barReferences[currentIndex].view.backgroundColor = newColor +// } +// } } } @@ -172,10 +172,10 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { self.init(frame: .zero) } - public init(indicatorType: IndicatorType) { - self.indicatorType = indicatorType - super.init(frame: .zero) - } +// public init(indicatorType: IndicatorType) { +// self.indicatorType = indicatorType +// super.init(frame: .zero) +// } required public init?(coder: NSCoder) { super.init(coder: coder) @@ -195,7 +195,7 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { open override func setupView() { super.setupView() - assignIndicatorView() +// assignIndicatorView() setupGestures() } @@ -245,17 +245,17 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { let touchPoint = tapGesture?.location(in: self) let touchPoint_X = touchPoint?.x ?? 0.0 - if isBarIndicator(), let bars = (indicatorView as? BarsIndicatorView)?.barReferences { - currentIndex = bars.firstIndex { $0.0.frame.maxX >= touchPoint_X && $0.0.frame.minX <= touchPoint_X } ?? 0 - - } else { - // Determine which half of the view was touched. - if touchPoint_X > bounds.width / 2 { - incrementCurrentIndex() - } else { - decrementCurrentIndex() - } - } +// if isBarIndicator(), let bars = (indicatorView as? BarsIndicatorView)?.barReferences { +// currentIndex = bars.firstIndex { $0.0.frame.maxX >= touchPoint_X && $0.0.frame.minX <= touchPoint_X } ?? 0 +// +// } else { +// // Determine which half of the view was touched. +// if touchPoint_X > bounds.width / 2 { +// incrementCurrentIndex() +// } else { +// decrementCurrentIndex() +// } +// } } //-------------------------------------------------- @@ -264,10 +264,10 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { public func updateUI() { - indicatorView?.updateUI(previousIndex: previousIndex, - newIndex: currentIndex, - totalCount: numberOfPages, - isAnimated: carouselIndicatorModel?.isAnimated ?? true) +// indicatorView?.updateUI(previousIndex: previousIndex, +// newIndex: currentIndex, +// totalCount: numberOfPages, +// isAnimated: carouselIndicatorModel?.isAnimated ?? true) } public func performAction() { @@ -277,25 +277,25 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { } /// Sets the indicatorView based on the current indicatorType. - func assignIndicatorView() { - - switch indicatorType { - case .bars: - indicatorView = BarsIndicatorView() - - case .numeric: - indicatorView = NumericIndicatorView() - - case .hybrid: - - indicatorView = numberOfPages >= carouselIndicatorModel?.hybridThreshold ?? 0 ? NumericIndicatorView() : BarsIndicatorView() - } - } +// func assignIndicatorView() { +// +// switch indicatorType { +// case .bars: +// indicatorView = BarsIndicatorView() +// +// case .numeric: +// indicatorView = NumericIndicatorView() +// +// case .hybrid: +// +// indicatorView = numberOfPages >= carouselIndicatorModel?.hybridThreshold ?? 0 ? NumericIndicatorView() : BarsIndicatorView() +// } +// } /// Convenience to determine if current view is displaying bars. - func isBarIndicator() -> Bool { - return indicatorType == .bars || indicatorType == .hybrid && numberOfPages <= carouselIndicatorModel?.hybridThreshold ?? 5 - } +// func isBarIndicator() -> Bool { +// return indicatorType == .bars || indicatorType == .hybrid && numberOfPages <= carouselIndicatorModel?.hybridThreshold ?? 5 +// } public func scrollViewDidScroll(_ collectionView: UICollectionView) { } @@ -309,7 +309,7 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { super.set(with: model, delegateObject, additionalData) - indicatorType = IndicatorType(rawValue: model.type) ?? .hybrid +// indicatorType = IndicatorType(rawValue: model.type) ?? .hybrid currentIndicatorColor = model.currentIndicatorColor.uiColor indicatorTintColor = model.indicatorColor.uiColor isEnabled = model.isEnabled diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift index 051f25ec..b395b1b5 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift @@ -14,8 +14,8 @@ public class CarouselIndicatorModel: CarouselPagingModelProtocol { // MARK: - Properties //-------------------------------------------------- - public static var identifier: String { - return "carouselIndicator" + public class var identifier: String { + return "" } public var backgroundColor: Color? @@ -23,7 +23,7 @@ public class CarouselIndicatorModel: CarouselPagingModelProtocol { public var type: String = "hybrid" /// The maxmum count of pages before the indicatorView forces a Numeric Indicator in place of Bar. - public var hybridThreshold: Int = 5 +// public var hybridThreshold: Int = 5 public var numberOfPages: Int = 0 public var isAnimated: Bool = true public var hidesForSinglePage: Bool = false @@ -46,7 +46,7 @@ public class CarouselIndicatorModel: CarouselPagingModelProtocol { case moleculeName case backgroundColor case type - case hybridThreshold +// case hybridThreshold case numberOfPages case alwaysSendAction case isAnimated @@ -72,9 +72,9 @@ public class CarouselIndicatorModel: CarouselPagingModelProtocol { self.type = type } - if let hybridThreshold = try typeContainer.decodeIfPresent(Int.self, forKey: .hybridThreshold) { - self.hybridThreshold = hybridThreshold - } +// if let hybridThreshold = try typeContainer.decodeIfPresent(Int.self, forKey: .hybridThreshold) { +// self.hybridThreshold = hybridThreshold +// } if let numberOfPages = try typeContainer.decodeIfPresent(Int.self, forKey: .numberOfPages) { self.numberOfPages = numberOfPages @@ -122,7 +122,7 @@ public class CarouselIndicatorModel: CarouselPagingModelProtocol { try container.encode(moleculeName, forKey: .moleculeName) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) try container.encodeIfPresent(type, forKey: .type) - try container.encodeIfPresent(hybridThreshold, forKey: .hybridThreshold) +// try container.encodeIfPresent(hybridThreshold, forKey: .hybridThreshold) try container.encodeIfPresent(numberOfPages, forKey: .numberOfPages) try container.encodeIfPresent(alwaysSendAction, forKey: .alwaysSendAction) try container.encodeIfPresent(isAnimated, forKey: .isAnimated) diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/NumericCarouselIndicatorModel.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/NumericCarouselIndicatorModel.swift new file mode 100644 index 00000000..1898c05c --- /dev/null +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/NumericCarouselIndicatorModel.swift @@ -0,0 +1,42 @@ +// +// NumericCarouselIndicatorModel.swift +// MVMCoreUI +// +// Created by Kevin Christiano on 3/3/20. +// Copyright © 2020 Verizon Wireless. All rights reserved. +// + +import UIKit +/* +class NumericCarouselIndicatorModel: CarouselIndicatorModel { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + + public class var identifier: String { + return "numericCarouselIndicator" + } + + //-------------------------------------------------- + // MARK: - Keys + //-------------------------------------------------- + + private enum CodingKeys: String, CodingKey { + + } + + //-------------------------------------------------- + // MARK: - Codec + //-------------------------------------------------- + + required public init(from decoder: Decoder) throws { + let typeContainer = try decoder.container(keyedBy: CodingKeys.self) + + } + + public override func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + + } +} +*/ diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/NumericIndicatorView.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift similarity index 85% rename from MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/NumericIndicatorView.swift rename to MVMCoreUI/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift index 41be20cd..9bd31aa7 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/IndicatorViews/NumericIndicatorView.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift @@ -9,7 +9,7 @@ import UIKit -open class NumericIndicatorView: View, IndicatorViewProtocol { +open class NumericIndicatorView: CarouselIndicator { //-------------------------------------------------- // MARK: - Outlets //-------------------------------------------------- @@ -42,15 +42,15 @@ open class NumericIndicatorView: View, IndicatorViewProtocol { return superview as? CarouselIndicator } - open var isEnabled: Bool = true { - didSet { - let enabledColor = parentCarouselIndicator?.indicatorTintColor ?? .mvmBlack - let disabledColor = parentCarouselIndicator?.disabledIndicatorColor ?? .mvmCoolGray3 - pageCount.textColor = isEnabled ? enabledColor : disabledColor - leftArrow.tintColor = isEnabled ? enabledColor : disabledColor - rightArrow.tintColor = isEnabled ? enabledColor : disabledColor - } - } +// open var isEnabled: Bool = true { +// didSet { +// let enabledColor = parentCarouselIndicator?.indicatorTintColor ?? .mvmBlack +// let disabledColor = parentCarouselIndicator?.disabledIndicatorColor ?? .mvmCoolGray3 +// pageCount.textColor = isEnabled ? enabledColor : disabledColor +// leftArrow.tintColor = isEnabled ? enabledColor : disabledColor +// rightArrow.tintColor = isEnabled ? enabledColor : disabledColor +// } +// } //-------------------------------------------------- // MARK: - Initializers From 5deb690b338b5b4f7cedc7d9b0a491121f32f62f Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Wed, 11 Mar 2020 13:30:20 -0400 Subject: [PATCH 20/78] no --- MVMCoreUI/Atoms/Views/Arrow.swift | 1 + .../BarsCarouselIndicatorModel.swift | 29 +----- .../CarouselIndicator/BarsIndicatorView.swift | 20 ++-- .../CarouselIndicator/CarouselIndicator.swift | 92 +------------------ .../CarouselIndicatorModel.swift | 16 +--- .../NumericCarouselIndicatorModel.swift | 29 +----- .../NumericIndicatorView.swift | 20 ++-- 7 files changed, 31 insertions(+), 176 deletions(-) diff --git a/MVMCoreUI/Atoms/Views/Arrow.swift b/MVMCoreUI/Atoms/Views/Arrow.swift index 2ed4a70d..eea6071d 100644 --- a/MVMCoreUI/Atoms/Views/Arrow.swift +++ b/MVMCoreUI/Atoms/Views/Arrow.swift @@ -8,6 +8,7 @@ import UIKit + open class Arrow: View { //-------------------------------------------------- // MARK: - Properties diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/BarsCarouselIndicatorModel.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/BarsCarouselIndicatorModel.swift index 70ddac66..16adfe46 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/BarsCarouselIndicatorModel.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/BarsCarouselIndicatorModel.swift @@ -7,37 +7,14 @@ // import UIKit -/* + + open class BarsCarouselIndicatorModel: CarouselIndicatorModel { //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- - public class var identifier: String { + public class override var identifier: String { return "barsCarouselIndicator" } - - //-------------------------------------------------- - // MARK: - Keys - //-------------------------------------------------- - - private enum CodingKeys: String, CodingKey { - case moleculeName - case backgroundColor - - } - - //-------------------------------------------------- - // MARK: - Codec - //-------------------------------------------------- - - required public init(from decoder: Decoder) throws { - let typeContainer = try decoder.container(keyedBy: CodingKeys.self) - } - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - - } } -*/ diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift index 936a971a..1004ed25 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift @@ -37,15 +37,15 @@ open class BarsIndicatorView: CarouselIndicator { public var parentCarouselIndicator: CarouselIndicator? { return superview as? CarouselIndicator } -// -// open override var isEnabled: Bool = true { -// didSet { -// barReferences.forEach { view, heightConstraint in -// view.backgroundColor = isEnabled ? parentCarouselIndicator?.indicatorTintColor ?? .mvmBlack : parentCarouselIndicator?.disabledIndicatorColor ?? .mvmCoolGray3 -// } -// } -// } -// + + open override var isEnabled: Bool { + didSet { + barReferences.forEach { view, heightConstraint in + view.backgroundColor = isEnabled ? parentCarouselIndicator?.indicatorTintColor ?? .mvmBlack : parentCarouselIndicator?.disabledIndicatorColor ?? .mvmCoolGray3 + } + } + } + //-------------------------------------------------- // MARK: - Initializers //-------------------------------------------------- @@ -111,7 +111,7 @@ open class BarsIndicatorView: CarouselIndicator { barReferences = [] } - public func updateUI(previousIndex: Int, newIndex: Int, totalCount: Int, isAnimated: Bool) { + public override func updateUI(previousIndex: Int, newIndex: Int, totalCount: Int, isAnimated: Bool) { guard !barReferences.isEmpty else { return } diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift index 2d9fb117..805edffa 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift @@ -8,21 +8,8 @@ import Foundation -/// Set protocols for all indicator faces of the Carousel Indicator. -//public protocol IndicatorViewProtocol { -// func updateUI(previousIndex: Int, newIndex: Int, totalCount: Int, isAnimated: Bool) -// func reset() -// var isEnabled: Bool { get set } -//} - open class CarouselIndicator: Control, CarouselPageControlProtocol { - //-------------------------------------------------- - // MARK: - Outlets - //-------------------------------------------------- - -// public typealias IndicatorView = UIView & IndicatorViewProtocol - //-------------------------------------------------- // MARK: - Constraints //-------------------------------------------------- @@ -34,57 +21,20 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { // MARK: - Properties //-------------------------------------------------- - /// The types of indicators that can appear. -// public enum IndicatorType: String { -// case bars -// case numeric -// case hybrid // bar & numeric -// } - - /// Determines interactivity and appearance of the indicator. -// public var indicatorType: IndicatorType = .hybrid { -// didSet { assignIndicatorView() } -// } - public var uiGestures: Set = [] - /// The currently active indicator view. -// public var currentIndicator: IndicatorView? - /// Convenience to access the model. public var carouselIndicatorModel: CarouselIndicatorModel? { return model as? CarouselIndicatorModel } - /// The view control relative to the state of the indicator type. -// private(set) var indicatorView: IndicatorView? { -// willSet { indicatorView?.removeFromSuperview() } -// didSet { -// indicatorView?.removeFromSuperview() -// -// guard let indicatorView = indicatorView else { return } -// addSubview(indicatorView) -// -// topConstraint = indicatorView.topAnchor.constraint(equalTo: topAnchor, constant: PaddingTwo) -// topConstraint?.isActive = true -// -// bottomConstraint = bottomAnchor.constraint(equalTo: indicatorView.bottomAnchor, constant: PaddingTwo) -// bottomConstraint?.isActive = true -// -// indicatorView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true -// trailingAnchor.constraint(equalTo: indicatorView.trailingAnchor).isActive = true -// updateUI() -// } -// } - /// Set this closure to perform an action when a different indicator was selected. /// Passes through oldInde and newIndex, respectively. public var indicatorTouchAction: ((CarouselPageControlProtocol) -> ())? - public override var isEnabled: Bool { + open override var isEnabled: Bool { didSet { isUserInteractionEnabled = isEnabled -// indicatorView?.isEnabled = isEnabled } } @@ -102,7 +52,7 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { previousIndex = _currentIndex _currentIndex = newIndex performAction() - updateUI() + updateUI(previousIndex: previousIndex, newIndex: newIndex, totalCount: numberOfPages, isAnimated: carouselIndicatorModel?.isAnimated ?? true) } } @@ -117,12 +67,7 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { _numberOfPages = newTotal isHidden = carouselIndicatorModel?.hidesForSinglePage ?? false && newTotal <= 1 - -// if isBarIndicator() { -// (indicatorView as? BarsIndicatorView)?.generateBars() -// } - - updateUI() + updateUI(previousIndex: previousIndex, newIndex: currentIndex, totalCount: newTotal, isAnimated: carouselIndicatorModel?.isAnimated ?? true) } } @@ -172,11 +117,6 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { self.init(frame: .zero) } -// public init(indicatorType: IndicatorType) { -// self.indicatorType = indicatorType -// super.init(frame: .zero) -// } - required public init?(coder: NSCoder) { super.init(coder: coder) } @@ -195,7 +135,6 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { open override func setupView() { super.setupView() -// assignIndicatorView() setupGestures() } @@ -205,7 +144,7 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { private func setupGestures() { - let tap = UITapGestureRecognizer(target: self, action: #selector(indicatorTapped(_:))) + let tap = UITapGestureRecognizer(target: self, action: #selector(indicatorTapped)) let leftSwipe = UISwipeGestureRecognizer(target: self, action: #selector(swipeLeft)) let rightSwipe = UISwipeGestureRecognizer(target: self, action: #selector(swipeRight)) @@ -262,7 +201,7 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { // MARK: - Methods //-------------------------------------------------- - public func updateUI() { + open func updateUI(previousIndex: Int, newIndex: Int, totalCount: Int, isAnimated: Bool) { // indicatorView?.updateUI(previousIndex: previousIndex, // newIndex: currentIndex, @@ -276,27 +215,6 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { indicatorTouchAction?(self) } - /// Sets the indicatorView based on the current indicatorType. -// func assignIndicatorView() { -// -// switch indicatorType { -// case .bars: -// indicatorView = BarsIndicatorView() -// -// case .numeric: -// indicatorView = NumericIndicatorView() -// -// case .hybrid: -// -// indicatorView = numberOfPages >= carouselIndicatorModel?.hybridThreshold ?? 0 ? NumericIndicatorView() : BarsIndicatorView() -// } -// } - - /// Convenience to determine if current view is displaying bars. -// func isBarIndicator() -> Bool { -// return indicatorType == .bars || indicatorType == .hybrid && numberOfPages <= carouselIndicatorModel?.hybridThreshold ?? 5 -// } - public func scrollViewDidScroll(_ collectionView: UICollectionView) { } //-------------------------------------------------- diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift index b395b1b5..aa333f2a 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift @@ -9,7 +9,7 @@ import Foundation -public class CarouselIndicatorModel: CarouselPagingModelProtocol { +open class CarouselIndicatorModel: CarouselPagingModelProtocol { //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- @@ -20,10 +20,9 @@ public class CarouselIndicatorModel: CarouselPagingModelProtocol { public var backgroundColor: Color? public var moleculeName: String? - public var type: String = "hybrid" /// The maxmum count of pages before the indicatorView forces a Numeric Indicator in place of Bar. -// public var hybridThreshold: Int = 5 + public var numberOfPages: Int = 0 public var isAnimated: Bool = true public var hidesForSinglePage: Bool = false @@ -46,7 +45,6 @@ public class CarouselIndicatorModel: CarouselPagingModelProtocol { case moleculeName case backgroundColor case type -// case hybridThreshold case numberOfPages case alwaysSendAction case isAnimated @@ -67,14 +65,6 @@ public class CarouselIndicatorModel: CarouselPagingModelProtocol { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) moleculeName = try typeContainer.decodeIfPresent(String.self, forKey: .moleculeName) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) - - if let type = try typeContainer.decodeIfPresent(String.self, forKey: .type) { - self.type = type - } - -// if let hybridThreshold = try typeContainer.decodeIfPresent(Int.self, forKey: .hybridThreshold) { -// self.hybridThreshold = hybridThreshold -// } if let numberOfPages = try typeContainer.decodeIfPresent(Int.self, forKey: .numberOfPages) { self.numberOfPages = numberOfPages @@ -121,8 +111,6 @@ public class CarouselIndicatorModel: CarouselPagingModelProtocol { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(moleculeName, forKey: .moleculeName) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) - try container.encodeIfPresent(type, forKey: .type) -// try container.encodeIfPresent(hybridThreshold, forKey: .hybridThreshold) try container.encodeIfPresent(numberOfPages, forKey: .numberOfPages) try container.encodeIfPresent(alwaysSendAction, forKey: .alwaysSendAction) try container.encodeIfPresent(isAnimated, forKey: .isAnimated) diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/NumericCarouselIndicatorModel.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/NumericCarouselIndicatorModel.swift index 1898c05c..2b454fc8 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/NumericCarouselIndicatorModel.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/NumericCarouselIndicatorModel.swift @@ -7,36 +7,13 @@ // import UIKit -/* -class NumericCarouselIndicatorModel: CarouselIndicatorModel { + +open class NumericCarouselIndicatorModel: CarouselIndicatorModel { //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- - public class var identifier: String { + public class override var identifier: String { return "numericCarouselIndicator" } - - //-------------------------------------------------- - // MARK: - Keys - //-------------------------------------------------- - - private enum CodingKeys: String, CodingKey { - - } - - //-------------------------------------------------- - // MARK: - Codec - //-------------------------------------------------- - - required public init(from decoder: Decoder) throws { - let typeContainer = try decoder.container(keyedBy: CodingKeys.self) - - } - - public override func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - - } } -*/ diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift index 9bd31aa7..28e6b0e0 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift @@ -38,20 +38,14 @@ open class NumericIndicatorView: CarouselIndicator { // MARK: - Computed Properties //-------------------------------------------------- - public var parentCarouselIndicator: CarouselIndicator? { - return superview as? CarouselIndicator + open override var isEnabled: Bool = true { + didSet { + pageCount.textColor = isEnabled ? indicatorTintColor : disabledIndicatorColor + leftArrow.tintColor = isEnabled ? indicatorTintColor : disabledIndicatorColor + rightArrow.tintColor = isEnabled ? indicatorTintColor : disabledIndicatorColor + } } -// open var isEnabled: Bool = true { -// didSet { -// let enabledColor = parentCarouselIndicator?.indicatorTintColor ?? .mvmBlack -// let disabledColor = parentCarouselIndicator?.disabledIndicatorColor ?? .mvmCoolGray3 -// pageCount.textColor = isEnabled ? enabledColor : disabledColor -// leftArrow.tintColor = isEnabled ? enabledColor : disabledColor -// rightArrow.tintColor = isEnabled ? enabledColor : disabledColor -// } -// } - //-------------------------------------------------- // MARK: - Initializers //-------------------------------------------------- @@ -106,7 +100,7 @@ open class NumericIndicatorView: CarouselIndicator { // MARK: - IndicatorViewProtocol //-------------------------------------------------- - open func updateUI(previousIndex oldIndex: Int, newIndex: Int, totalCount: Int, isAnimated: Bool) { + open override func updateUI(previousIndex oldIndex: Int, newIndex: Int, totalCount: Int, isAnimated: Bool) { pageCount.text = "\(newIndex + 1)/\(totalCount)" layoutIfNeeded() From f7f15c906f23f87939a547e88a302ca64d460ab2 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Wed, 11 Mar 2020 15:22:20 -0400 Subject: [PATCH 21/78] latest --- .../CarouselIndicator/BarsIndicatorView.swift | 16 ++++------------ .../CarouselIndicator/CarouselIndicator.swift | 8 +------- .../CarouselIndicator/NumericIndicatorView.swift | 2 +- MVMCoreUI/Organisms/CarouselModel.swift | 3 ++- .../OtherHandlers/MoleculeObjectMapping.swift | 5 +++-- 5 files changed, 11 insertions(+), 23 deletions(-) diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift index 1004ed25..0d80db57 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift @@ -33,15 +33,11 @@ open class BarsIndicatorView: CarouselIndicator { //-------------------------------------------------- // MARK: - Computed Properties //-------------------------------------------------- - - public var parentCarouselIndicator: CarouselIndicator? { - return superview as? CarouselIndicator - } open override var isEnabled: Bool { didSet { barReferences.forEach { view, heightConstraint in - view.backgroundColor = isEnabled ? parentCarouselIndicator?.indicatorTintColor ?? .mvmBlack : parentCarouselIndicator?.disabledIndicatorColor ?? .mvmCoolGray3 + view.backgroundColor = isEnabled ? indicatorTintColor : disabledIndicatorColor } } } @@ -80,16 +76,12 @@ open class BarsIndicatorView: CarouselIndicator { func generateBars() { - guard let numberOfPages = parentCarouselIndicator?.numberOfPages, - let currentIndex = parentCarouselIndicator?.currentIndex - else { return } - var bars = [(View, NSLayoutConstraint)]() for i in 0.. Date: Wed, 11 Mar 2020 15:42:27 -0400 Subject: [PATCH 22/78] stable --- .../Atoms/Views/CarouselIndicator/BarsIndicatorView.swift | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift index 0d80db57..f9d7ebc9 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift @@ -105,7 +105,10 @@ open class BarsIndicatorView: CarouselIndicator { public override func updateUI(previousIndex: Int, newIndex: Int, totalCount: Int, isAnimated: Bool) { - guard !barReferences.isEmpty else { return } + guard !barReferences.isEmpty else { + generateBars() + return + } let expression = { self.barReferences[previousIndex].view.backgroundColor = self.indicatorTintColor From 50920c83e0838ac7d33124e42b83f6607bd245b3 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Mon, 16 Mar 2020 09:50:54 -0400 Subject: [PATCH 23/78] latest state --- MVMCoreUI.xcodeproj/project.pbxproj | 2 +- MVMCoreUI/Atoms/Views/Arrow.swift | 3 + .../BarsCarouselIndicatorModel.swift | 29 ++++++++ .../CarouselIndicator/BarsIndicatorView.swift | 71 ++++++++++++++++--- .../CarouselIndicator/CarouselIndicator.swift | 62 +++++----------- .../CarouselIndicatorModel.swift | 41 +++++------ .../NumericIndicatorView.swift | 29 +++++++- .../CarouselPagingModelProtocol.swift | 2 +- MVMCoreUI/Organisms/Carousel.swift | 8 ++- 9 files changed, 163 insertions(+), 84 deletions(-) diff --git a/MVMCoreUI.xcodeproj/project.pbxproj b/MVMCoreUI.xcodeproj/project.pbxproj index c42f1200..f3d4ca1b 100644 --- a/MVMCoreUI.xcodeproj/project.pbxproj +++ b/MVMCoreUI.xcodeproj/project.pbxproj @@ -810,8 +810,8 @@ 0A14F6B023E8C27A00EDF7F7 /* CarouselIndicator */ = { isa = PBXGroup; children = ( - 0A14F69223E349EF00EDF7F7 /* CarouselIndicator.swift */, 0A14F6A823E8750300EDF7F7 /* CarouselIndicatorModel.swift */, + 0A14F69223E349EF00EDF7F7 /* CarouselIndicator.swift */, 0AAF8E29240EA57D008DD263 /* BarsCarouselIndicatorModel.swift */, 0A4253AE23F5C2C000554656 /* BarsIndicatorView.swift */, 0AAF8E2B240EA594008DD263 /* NumericCarouselIndicatorModel.swift */, diff --git a/MVMCoreUI/Atoms/Views/Arrow.swift b/MVMCoreUI/Atoms/Views/Arrow.swift index eea6071d..c37e4c02 100644 --- a/MVMCoreUI/Atoms/Views/Arrow.swift +++ b/MVMCoreUI/Atoms/Views/Arrow.swift @@ -70,6 +70,9 @@ open class Arrow: View { // MARK: - Drawing //-------------------------------------------------- + /** + Draws the arrow pointing to the right and then rotates the arrow x degrees counter-clockwise. + */ open override func draw(_ rect: CGRect) { super.draw(rect) diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/BarsCarouselIndicatorModel.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/BarsCarouselIndicatorModel.swift index 16adfe46..89369987 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/BarsCarouselIndicatorModel.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/BarsCarouselIndicatorModel.swift @@ -17,4 +17,33 @@ open class BarsCarouselIndicatorModel: CarouselIndicatorModel { public class override var identifier: String { return "barsCarouselIndicator" } + + public var currentIndicatorColor: Color = Color(uiColor: .mvmBlack) + + //-------------------------------------------------- + // MARK: - Keys + //-------------------------------------------------- + + private enum CodingKeys: String, CodingKey { + case currentIndicatorColor + } + + //-------------------------------------------------- + // MARK: - Codec + //-------------------------------------------------- + + public required init(from decoder: Decoder) throws { + let typeContainer = try decoder.container(keyedBy: CodingKeys.self) + + if let currentIndicatorColor = try typeContainer.decodeIfPresent(Color.self, forKey: .currentIndicatorColor) { + self.currentIndicatorColor = currentIndicatorColor + } + + try super.init(from: decoder) + } + + public override func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(currentIndicatorColor, forKey: .currentIndicatorColor) + } } diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift index f9d7ebc9..5724a76e 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift @@ -14,7 +14,7 @@ open class BarsIndicatorView: CarouselIndicator { // MARK: - Stored Properties //-------------------------------------------------- - let stackView: StackView = { + public let stackView: StackView = { let stackView = StackView() stackView.axis = .horizontal stackView.alignment = .bottom @@ -30,18 +30,49 @@ open class BarsIndicatorView: CarouselIndicator { public static let indicatorBarWidth: CGFloat = 24 public static let indicatorBarHeight: (selected: CGFloat, unselected: CGFloat) = (selected: 4, unselected: 1) + /// Convenience to access the model. + public var barsCarouselIndicatorModel: BarsCarouselIndicatorModel? { + return model as? BarsCarouselIndicatorModel + } + //-------------------------------------------------- // MARK: - Computed Properties //-------------------------------------------------- - + open override var isEnabled: Bool { didSet { - barReferences.forEach { view, heightConstraint in - view.backgroundColor = isEnabled ? indicatorTintColor : disabledIndicatorColor + barReferences.forEach { view, _ in + view.backgroundColor = isEnabled ? indicatorColor : disabledIndicatorColor } } } - + + private(set) var _currentIndicatorColor: UIColor = .black + + /// Colors the currently selected index, unique from other indicators + public var currentIndicatorColor: UIColor { + get { return _currentIndicatorColor } + set (newColor) { + _currentIndicatorColor = newColor + barsCarouselIndicatorModel?.currentIndicatorColor = Color(uiColor: newColor) + + if !barReferences.isEmpty { + barReferences[currentIndex].view.backgroundColor = newColor + } + } + } + + public override var indicatorColor: UIColor { + get { return _indicatorColor } + set (newColor) { + super.indicatorColor = newColor + + for (i, barTuple) in barReferences.enumerated() where i != currentIndex { + barTuple.view.backgroundColor = newColor + } + } + } + //-------------------------------------------------- // MARK: - Initializers //-------------------------------------------------- @@ -64,10 +95,15 @@ open class BarsIndicatorView: CarouselIndicator { addSubview(stackView) isUserInteractionEnabled = false - stackView.heightAnchor.constraint(equalToConstant: 4).isActive = true - stackView.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true - stackView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true - trailingAnchor.constraint(equalTo: stackView.trailingAnchor).isActive = true + NSLayoutConstraint.activate([ + stackView.heightAnchor.constraint(equalToConstant: 4), + heightAnchor.constraint(equalTo: stackView.heightAnchor), + stackView.centerXAnchor.constraint(equalTo: centerXAnchor), + stackView.leadingAnchor.constraint(equalTo: leadingAnchor), + stackView.topAnchor.constraint(equalTo: topAnchor), + bottomAnchor.constraint(equalTo: stackView.bottomAnchor), + trailingAnchor.constraint(equalTo: stackView.trailingAnchor) + ]) } //-------------------------------------------------- @@ -81,7 +117,7 @@ open class BarsIndicatorView: CarouselIndicator { for i in 0..= touchPoint_X && $0.0.frame.minX <= touchPoint_X } ?? 0 + } + + open override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { + super.set(with: model, delegateObject, additionalData) + + guard let model = model as? BarsCarouselIndicatorModel else { return } + + currentIndicatorColor = model.currentIndicatorColor.uiColor + } + //-------------------------------------------------- // MARK: - IndicatorViewProtocol //-------------------------------------------------- @@ -111,7 +160,7 @@ open class BarsIndicatorView: CarouselIndicator { } let expression = { - self.barReferences[previousIndex].view.backgroundColor = self.indicatorTintColor + self.barReferences[previousIndex].view.backgroundColor = self.indicatorColor self.barReferences[newIndex].view.backgroundColor = self.currentIndicatorColor self.barReferences[previousIndex].constraint.constant = BarsIndicatorView.indicatorBarHeight.unselected self.barReferences[newIndex].constraint.constant = BarsIndicatorView.indicatorBarHeight.selected diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift index 3f95cf43..1e4db496 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicator.swift @@ -48,11 +48,13 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { public var currentIndex: Int { get { return _currentIndex } set (newIndex) { - + carouselIndicatorModel?.currentIndex = newIndex previousIndex = _currentIndex _currentIndex = newIndex performAction() - updateUI(previousIndex: previousIndex, newIndex: newIndex, totalCount: numberOfPages, isAnimated: carouselIndicatorModel?.isAnimated ?? true) + if previousIndex != newIndex { + updateUI(previousIndex: previousIndex, newIndex: newIndex, totalCount: numberOfPages, isAnimated: carouselIndicatorModel?.isAnimated ?? true) + } } } @@ -64,6 +66,7 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { get { return _numberOfPages } set (newTotal) { guard _numberOfPages != newTotal else { return } + carouselIndicatorModel?.numberOfPages = newTotal _numberOfPages = newTotal isHidden = carouselIndicatorModel?.hidesForSinglePage ?? false && newTotal <= 1 @@ -75,33 +78,12 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { return carouselIndicatorModel?.disabledIndicatorColor.uiColor ?? .mvmCoolGray3 } - public var indicatorTintColor: UIColor { - get { return carouselIndicatorModel?.indicatorColor.uiColor ?? .black } + private(set) var _indicatorColor: UIColor = .black + + public var indicatorColor: UIColor { + get { return _indicatorColor } set (newColor) { carouselIndicatorModel?.indicatorColor = Color(uiColor: newColor) - -// if isBarIndicator(), let barIndicator = indicatorView as? BarsIndicatorView { -// for (i, barTuple) in barIndicator.barReferences.enumerated() where i != currentIndex { -// barTuple.view.backgroundColor = newColor -// } -// } - } - } - - private var _currentIndicatorColor: UIColor = .black - - /// Colors the currently selected index, unique from other indicators - public var currentIndicatorColor: UIColor { - get { return _currentIndicatorColor } - set (newColor) { - _currentIndicatorColor = newColor - carouselIndicatorModel?.currentIndicatorColor = Color(uiColor: newColor) - -// if isBarIndicator() { -// if let barIndicator = indicatorView as? BarsIndicatorView, !barIndicator.barReferences.isEmpty { -// barIndicator.barReferences[currentIndex].view.backgroundColor = newColor -// } -// } } } @@ -184,19 +166,11 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { let touchPoint = tapGesture?.location(in: self) let touchPoint_X = touchPoint?.x ?? 0.0 -// if isBarIndicator(), let bars = (indicatorView as? BarsIndicatorView)?.barReferences { -// currentIndex = bars.firstIndex { $0.0.frame.maxX >= touchPoint_X && $0.0.frame.minX <= touchPoint_X } ?? 0 -// -// } else { -// // Determine which half of the view was touched. -// if touchPoint_X > bounds.width / 2 { -// incrementCurrentIndex() -// } else { -// decrementCurrentIndex() -// } -// } + assessTouchOf(touchPoint_X) } + func assessTouchOf(_ touchPoint_X: CGFloat) { } + //-------------------------------------------------- // MARK: - Methods //-------------------------------------------------- @@ -215,15 +189,13 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { // MARK: - MoleculeViewProtocol //-------------------------------------------------- - open override func set(with model: MoleculeModelProtocol?, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { - - guard let model = model as? CarouselIndicatorModel else { return } - + open override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { super.set(with: model, delegateObject, additionalData) -// indicatorType = IndicatorType(rawValue: model.type) ?? .hybrid - currentIndicatorColor = model.currentIndicatorColor.uiColor - indicatorTintColor = model.indicatorColor.uiColor + guard let model = model as? CarouselIndicatorModel else { return } + + indicatorColor = model.indicatorColor.uiColor + currentIndex = model.currentIndex isEnabled = model.isEnabled if let accessibleValue = MVMCoreUIUtility.hardcodedString(withKey: model.accessibilityHasSlidesInsteadOfPage ? "MVMCoreUIPageControlslides_currentpage_index" : "MVMCoreUIPageControl_currentpage_index") { diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift index aa333f2a..75e5ed58 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift @@ -22,8 +22,10 @@ open class CarouselIndicatorModel: CarouselPagingModelProtocol { public var moleculeName: String? /// The maxmum count of pages before the indicatorView forces a Numeric Indicator in place of Bar. - public var numberOfPages: Int = 0 + + // Sets the current Index to focus on. + public var currentIndex: Int = 0 public var isAnimated: Bool = true public var hidesForSinglePage: Bool = false /// Set true to make the accessibility value as "Slide #currentPage of #totalPage", otherwise will be "Page #currentPage of #totalPage", default is false @@ -31,8 +33,7 @@ open class CarouselIndicatorModel: CarouselPagingModelProtocol { public var isEnabled: Bool = true public var disabledIndicatorColor: Color = Color(uiColor: .mvmCoolGray3) public var indicatorColor: Color = Color(uiColor: .mvmBlack) - public var currentIndicatorColor: Color = Color(uiColor: .mvmBlack) - public var padding: Float? + public var position: Float? /// Allows sendActions() to trigger even if index is already at min/max index. public var alwaysSendAction = false @@ -44,7 +45,7 @@ open class CarouselIndicatorModel: CarouselPagingModelProtocol { private enum CodingKeys: String, CodingKey { case moleculeName case backgroundColor - case type + case currentIndex case numberOfPages case alwaysSendAction case isAnimated @@ -54,7 +55,7 @@ open class CarouselIndicatorModel: CarouselPagingModelProtocol { case disabledIndicatorColor case indicatorColor case currentIndicatorColor - case padding + case position } //-------------------------------------------------- @@ -70,12 +71,16 @@ open class CarouselIndicatorModel: CarouselPagingModelProtocol { self.numberOfPages = numberOfPages } + if let currentIndex = try typeContainer.decodeIfPresent(Int.self, forKey: .currentIndex) { + self.currentIndex = currentIndex + } + if let alwaysSendAction = try typeContainer.decodeIfPresent(Bool.self, forKey: .alwaysSendAction) { self.alwaysSendAction = alwaysSendAction } - if let padding = try typeContainer.decodeIfPresent(Float.self, forKey: .padding) { - self.padding = padding + if let position = try typeContainer.decodeIfPresent(Float.self, forKey: .position) { + self.position = position } if let isAnimated = try typeContainer.decodeIfPresent(Bool.self, forKey: .isAnimated) { @@ -101,25 +106,21 @@ open class CarouselIndicatorModel: CarouselPagingModelProtocol { if let indicatorColor = try typeContainer.decodeIfPresent(Color.self, forKey: .indicatorColor) { self.indicatorColor = indicatorColor } - - if let currentIndicatorColor = try typeContainer.decodeIfPresent(Color.self, forKey: .currentIndicatorColor) { - self.currentIndicatorColor = currentIndicatorColor - } } public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(moleculeName, forKey: .moleculeName) + try container.encodeIfPresent(moleculeName, forKey: .moleculeName) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) - try container.encodeIfPresent(numberOfPages, forKey: .numberOfPages) - try container.encodeIfPresent(alwaysSendAction, forKey: .alwaysSendAction) - try container.encodeIfPresent(isAnimated, forKey: .isAnimated) + try container.encode(numberOfPages, forKey: .numberOfPages) + try container.encode(currentIndex, forKey: .currentIndex) + try container.encode(alwaysSendAction, forKey: .alwaysSendAction) + try container.encode(isAnimated, forKey: .isAnimated) try container.encodeIfPresent(hidesForSinglePage, forKey: .hidesForSinglePage) try container.encodeIfPresent(accessibilityHasSlidesInsteadOfPage, forKey: .accessibilityHasSlidesInsteadOfPage) - try container.encodeIfPresent(isEnabled, forKey: .isEnabled) - try container.encodeIfPresent(disabledIndicatorColor, forKey: .disabledIndicatorColor) - try container.encodeIfPresent(indicatorColor, forKey: .indicatorColor) - try container.encodeIfPresent(currentIndicatorColor, forKey: .currentIndicatorColor) - try container.encodeIfPresent(padding, forKey: .padding) + try container.encode(isEnabled, forKey: .isEnabled) + try container.encode(disabledIndicatorColor, forKey: .disabledIndicatorColor) + try container.encode(indicatorColor, forKey: .indicatorColor) + try container.encodeIfPresent(position, forKey: .position) } } diff --git a/MVMCoreUI/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift b/MVMCoreUI/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift index 4eb16bce..8cd9e05c 100644 --- a/MVMCoreUI/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift +++ b/MVMCoreUI/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift @@ -40,9 +40,23 @@ open class NumericIndicatorView: CarouselIndicator { open override var isEnabled: Bool { didSet { - pageCount.textColor = isEnabled ? indicatorTintColor : disabledIndicatorColor - leftArrow.tintColor = isEnabled ? indicatorTintColor : disabledIndicatorColor - rightArrow.tintColor = isEnabled ? indicatorTintColor : disabledIndicatorColor + pageCount.textColor = isEnabled ? indicatorColor : disabledIndicatorColor + leftArrow.tintColor = isEnabled ? indicatorColor : disabledIndicatorColor + rightArrow.tintColor = isEnabled ? indicatorColor : disabledIndicatorColor + } + } + + /// Sets the color for pageCount text, left arrow and right arrow. + public override var indicatorColor: UIColor { + get { return _indicatorColor } + set (newColor) { + super.indicatorColor = newColor + + if isEnabled { + pageCount.textColor = newColor + leftArrow.tintColor = newColor + rightArrow.tintColor = newColor + } } } @@ -96,6 +110,15 @@ open class NumericIndicatorView: CarouselIndicator { ]) } + public override func assessTouchOf(_ touchPoint_X: CGFloat) { + + if touchPoint_X > bounds.width / 2 { + incrementCurrentIndex() + } else { + decrementCurrentIndex() + } + } + //-------------------------------------------------- // MARK: - IndicatorViewProtocol //-------------------------------------------------- diff --git a/MVMCoreUI/Models/ModelProtocols/CarouselPagingModelProtocol.swift b/MVMCoreUI/Models/ModelProtocols/CarouselPagingModelProtocol.swift index 27a35f87..94b1277a 100644 --- a/MVMCoreUI/Models/ModelProtocols/CarouselPagingModelProtocol.swift +++ b/MVMCoreUI/Models/ModelProtocols/CarouselPagingModelProtocol.swift @@ -10,5 +10,5 @@ import Foundation public protocol CarouselPagingModelProtocol: MoleculeModelProtocol { - var padding: Float? { get } + var position: Float? { get } } diff --git a/MVMCoreUI/Organisms/Carousel.swift b/MVMCoreUI/Organisms/Carousel.swift index 17abe0e6..05266a57 100644 --- a/MVMCoreUI/Organisms/Carousel.swift +++ b/MVMCoreUI/Organisms/Carousel.swift @@ -176,7 +176,7 @@ open class Carousel: View { pagingView = MVMCoreUIMoleculeMappingObject.shared()?.createMolecule(molecule, delegateObject, false) as? (UIView & CarouselPageControlProtocol) } - addPaging(view: pagingView, padding: (CGFloat(molecule?.padding ?? 20))) + addPaging(view: pagingView, position: (CGFloat(molecule?.position ?? 20))) } /// Registers the cells with the collection view @@ -221,7 +221,7 @@ open class Carousel: View { } /// Adds a paging view. Centers it horizontally with the collection view. The position is the vertical distance from the center of the page view to the bottom of the collection view. - open func addPaging(view: (UIView & CarouselPageControlProtocol)?, padding: CGFloat) { + open func addPaging(view: (UIView & CarouselPageControlProtocol)?, position: CGFloat) { pagingView?.removeFromSuperview() bottomPin?.isActive = false @@ -234,13 +234,15 @@ open class Carousel: View { addSubview(pagingView) pagingView.centerXAnchor.constraint(equalTo: collectionView.centerXAnchor).isActive = true - collectionView.bottomAnchor.constraint(equalTo: pagingView.bottomAnchor, constant: padding).isActive = true + collectionView.bottomAnchor.constraint(equalTo: pagingView.centerYAnchor, constant: position).isActive = true + bottomAnchor.constraint(greaterThanOrEqualTo: pagingView.bottomAnchor).isActive = true bottomPin = bottomAnchor.constraint(equalTo: collectionView.bottomAnchor) bottomPin?.priority = .defaultLow bottomPin?.isActive = true pagingView.numberOfPages = numberOfPages (pagingView as? MVMCoreUIViewConstrainingProtocol)?.alignHorizontal?(.fill) + pageIndex = pagingView.currentIndex pagingView.indicatorTouchAction = { [weak self] pager in DispatchQueue.main.async { guard let self = self else { return } From 338a3c8a03bbf8912cb9af124a36653faf3d4a50 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Mon, 30 Mar 2020 14:48:28 -0400 Subject: [PATCH 24/78] fixed merge issue --- MVMCoreUI.xcodeproj/project.pbxproj | 60 +++-- .../BarsCarouselIndicatorModel.swift | 49 ++++ .../CarouselIndicator/BarsIndicatorView.swift | 172 +++++++++++++ .../CarouselIndicator/CarouselIndicator.swift | 235 ++++++++++++++++++ .../CarouselIndicatorModel.swift | 126 ++++++++++ .../NumericCarouselIndicatorModel.swift | 19 ++ .../NumericIndicatorView.swift | 131 ++++++++++ MVMCoreUI/Atomic/Organisms/Carousel.swift | 2 +- MVMCoreUI/BaseClasses/StackView.swift | 100 -------- 9 files changed, 761 insertions(+), 133 deletions(-) create mode 100644 MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsCarouselIndicatorModel.swift create mode 100644 MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift create mode 100644 MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift create mode 100644 MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift create mode 100644 MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericCarouselIndicatorModel.swift create mode 100644 MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift delete mode 100644 MVMCoreUI/BaseClasses/StackView.swift diff --git a/MVMCoreUI.xcodeproj/project.pbxproj b/MVMCoreUI.xcodeproj/project.pbxproj index 637655a2..c079b212 100644 --- a/MVMCoreUI.xcodeproj/project.pbxproj +++ b/MVMCoreUI.xcodeproj/project.pbxproj @@ -68,10 +68,6 @@ 01EB369423609801006832FA /* HeadlineBodyModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01EB368D23609801006832FA /* HeadlineBodyModel.swift */; }; 01F2A03223A4498200D954D8 /* CaretLinkModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01F2A03123A4498200D954D8 /* CaretLinkModel.swift */; }; 0A1214A022C11A18007C7030 /* ActionDetailWithImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A12149F22C11A17007C7030 /* ActionDetailWithImage.swift */; }; - 0A14F69323E349EF00EDF7F7 /* CarouselIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A14F69223E349EF00EDF7F7 /* CarouselIndicator.swift */; }; - 0A14F6A523E4803A00EDF7F7 /* StackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A14F6A423E4803A00EDF7F7 /* StackView.swift */; }; - 0A14F6A923E8750300EDF7F7 /* CarouselIndicatorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A14F6A823E8750300EDF7F7 /* CarouselIndicatorModel.swift */; }; - 0A14F6B423E8C29700EDF7F7 /* NumericIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A14F6B323E8C29700EDF7F7 /* NumericIndicatorView.swift */; }; 0A1B4A96233BB18F005B3FB4 /* CheckboxLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7BAFA2232BE63400FB8E22 /* CheckboxLabel.swift */; }; 0A21DB7F235DECC500C160A2 /* EntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A21DB7E235DECC500C160A2 /* EntryField.swift */; }; 0A21DB83235DFBC500C160A2 /* MdnEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A21DB82235DFBC500C160A2 /* MdnEntryField.swift */; }; @@ -88,13 +84,17 @@ 0A21DB8E235E06EF00C160A2 /* MFDigitTextField.xib in Resources */ = {isa = PBXBuildFile; fileRef = D29DF24A21E6A177003B2FB9 /* MFDigitTextField.xib */; }; 0A21DB91235E0EDB00C160A2 /* DigitBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A8321AE2355FE9500CB7F00 /* DigitBox.swift */; }; 0A21DB94235E24ED00C160A2 /* DigitEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A21DB93235E24ED00C160A2 /* DigitEntryField.swift */; }; + 0A30D3E32432741A00124AF0 /* BarsCarouselIndicatorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A30D3DD2432741A00124AF0 /* BarsCarouselIndicatorModel.swift */; }; + 0A30D3E42432741A00124AF0 /* NumericCarouselIndicatorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A30D3DE2432741A00124AF0 /* NumericCarouselIndicatorModel.swift */; }; + 0A30D3E52432741A00124AF0 /* NumericIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A30D3DF2432741A00124AF0 /* NumericIndicatorView.swift */; }; + 0A30D3E62432741A00124AF0 /* BarsIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A30D3E02432741A00124AF0 /* BarsIndicatorView.swift */; }; + 0A30D3E72432741A00124AF0 /* CarouselIndicatorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A30D3E12432741A00124AF0 /* CarouselIndicatorModel.swift */; }; + 0A30D3E82432741A00124AF0 /* CarouselIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A30D3E22432741A00124AF0 /* CarouselIndicator.swift */; }; 0A41BA6E2344FCD400D4C0BC /* CATransaction+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A41BA6D2344FCD400D4C0BC /* CATransaction+Extension.swift */; }; 0A41BA7F23453A6400D4C0BC /* TextEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A41BA7E23453A6400D4C0BC /* TextEntryField.swift */; }; - 0A4253AF23F5C2C100554656 /* BarsIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A4253AE23F5C2C000554656 /* BarsIndicatorView.swift */; }; 0A5D59C223AD2F5700EFD9E9 /* AppleGuidelinesProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A5D59C123AD2F5700EFD9E9 /* AppleGuidelinesProtocol.swift */; }; 0A69F611241BDEA700F7231B /* RuleAnyRequiredModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A69F610241BDEA700F7231B /* RuleAnyRequiredModel.swift */; }; 0A6BF4722360C56C0028F841 /* BaseDropdownEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A6BF4712360C56C0028F841 /* BaseDropdownEntryField.swift */; }; - 0A7918F523F5E7EA00772FF4 /* ImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7918F423F5E7EA00772FF4 /* ImageView.swift */; }; 0A7BAD74232A8DC700FB8E22 /* HeadlineBodyButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7BAD73232A8DC700FB8E22 /* HeadlineBodyButton.swift */; }; 0A7BAFA1232BE61800FB8E22 /* Checkbox.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7BAFA0232BE61800FB8E22 /* Checkbox.swift */; }; 0A7EF85B23D8A52800B2AAD1 /* EntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF85A23D8A52800B2AAD1 /* EntryFieldModel.swift */; }; @@ -105,8 +105,6 @@ 0A7EF86523D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF86423D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift */; }; 0A7EF86723D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF86623D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift */; }; 0AA33B3A2398524F0067DD0F /* Toggle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AA33B392398524F0067DD0F /* Toggle.swift */; }; - 0AAF8E2A240EA57D008DD263 /* BarsCarouselIndicatorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AAF8E29240EA57D008DD263 /* BarsCarouselIndicatorModel.swift */; }; - 0AAF8E2C240EA594008DD263 /* NumericCarouselIndicatorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AAF8E2B240EA594008DD263 /* NumericCarouselIndicatorModel.swift */; }; 0ABD136D237CAD1E0081388D /* DateDropdownEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ABD136C237CAD1E0081388D /* DateDropdownEntryField.swift */; }; 0ABD1371237DB0450081388D /* ItemDropdownEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ABD1370237DB0450081388D /* ItemDropdownEntryField.swift */; }; 0AE14F64238315D2005417F8 /* TextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AE14F63238315D2005417F8 /* TextField.swift */; }; @@ -469,17 +467,18 @@ 01EB368D23609801006832FA /* HeadlineBodyModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeadlineBodyModel.swift; sourceTree = ""; }; 01F2A03123A4498200D954D8 /* CaretLinkModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaretLinkModel.swift; sourceTree = ""; }; 0A12149F22C11A17007C7030 /* ActionDetailWithImage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActionDetailWithImage.swift; sourceTree = ""; }; - 0A14F69223E349EF00EDF7F7 /* CarouselIndicator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarouselIndicator.swift; sourceTree = ""; }; - 0A14F6A423E4803A00EDF7F7 /* StackView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StackView.swift; sourceTree = ""; }; - 0A14F6A823E8750300EDF7F7 /* CarouselIndicatorModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarouselIndicatorModel.swift; sourceTree = ""; }; - 0A14F6B323E8C29700EDF7F7 /* NumericIndicatorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NumericIndicatorView.swift; sourceTree = ""; }; 0A209CD223A7E2810068F8B0 /* UIStackViewAlignment+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIStackViewAlignment+Extension.swift"; sourceTree = ""; }; 0A21DB7E235DECC500C160A2 /* EntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EntryField.swift; sourceTree = ""; }; 0A21DB82235DFBC500C160A2 /* MdnEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MdnEntryField.swift; sourceTree = ""; }; 0A21DB93235E24ED00C160A2 /* DigitEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DigitEntryField.swift; sourceTree = ""; }; + 0A30D3DD2432741A00124AF0 /* BarsCarouselIndicatorModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BarsCarouselIndicatorModel.swift; sourceTree = ""; }; + 0A30D3DE2432741A00124AF0 /* NumericCarouselIndicatorModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NumericCarouselIndicatorModel.swift; sourceTree = ""; }; + 0A30D3DF2432741A00124AF0 /* NumericIndicatorView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NumericIndicatorView.swift; sourceTree = ""; }; + 0A30D3E02432741A00124AF0 /* BarsIndicatorView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BarsIndicatorView.swift; sourceTree = ""; }; + 0A30D3E12432741A00124AF0 /* CarouselIndicatorModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CarouselIndicatorModel.swift; sourceTree = ""; }; + 0A30D3E22432741A00124AF0 /* CarouselIndicator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CarouselIndicator.swift; sourceTree = ""; }; 0A41BA6D2344FCD400D4C0BC /* CATransaction+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CATransaction+Extension.swift"; sourceTree = ""; }; 0A41BA7E23453A6400D4C0BC /* TextEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextEntryField.swift; sourceTree = ""; }; - 0A4253AE23F5C2C000554656 /* BarsIndicatorView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BarsIndicatorView.swift; sourceTree = ""; }; 0A5D59C123AD2F5700EFD9E9 /* AppleGuidelinesProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppleGuidelinesProtocol.swift; sourceTree = ""; }; 0A69F610241BDEA700F7231B /* RuleAnyRequiredModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RuleAnyRequiredModel.swift; sourceTree = ""; }; 0A6BF4712360C56C0028F841 /* BaseDropdownEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseDropdownEntryField.swift; sourceTree = ""; }; @@ -497,8 +496,6 @@ 0A8321AE2355FE9500CB7F00 /* DigitBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DigitBox.swift; sourceTree = ""; }; 0AA33B33239813C50067DD0F /* UIColor+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+Extension.swift"; sourceTree = ""; }; 0AA33B392398524F0067DD0F /* Toggle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Toggle.swift; sourceTree = ""; }; - 0AAF8E29240EA57D008DD263 /* BarsCarouselIndicatorModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BarsCarouselIndicatorModel.swift; sourceTree = ""; }; - 0AAF8E2B240EA594008DD263 /* NumericCarouselIndicatorModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NumericCarouselIndicatorModel.swift; sourceTree = ""; }; 0ABD136C237CAD1E0081388D /* DateDropdownEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateDropdownEntryField.swift; sourceTree = ""; }; 0ABD1370237DB0450081388D /* ItemDropdownEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemDropdownEntryField.swift; sourceTree = ""; }; 0AE14F63238315D2005417F8 /* TextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextField.swift; sourceTree = ""; }; @@ -879,17 +876,18 @@ path = FormUIHelpers; sourceTree = ""; }; - 0A14F6B023E8C27A00EDF7F7 /* CarouselIndicator */ = { + 0A30D3DC2432741A00124AF0 /* CarouselIndicator */ = { isa = PBXGroup; children = ( - 0A14F6A823E8750300EDF7F7 /* CarouselIndicatorModel.swift */, - 0A14F69223E349EF00EDF7F7 /* CarouselIndicator.swift */, - 0AAF8E29240EA57D008DD263 /* BarsCarouselIndicatorModel.swift */, - 0A4253AE23F5C2C000554656 /* BarsIndicatorView.swift */, - 0AAF8E2B240EA594008DD263 /* NumericCarouselIndicatorModel.swift */, - 0A14F6B323E8C29700EDF7F7 /* NumericIndicatorView.swift */, + 0A30D3DD2432741A00124AF0 /* BarsCarouselIndicatorModel.swift */, + 0A30D3DE2432741A00124AF0 /* NumericCarouselIndicatorModel.swift */, + 0A30D3DF2432741A00124AF0 /* NumericIndicatorView.swift */, + 0A30D3E02432741A00124AF0 /* BarsIndicatorView.swift */, + 0A30D3E12432741A00124AF0 /* CarouselIndicatorModel.swift */, + 0A30D3E22432741A00124AF0 /* CarouselIndicator.swift */, ); - path = CarouselIndicator; + name = CarouselIndicator; + path = ../../../../../../../mvmrc_ios/mvm_core_ui/MVMCoreUI/Atoms/Views/CarouselIndicator; sourceTree = ""; }; 0A5D59C323AD488600EFD9E9 /* Protocols */ = { @@ -1520,7 +1518,7 @@ D29DF17D21E69E26003B2FB9 /* Views */ = { isa = PBXGroup; children = ( - 0A14F6B023E8C27A00EDF7F7 /* CarouselIndicator */, + 0A30D3DC2432741A00124AF0 /* CarouselIndicator */, 9445890B2385BCE300DE9FD4 /* ProgressBarModel.swift */, 01509D922327ECFB00EF99AA /* ProgressBar.swift */, 9445890D2385C3F800DE9FD4 /* MultiProgressModel.swift */, @@ -1711,7 +1709,6 @@ 0AE14F63238315D2005417F8 /* TextField.swift */, D2755D7A23689C7500485468 /* TableViewCell.swift */, 0A5D59C323AD488600EFD9E9 /* Protocols */, - 0A14F6A423E4803A00EDF7F7 /* StackView.swift */, 0A7918F423F5E7EA00772FF4 /* ImageView.swift */, ); path = BaseClasses; @@ -1967,7 +1964,6 @@ D2A92884241ACB25004E01C6 /* ProgrammaticScrollViewController.swift in Sources */, 0A21DB7F235DECC500C160A2 /* EntryField.swift in Sources */, D2E2A99F23E07F8A000B42E6 /* PillButton.swift in Sources */, - 0A4253AF23F5C2C100554656 /* BarsIndicatorView.swift in Sources */, D2C5001921F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.m in Sources */, D29DF12E21E6851E003B2FB9 /* MVMCoreUITopAlertView.m in Sources */, D29DF2CF21E7C104003B2FB9 /* MFLoadingViewController.m in Sources */, @@ -1989,6 +1985,7 @@ D22D8395241FB41200D3DF69 /* UIStackView+Extension.swift in Sources */, 52B201D324081CFB00D2011E /* ListLeftVariableRadioButtonAndPaymentMethodModel.swift in Sources */, 525239C02407BCFF00454969 /* ListTwoColumnPriceDetailsModel.swift in Sources */, + 0A30D3E72432741A00124AF0 /* CarouselIndicatorModel.swift in Sources */, D2E2A99A23D8D6B4000B42E6 /* HeadlineBodyButtonModel.swift in Sources */, D202AFE6242A6A9C00E5BEDF /* UICollectionViewScrollPosition+Extension.swift in Sources */, 8D084AD22410BF7600951227 /* ListOneColumnFullWidthTextBodyText.swift in Sources */, @@ -2000,7 +1997,6 @@ 0103B84E23D7E33A009C315C /* HeadlineBodyToggleModel.swift in Sources */, D2755D7B23689C7500485468 /* TableViewCell.swift in Sources */, 0A21DB85235E06EF00C160A2 /* MFTextField.m in Sources */, - 0AAF8E2C240EA594008DD263 /* NumericCarouselIndicatorModel.swift in Sources */, 014AA72623C501E2006F3E93 /* ContainerModelProtocol.swift in Sources */, AA11A42123F15D7000D7962F /* ListRightVariablePaymentsModel.swift in Sources */, 01EB369223609801006832FA /* MoleculeStackModel.swift in Sources */, @@ -2017,6 +2013,7 @@ D29E28D823D21AB800ACEA85 /* StringAndMoleculeView.swift in Sources */, 01EB369023609801006832FA /* MoleculeListItemModel.swift in Sources */, D28A838323CCBD3F00DFE4FC /* CircleProgressModel.swift in Sources */, + 0A30D3E82432741A00124AF0 /* CarouselIndicator.swift in Sources */, D268C70C2386DFFD007F2C1C /* MoleculeStackItemModel.swift in Sources */, DBEFFA04225A829700230692 /* Label.swift in Sources */, D2D6CD4022E78C1A00D701B8 /* Scroller.swift in Sources */, @@ -2058,7 +2055,6 @@ 01F2A03223A4498200D954D8 /* CaretLinkModel.swift in Sources */, 0A7BAFA1232BE61800FB8E22 /* Checkbox.swift in Sources */, 011B58F023A2AA980085F53C /* ListItemModelProtocol.swift in Sources */, - 0A14F6A923E8750300EDF7F7 /* CarouselIndicatorModel.swift in Sources */, D22479962316AF6E003FCCF9 /* HeadlineBodyLink.swift in Sources */, D29DF2AE21E7B3A4003B2FB9 /* MFTextView.m in Sources */, 0A41BA7F23453A6400D4C0BC /* TextEntryField.swift in Sources */, @@ -2075,7 +2071,6 @@ 017BEB7F23676E870024EF95 /* MoleculeObjectMapping.swift in Sources */, D274CA332236A78900B01B62 /* FooterView.swift in Sources */, D29DF2BF21E7BEA4003B2FB9 /* MVMCoreUITabBarPageControlViewController.m in Sources */, - 0A14F69323E349EF00EDF7F7 /* CarouselIndicator.swift in Sources */, 014AA72423C501E2006F3E93 /* MoleculeContainerModel.swift in Sources */, D29DF28321E7AB24003B2FB9 /* MVMCoreUICommonViewsUtility.m in Sources */, 011B58F223A2AE2C0085F53C /* DropDownListItemModel.swift in Sources */, @@ -2083,6 +2078,7 @@ 94C2D9842386F3F80006CF46 /* LabelAttributeModel.swift in Sources */, 944589212385D6E900DE9FD4 /* DashLineModel.swift in Sources */, D2E2A99623D8CF85000B42E6 /* HeadlineBodyLinkToggleModel.swift in Sources */, + 0A30D3E52432741A00124AF0 /* NumericIndicatorView.swift in Sources */, C6FA7D5323C77A4A00A3614A /* StringAndMoleculeStack.swift in Sources */, 011D958524042432000E3791 /* RulesProtocol.swift in Sources */, 94AF4A3F23E9D13900676048 /* MFCaretButton.m in Sources */, @@ -2098,7 +2094,6 @@ 011D95A5240455DC000E3791 /* FormGroupRule.swift in Sources */, D2A6390522CBCE160052ED1F /* MoleculeCollectionViewCell.swift in Sources */, D2A6390122CBB1820052ED1F /* Carousel.swift in Sources */, - 0A14F6B423E8C29700EDF7F7 /* NumericIndicatorView.swift in Sources */, D29DF2C721E7BF57003B2FB9 /* MFTabBarInteractor.m in Sources */, C7F8012123E8303200396FBD /* ListRVWheel.swift in Sources */, D29DF29521E7ADB8003B2FB9 /* MFProgrammaticScrollViewController.m in Sources */, @@ -2111,6 +2106,7 @@ 8D084AD02410BF4800951227 /* ListOneColumnFullWidthTextBodyTextModel.swift in Sources */, 0ABD1371237DB0450081388D /* ItemDropdownEntryField.swift in Sources */, 8D24041123E7FB9E009E23BE /* ListLeftVariableIconWithRightCaret.swift in Sources */, + 0A30D3E42432741A00124AF0 /* NumericCarouselIndicatorModel.swift in Sources */, D2E1FAE12268E81D00AEFD8C /* MoleculeListTemplate.swift in Sources */, 525019E72406853600EED91C /* ListFourColumnDataUsageDivider.swift in Sources */, 0AE98BB323FF0934004C5109 /* ExternalLinkModel.swift in Sources */, @@ -2140,6 +2136,7 @@ D29DF29821E7ADB8003B2FB9 /* MFScrollingViewController.m in Sources */, D28A839323CE828900DFE4FC /* HeadlineBodyCaretLinkImageModel.swift in Sources */, D29770C821F7C4AE00B2F0D0 /* TopLabelsView.m in Sources */, + 0A30D3E32432741A00124AF0 /* BarsCarouselIndicatorModel.swift in Sources */, D260105F23D0BFFC00764D80 /* StackItem.swift in Sources */, 9432A79F23DB47BA00719041 /* EntryFieldContainer.swift in Sources */, 01EB369323609801006832FA /* HeaderModel.swift in Sources */, @@ -2167,6 +2164,7 @@ D2A5146122121FBF00345BFB /* MoleculeStackTemplate.swift in Sources */, D2E2A9A323E096B1000B42E6 /* DisableableModelProtocol.swift in Sources */, D29DF11821E6805F003B2FB9 /* NSLayoutConstraint+MFConvenience.m in Sources */, + 0A30D3E62432741A00124AF0 /* BarsIndicatorView.swift in Sources */, 94C2D9A323872C110006CF46 /* LabelAttributeStrikeThroughModel.swift in Sources */, D28A838523CCCA8900DFE4FC /* ScrollerModel.swift in Sources */, D29DF26C21E6AA0B003B2FB9 /* FLAnimatedImage.m in Sources */, @@ -2177,7 +2175,6 @@ D29770FC21F7C77400B2F0D0 /* MVMCoreUITextFieldView.m in Sources */, 52267A0723FFE25000906CBA /* ListOneColumnFullWidthTextAllTextAndLinks.swift in Sources */, C003506123AA94CD00B6AC29 /* Button.swift in Sources */, - 0A14F6A523E4803A00EDF7F7 /* StackView.swift in Sources */, DBC4391B224421A0001AB423 /* CaretLink.swift in Sources */, 0198F7A82256A80B0066C936 /* MFRadioButton.m in Sources */, 0A6BF4722360C56C0028F841 /* BaseDropdownEntryField.swift in Sources */, @@ -2208,7 +2205,6 @@ C6FA7D5223C77A4A00A3614A /* UnOrderedList.swift in Sources */, 01509D8F2327EC6F00EF99AA /* MoleculeTableViewCell.swift in Sources */, 0105618D224BBE7700E1557D /* FormValidator.swift in Sources */, - 0AAF8E2A240EA57D008DD263 /* BarsCarouselIndicatorModel.swift in Sources */, 01509D912327ECE600EF99AA /* CornerLabels.swift in Sources */, D22D1F1B220341F60077CEC0 /* MVMCoreUICheckBox.m in Sources */, C695A69823C990C200BFB94E /* DoughnutChartView.swift in Sources */, diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsCarouselIndicatorModel.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsCarouselIndicatorModel.swift new file mode 100644 index 00000000..89369987 --- /dev/null +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsCarouselIndicatorModel.swift @@ -0,0 +1,49 @@ +// +// BarsCarouselIndicatorModel.swift +// MVMCoreUI +// +// Created by Kevin Christiano on 3/3/20. +// Copyright © 2020 Verizon Wireless. All rights reserved. +// + +import UIKit + + +open class BarsCarouselIndicatorModel: CarouselIndicatorModel { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + + public class override var identifier: String { + return "barsCarouselIndicator" + } + + public var currentIndicatorColor: Color = Color(uiColor: .mvmBlack) + + //-------------------------------------------------- + // MARK: - Keys + //-------------------------------------------------- + + private enum CodingKeys: String, CodingKey { + case currentIndicatorColor + } + + //-------------------------------------------------- + // MARK: - Codec + //-------------------------------------------------- + + public required init(from decoder: Decoder) throws { + let typeContainer = try decoder.container(keyedBy: CodingKeys.self) + + if let currentIndicatorColor = try typeContainer.decodeIfPresent(Color.self, forKey: .currentIndicatorColor) { + self.currentIndicatorColor = currentIndicatorColor + } + + try super.init(from: decoder) + } + + public override func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(currentIndicatorColor, forKey: .currentIndicatorColor) + } +} diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift new file mode 100644 index 00000000..5724a76e --- /dev/null +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift @@ -0,0 +1,172 @@ +// +// BarIndicatorView.swift +// MVMCoreUI +// +// Created by Kevin Christiano on 2/3/20. +// Copyright © 2020 Verizon Wireless. All rights reserved. +// + +import UIKit + + +open class BarsIndicatorView: CarouselIndicator { + //-------------------------------------------------- + // MARK: - Stored Properties + //-------------------------------------------------- + + public let stackView: StackView = { + let stackView = StackView() + stackView.axis = .horizontal + stackView.alignment = .bottom + stackView.distribution = .equalSpacing + stackView.spacing = 6 + stackView.heightAnchor.constraint(lessThanOrEqualToConstant: BarsIndicatorView.indicatorBarHeight.selected).isActive = true + return stackView + }() + + public var barReferences: [(view: View, constraint: NSLayoutConstraint)] = [] + + // Dimensions are based on InVision Design Guidelines. + public static let indicatorBarWidth: CGFloat = 24 + public static let indicatorBarHeight: (selected: CGFloat, unselected: CGFloat) = (selected: 4, unselected: 1) + + /// Convenience to access the model. + public var barsCarouselIndicatorModel: BarsCarouselIndicatorModel? { + return model as? BarsCarouselIndicatorModel + } + + //-------------------------------------------------- + // MARK: - Computed Properties + //-------------------------------------------------- + + open override var isEnabled: Bool { + didSet { + barReferences.forEach { view, _ in + view.backgroundColor = isEnabled ? indicatorColor : disabledIndicatorColor + } + } + } + + private(set) var _currentIndicatorColor: UIColor = .black + + /// Colors the currently selected index, unique from other indicators + public var currentIndicatorColor: UIColor { + get { return _currentIndicatorColor } + set (newColor) { + _currentIndicatorColor = newColor + barsCarouselIndicatorModel?.currentIndicatorColor = Color(uiColor: newColor) + + if !barReferences.isEmpty { + barReferences[currentIndex].view.backgroundColor = newColor + } + } + } + + public override var indicatorColor: UIColor { + get { return _indicatorColor } + set (newColor) { + super.indicatorColor = newColor + + for (i, barTuple) in barReferences.enumerated() where i != currentIndex { + barTuple.view.backgroundColor = newColor + } + } + } + + //-------------------------------------------------- + // MARK: - Initializers + //-------------------------------------------------- + + public init() { + super.init(frame: .zero) + } + + public required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + //-------------------------------------------------- + // MARK: - Setup + //-------------------------------------------------- + + open override func setupView() { + super.setupView() + + addSubview(stackView) + isUserInteractionEnabled = false + + NSLayoutConstraint.activate([ + stackView.heightAnchor.constraint(equalToConstant: 4), + heightAnchor.constraint(equalTo: stackView.heightAnchor), + stackView.centerXAnchor.constraint(equalTo: centerXAnchor), + stackView.leadingAnchor.constraint(equalTo: leadingAnchor), + stackView.topAnchor.constraint(equalTo: topAnchor), + bottomAnchor.constraint(equalTo: stackView.bottomAnchor), + trailingAnchor.constraint(equalTo: stackView.trailingAnchor) + ]) + } + + //-------------------------------------------------- + // MARK: - Methods + //-------------------------------------------------- + + func generateBars() { + + var bars = [(View, NSLayoutConstraint)]() + + for i in 0..= touchPoint_X && $0.0.frame.minX <= touchPoint_X } ?? 0 + } + + open override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { + super.set(with: model, delegateObject, additionalData) + + guard let model = model as? BarsCarouselIndicatorModel else { return } + + currentIndicatorColor = model.currentIndicatorColor.uiColor + } + + //-------------------------------------------------- + // MARK: - IndicatorViewProtocol + //-------------------------------------------------- + + public override func reset() { + super.reset() + barReferences.forEach { $0.view.removeFromSuperview() } + barReferences = [] + } + + public override func updateUI(previousIndex: Int, newIndex: Int, totalCount: Int, isAnimated: Bool) { + + guard !barReferences.isEmpty else { + generateBars() + return + } + + let expression = { + self.barReferences[previousIndex].view.backgroundColor = self.indicatorColor + self.barReferences[newIndex].view.backgroundColor = self.currentIndicatorColor + self.barReferences[previousIndex].constraint.constant = BarsIndicatorView.indicatorBarHeight.unselected + self.barReferences[newIndex].constraint.constant = BarsIndicatorView.indicatorBarHeight.selected + self.layoutIfNeeded() + } + + isAnimated ? UIView.animate(withDuration: 0.3) { expression() } : expression() + } +} diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift new file mode 100644 index 00000000..1e4db496 --- /dev/null +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift @@ -0,0 +1,235 @@ +// +// CarouselIndicator.swift +// MVMCoreUI +// +// Created by Kevin Christiano on 1/30/20. +// Copyright © 2020 Verizon Wireless. All rights reserved. +// + +import Foundation + + +open class CarouselIndicator: Control, CarouselPageControlProtocol { + //-------------------------------------------------- + // MARK: - Constraints + //-------------------------------------------------- + + public var topConstraint: NSLayoutConstraint? + public var bottomConstraint: NSLayoutConstraint? + + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + + public var uiGestures: Set = [] + + /// Convenience to access the model. + public var carouselIndicatorModel: CarouselIndicatorModel? { + return model as? CarouselIndicatorModel + } + + /// Set this closure to perform an action when a different indicator was selected. + /// Passes through oldInde and newIndex, respectively. + public var indicatorTouchAction: ((CarouselPageControlProtocol) -> ())? + + open override var isEnabled: Bool { + didSet { + isUserInteractionEnabled = isEnabled + } + } + + //-------------------------------------------------- + // MARK: - Computed Properties + //-------------------------------------------------- + + private(set) var previousIndex = 0 + private var _currentIndex = 0 + + public var currentIndex: Int { + get { return _currentIndex } + set (newIndex) { + carouselIndicatorModel?.currentIndex = newIndex + previousIndex = _currentIndex + _currentIndex = newIndex + performAction() + if previousIndex != newIndex { + updateUI(previousIndex: previousIndex, newIndex: newIndex, totalCount: numberOfPages, isAnimated: carouselIndicatorModel?.isAnimated ?? true) + } + } + } + + private var _numberOfPages = 0 + + /// Holds the total number of pages displayed by the carousel. + /// Updating this property will potentially update the UI. + public var numberOfPages: Int { + get { return _numberOfPages } + set (newTotal) { + guard _numberOfPages != newTotal else { return } + carouselIndicatorModel?.numberOfPages = newTotal + _numberOfPages = newTotal + + isHidden = carouselIndicatorModel?.hidesForSinglePage ?? false && newTotal <= 1 + updateUI(previousIndex: previousIndex, newIndex: currentIndex, totalCount: newTotal, isAnimated: carouselIndicatorModel?.isAnimated ?? true) + } + } + + public var disabledIndicatorColor: UIColor { + return carouselIndicatorModel?.disabledIndicatorColor.uiColor ?? .mvmCoolGray3 + } + + private(set) var _indicatorColor: UIColor = .black + + public var indicatorColor: UIColor { + get { return _indicatorColor } + set (newColor) { + carouselIndicatorModel?.indicatorColor = Color(uiColor: newColor) + } + } + + //-------------------------------------------------- + // MARK: - Initializers + //-------------------------------------------------- + + override init(frame: CGRect) { + super.init(frame: frame) + } + + convenience override init() { + self.init(frame: .zero) + } + + required public init?(coder: NSCoder) { + super.init(coder: coder) + } + + //-------------------------------------------------- + // MARK: - Lifecycle + //-------------------------------------------------- + + public override func initialSetup() { + super.initialSetup() + + isAccessibilityElement = true + accessibilityTraits = .adjustable + } + + open override func setupView() { + super.setupView() + + setupGestures() + } + + //-------------------------------------------------- + // MARK: - UITouch + //-------------------------------------------------- + + private func setupGestures() { + + let tap = UITapGestureRecognizer(target: self, action: #selector(indicatorTapped)) + let leftSwipe = UISwipeGestureRecognizer(target: self, action: #selector(swipeLeft)) + let rightSwipe = UISwipeGestureRecognizer(target: self, action: #selector(swipeRight)) + + leftSwipe.direction = .left + rightSwipe.direction = .right + + addGestureRecognizer(tap) + addGestureRecognizer(leftSwipe) + addGestureRecognizer(rightSwipe) + + uiGestures.insert(tap) + uiGestures.insert(leftSwipe) + uiGestures.insert(rightSwipe) + } + + func incrementCurrentIndex() { + currentIndex = min(currentIndex + 1, numberOfPages - 1) + } + + func decrementCurrentIndex() { + currentIndex = max(0, currentIndex - 1) + } + + /// Increments the currentIndex value. + @objc func swipeLeft() { + incrementCurrentIndex() + } + + /// Decrement the currentIndex value + @objc func swipeRight() { + decrementCurrentIndex() + } + + /// Handles tap logic for Indicator + @objc func indicatorTapped(_ tapGesture: UITapGestureRecognizer?) { + + let touchPoint = tapGesture?.location(in: self) + let touchPoint_X = touchPoint?.x ?? 0.0 + + assessTouchOf(touchPoint_X) + } + + func assessTouchOf(_ touchPoint_X: CGFloat) { } + + //-------------------------------------------------- + // MARK: - Methods + //-------------------------------------------------- + + open func updateUI(previousIndex: Int, newIndex: Int, totalCount: Int, isAnimated: Bool) { } + + public func performAction() { + + sendActions(for: .valueChanged) + indicatorTouchAction?(self) + } + + public func scrollViewDidScroll(_ collectionView: UICollectionView) { } + + //-------------------------------------------------- + // MARK: - MoleculeViewProtocol + //-------------------------------------------------- + + open override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { + super.set(with: model, delegateObject, additionalData) + + guard let model = model as? CarouselIndicatorModel else { return } + + indicatorColor = model.indicatorColor.uiColor + currentIndex = model.currentIndex + isEnabled = model.isEnabled + + if let accessibleValue = MVMCoreUIUtility.hardcodedString(withKey: model.accessibilityHasSlidesInsteadOfPage ? "MVMCoreUIPageControlslides_currentpage_index" : "MVMCoreUIPageControl_currentpage_index") { + accessibilityValue = String(format: accessibleValue, currentIndex + 1, numberOfPages) + } + } + + //-------------------------------------------------- + // MARK: - Accessibility + //-------------------------------------------------- + + open override func accessibilityIncrement() { + + accessibilityAdjust(toPage: currentIndex + 1) + } + + open override func accessibilityDecrement() { + + accessibilityAdjust(toPage: currentIndex - 1) + } + + func accessibilityAdjust(toPage index: Int) { + + if (index < numberOfPages && index >= 0) || carouselIndicatorModel?.alwaysSendAction ?? false { + carouselIndicatorModel?.isAnimated = false + previousIndex = currentIndex + currentIndex = index + performAction() + } + } + + func setTopBottomSpace(constant: CGFloat) { + + bottomConstraint?.constant = constant + topConstraint?.constant = constant + } +} diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift new file mode 100644 index 00000000..75e5ed58 --- /dev/null +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift @@ -0,0 +1,126 @@ +// +// CarouselIndicatorModel.swift +// MVMCoreUI +// +// Created by Kevin Christiano on 2/3/20. +// Copyright © 2020 Verizon Wireless. All rights reserved. +// + +import Foundation + + +open class CarouselIndicatorModel: CarouselPagingModelProtocol { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + + public class var identifier: String { + return "" + } + + public var backgroundColor: Color? + public var moleculeName: String? + + /// The maxmum count of pages before the indicatorView forces a Numeric Indicator in place of Bar. + public var numberOfPages: Int = 0 + + // Sets the current Index to focus on. + public var currentIndex: Int = 0 + public var isAnimated: Bool = true + public var hidesForSinglePage: Bool = false + /// Set true to make the accessibility value as "Slide #currentPage of #totalPage", otherwise will be "Page #currentPage of #totalPage", default is false + public var accessibilityHasSlidesInsteadOfPage: Bool = false + public var isEnabled: Bool = true + public var disabledIndicatorColor: Color = Color(uiColor: .mvmCoolGray3) + public var indicatorColor: Color = Color(uiColor: .mvmBlack) + public var position: Float? + + /// Allows sendActions() to trigger even if index is already at min/max index. + public var alwaysSendAction = false + + //-------------------------------------------------- + // MARK: - Keys + //-------------------------------------------------- + + private enum CodingKeys: String, CodingKey { + case moleculeName + case backgroundColor + case currentIndex + case numberOfPages + case alwaysSendAction + case isAnimated + case hidesForSinglePage + case accessibilityHasSlidesInsteadOfPage + case isEnabled + case disabledIndicatorColor + case indicatorColor + case currentIndicatorColor + case position + } + + //-------------------------------------------------- + // MARK: - Codec + //-------------------------------------------------- + + required public init(from decoder: Decoder) throws { + let typeContainer = try decoder.container(keyedBy: CodingKeys.self) + moleculeName = try typeContainer.decodeIfPresent(String.self, forKey: .moleculeName) + backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) + + if let numberOfPages = try typeContainer.decodeIfPresent(Int.self, forKey: .numberOfPages) { + self.numberOfPages = numberOfPages + } + + if let currentIndex = try typeContainer.decodeIfPresent(Int.self, forKey: .currentIndex) { + self.currentIndex = currentIndex + } + + if let alwaysSendAction = try typeContainer.decodeIfPresent(Bool.self, forKey: .alwaysSendAction) { + self.alwaysSendAction = alwaysSendAction + } + + if let position = try typeContainer.decodeIfPresent(Float.self, forKey: .position) { + self.position = position + } + + if let isAnimated = try typeContainer.decodeIfPresent(Bool.self, forKey: .isAnimated) { + self.isAnimated = isAnimated + } + + if let hidesForSinglePage = try typeContainer.decodeIfPresent(Bool.self, forKey: .hidesForSinglePage) { + self.hidesForSinglePage = hidesForSinglePage + } + + if let accessibilityHasSlidesInsteadOfPage = try typeContainer.decodeIfPresent(Bool.self, forKey: .accessibilityHasSlidesInsteadOfPage) { + self.accessibilityHasSlidesInsteadOfPage = accessibilityHasSlidesInsteadOfPage + } + + if let isEnabled = try typeContainer.decodeIfPresent(Bool.self, forKey: .isEnabled) { + self.isEnabled = isEnabled + } + + if let disabledIndicatorColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledIndicatorColor) { + self.disabledIndicatorColor = disabledIndicatorColor + } + + if let indicatorColor = try typeContainer.decodeIfPresent(Color.self, forKey: .indicatorColor) { + self.indicatorColor = indicatorColor + } + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encodeIfPresent(moleculeName, forKey: .moleculeName) + try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) + try container.encode(numberOfPages, forKey: .numberOfPages) + try container.encode(currentIndex, forKey: .currentIndex) + try container.encode(alwaysSendAction, forKey: .alwaysSendAction) + try container.encode(isAnimated, forKey: .isAnimated) + try container.encodeIfPresent(hidesForSinglePage, forKey: .hidesForSinglePage) + try container.encodeIfPresent(accessibilityHasSlidesInsteadOfPage, forKey: .accessibilityHasSlidesInsteadOfPage) + try container.encode(isEnabled, forKey: .isEnabled) + try container.encode(disabledIndicatorColor, forKey: .disabledIndicatorColor) + try container.encode(indicatorColor, forKey: .indicatorColor) + try container.encodeIfPresent(position, forKey: .position) + } +} diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericCarouselIndicatorModel.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericCarouselIndicatorModel.swift new file mode 100644 index 00000000..2b454fc8 --- /dev/null +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericCarouselIndicatorModel.swift @@ -0,0 +1,19 @@ +// +// NumericCarouselIndicatorModel.swift +// MVMCoreUI +// +// Created by Kevin Christiano on 3/3/20. +// Copyright © 2020 Verizon Wireless. All rights reserved. +// + +import UIKit + +open class NumericCarouselIndicatorModel: CarouselIndicatorModel { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + + public class override var identifier: String { + return "numericCarouselIndicator" + } +} diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift new file mode 100644 index 00000000..8cd9e05c --- /dev/null +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift @@ -0,0 +1,131 @@ +// +// NumericIndicatorView.swift +// MVMCoreUI +// +// Created by Kevin Christiano on 2/3/20. +// Copyright © 2020 Verizon Wireless. All rights reserved. +// + +import UIKit + + +open class NumericIndicatorView: CarouselIndicator { + //-------------------------------------------------- + // MARK: - Outlets + //-------------------------------------------------- + + /// Text to display the current count of total pages for viewing. + open var pageCount: Label = { + let label = Label.commonLabelB2(true) + label.setContentCompressionResistancePriority(.required, for: .vertical) + label.textAlignment = .center + return label + }() + + let leftArrow: Arrow = { + let arrow = Arrow(model: ArrowModel(), degrees: 180) + arrow.pinHeightAndWidth() + return arrow + }() + + let rightArrow: Arrow = { + let arrow = Arrow(model: ArrowModel()) + arrow.pinHeightAndWidth() + return arrow + }() + + //-------------------------------------------------- + // MARK: - Computed Properties + //-------------------------------------------------- + + open override var isEnabled: Bool { + didSet { + pageCount.textColor = isEnabled ? indicatorColor : disabledIndicatorColor + leftArrow.tintColor = isEnabled ? indicatorColor : disabledIndicatorColor + rightArrow.tintColor = isEnabled ? indicatorColor : disabledIndicatorColor + } + } + + /// Sets the color for pageCount text, left arrow and right arrow. + public override var indicatorColor: UIColor { + get { return _indicatorColor } + set (newColor) { + super.indicatorColor = newColor + + if isEnabled { + pageCount.textColor = newColor + leftArrow.tintColor = newColor + rightArrow.tintColor = newColor + } + } + } + + //-------------------------------------------------- + // MARK: - Initializers + //-------------------------------------------------- + + public override init(frame: CGRect) { + super.init(frame: .zero) + } + + public convenience init() { + self.init(frame: .zero) + } + + public required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + //-------------------------------------------------- + // MARK: - Lifecycle + //-------------------------------------------------- + + open override func updateView(_ size: CGFloat) { + super.updateView(size) + pageCount.updateView(size) + } + + //-------------------------------------------------- + // MARK: - Setup + //-------------------------------------------------- + + open override func setupView() { + super.setupView() + + isUserInteractionEnabled = false + addSubview(pageCount) + addSubview(leftArrow) + addSubview(rightArrow) + + NSLayoutConstraint.activate([ + pageCount.centerXAnchor.constraint(equalTo: centerXAnchor), + pageCount.topAnchor.constraint(equalTo: topAnchor), + bottomAnchor.constraint(equalTo: pageCount.bottomAnchor), + leftArrow.centerYAnchor.constraint(equalTo: centerYAnchor), + rightArrow.centerYAnchor.constraint(equalTo: centerYAnchor), + leftArrow.leadingAnchor.constraint(equalTo: leadingAnchor), + pageCount.leadingAnchor.constraint(equalTo: leftArrow.trailingAnchor, constant: PaddingOne), + rightArrow.leadingAnchor.constraint(equalTo: pageCount.trailingAnchor, constant: PaddingOne), + trailingAnchor.constraint(equalTo: rightArrow.trailingAnchor) + ]) + } + + public override func assessTouchOf(_ touchPoint_X: CGFloat) { + + if touchPoint_X > bounds.width / 2 { + incrementCurrentIndex() + } else { + decrementCurrentIndex() + } + } + + //-------------------------------------------------- + // MARK: - IndicatorViewProtocol + //-------------------------------------------------- + + open override func updateUI(previousIndex oldIndex: Int, newIndex: Int, totalCount: Int, isAnimated: Bool) { + + pageCount.text = "\(newIndex + 1)/\(totalCount)" + layoutIfNeeded() + } +} diff --git a/MVMCoreUI/Atomic/Organisms/Carousel.swift b/MVMCoreUI/Atomic/Organisms/Carousel.swift index 107e15e5..b79cbc03 100644 --- a/MVMCoreUI/Atomic/Organisms/Carousel.swift +++ b/MVMCoreUI/Atomic/Organisms/Carousel.swift @@ -179,7 +179,7 @@ open class Carousel: View { var pagingView: (UIView & CarouselPageControlProtocol)? = nil if let molecule = molecule { - pagingView = MoleculeObjectMapping.shared()?.createMolecule(molecule, delegateObject: delegateObject) as? (UIView & MVMCoreUIPagingProtocol) + pagingView = MoleculeObjectMapping.shared()?.createMolecule(molecule, delegateObject: delegateObject) as? (UIView & MVMCoreUIPagingProtocol) as! (UIView & CarouselPageControlProtocol) } addPaging(view: pagingView, position: (CGFloat(molecule?.position ?? 20))) diff --git a/MVMCoreUI/BaseClasses/StackView.swift b/MVMCoreUI/BaseClasses/StackView.swift deleted file mode 100644 index 4ca167c6..00000000 --- a/MVMCoreUI/BaseClasses/StackView.swift +++ /dev/null @@ -1,100 +0,0 @@ -// -// File.swift -// MVMCoreUI -// -// Created by Kevin Christiano on 1/31/20. -// Copyright © 2020 Verizon Wireless. All rights reserved. -// - -import Foundation - - -open class StackView: UIStackView, ModelMoleculeViewProtocol { - //-------------------------------------------------- - // MARK: - Properties - //-------------------------------------------------- - - open var json: [AnyHashable: Any]? - open var model: MoleculeModelProtocol? - - private var initialSetupPerformed = false - - //-------------------------------------------------- - // MARK: - Initialization - //-------------------------------------------------- - - public override init(frame: CGRect) { - super.init(frame: .zero) - initialSetup() - } - - public convenience init() { - self.init(frame: .zero) - } - - public required init(coder: NSCoder) { - super.init(coder: coder) - initialSetup() - } - - public func initialSetup() { - if !initialSetupPerformed { - initialSetupPerformed = true - setupView() - } - } - - //-------------------------------------------------- - // MARK: - ModelMoleculeViewProtocol - //-------------------------------------------------- - - open func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { - self.model = model - if let backgroundColor = model.backgroundColor { - self.backgroundColor = backgroundColor.uiColor - } - } - - open class func nameForReuse(_ model: MoleculeModelProtocol?, _ delegateObject: MVMCoreUIDelegateObject?) -> String? { - return model?.moleculeName - } - - open class func estimatedHeight(forRow molecule: MoleculeModelProtocol?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat? { - return nil - } - - open class func requiredModules(_ molecule: MoleculeModelProtocol?, delegateObject: MVMCoreUIDelegateObject?, error: AutoreleasingUnsafeMutablePointer?) -> [String]? { - return nil - } -} - -// MARK:- MVMCoreViewProtocol -extension StackView: MVMCoreViewProtocol { - - open func updateView(_ size: CGFloat) {} - - /// Will be called only once. - open func setupView() { - translatesAutoresizingMaskIntoConstraints = false - insetsLayoutMarginsFromSafeArea = false - MVMCoreUIUtility.setMarginsFor(self, leading: 0, top: 0, trailing: 0, bottom: 0) - } -} - -// MARK:- MVMCoreUIMoleculeViewProtocol -extension StackView: MVMCoreUIMoleculeViewProtocol { - - open func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) { - self.json = json - - if let backgroundColorString = json?.optionalStringForKey(KeyBackgroundColor) { - backgroundColor = UIColor.mfGet(forHex: backgroundColorString) - } - } - - open func reset() { - backgroundColor = .clear - } - - open func setAsMolecule() { } -} From 290b5276b2f202073581ea3b7cb01bbd118d49ec Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Mon, 30 Mar 2020 16:17:14 -0400 Subject: [PATCH 25/78] adding again --- MVMCoreUI.xcodeproj/project.pbxproj | 8 ++++---- MVMCoreUI/Atomic/MoleculeObjectMapping.swift | 2 ++ MVMCoreUI/Atomic/Organisms/Carousel.swift | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/MVMCoreUI.xcodeproj/project.pbxproj b/MVMCoreUI.xcodeproj/project.pbxproj index c079b212..92430680 100644 --- a/MVMCoreUI.xcodeproj/project.pbxproj +++ b/MVMCoreUI.xcodeproj/project.pbxproj @@ -879,12 +879,12 @@ 0A30D3DC2432741A00124AF0 /* CarouselIndicator */ = { isa = PBXGroup; children = ( - 0A30D3DD2432741A00124AF0 /* BarsCarouselIndicatorModel.swift */, - 0A30D3DE2432741A00124AF0 /* NumericCarouselIndicatorModel.swift */, - 0A30D3DF2432741A00124AF0 /* NumericIndicatorView.swift */, - 0A30D3E02432741A00124AF0 /* BarsIndicatorView.swift */, 0A30D3E12432741A00124AF0 /* CarouselIndicatorModel.swift */, 0A30D3E22432741A00124AF0 /* CarouselIndicator.swift */, + 0A30D3DE2432741A00124AF0 /* NumericCarouselIndicatorModel.swift */, + 0A30D3DF2432741A00124AF0 /* NumericIndicatorView.swift */, + 0A30D3DD2432741A00124AF0 /* BarsCarouselIndicatorModel.swift */, + 0A30D3E02432741A00124AF0 /* BarsIndicatorView.swift */, ); name = CarouselIndicator; path = ../../../../../../../mvmrc_ios/mvm_core_ui/MVMCoreUI/Atoms/Views/CarouselIndicator; diff --git a/MVMCoreUI/Atomic/MoleculeObjectMapping.swift b/MVMCoreUI/Atomic/MoleculeObjectMapping.swift index bfa6db01..766db94d 100644 --- a/MVMCoreUI/Atomic/MoleculeObjectMapping.swift +++ b/MVMCoreUI/Atomic/MoleculeObjectMapping.swift @@ -123,6 +123,8 @@ import Foundation // Other Organisms MoleculeObjectMapping.shared()?.register(viewClass: Carousel.self, viewModelClass: CarouselModel.self) + MoleculeObjectMapping.shared()?.register(viewClass: BarsIndicatorView.self, viewModelClass: BarsCarouselIndicatorModel.self) + MoleculeObjectMapping.shared()?.register(viewClass: NumericIndicatorView.self, viewModelClass: NumericCarouselIndicatorModel.self) // Designed List Items MoleculeObjectMapping.shared()?.register(viewClass: ListLeftVariableIconWithRightCaret.self, viewModelClass: ListLeftVariableIconWithRightCaretModel.self) diff --git a/MVMCoreUI/Atomic/Organisms/Carousel.swift b/MVMCoreUI/Atomic/Organisms/Carousel.swift index b79cbc03..a45eaf72 100644 --- a/MVMCoreUI/Atomic/Organisms/Carousel.swift +++ b/MVMCoreUI/Atomic/Organisms/Carousel.swift @@ -179,7 +179,7 @@ open class Carousel: View { var pagingView: (UIView & CarouselPageControlProtocol)? = nil if let molecule = molecule { - pagingView = MoleculeObjectMapping.shared()?.createMolecule(molecule, delegateObject: delegateObject) as? (UIView & MVMCoreUIPagingProtocol) as! (UIView & CarouselPageControlProtocol) + pagingView = MoleculeObjectMapping.shared()?.createMolecule(molecule, delegateObject: delegateObject) as? (UIView & CarouselPageControlProtocol) } addPaging(view: pagingView, position: (CGFloat(molecule?.position ?? 20))) From 94a8ac405eb34bc96174dcaee4e7c42c5d544314 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 31 Mar 2020 09:16:32 -0400 Subject: [PATCH 26/78] readding? --- MVMCoreUI.xcodeproj/project.pbxproj | 65 +++++++++---------- .../CarouselIndicator/BarsIndicatorView.swift | 5 +- 2 files changed, 35 insertions(+), 35 deletions(-) diff --git a/MVMCoreUI.xcodeproj/project.pbxproj b/MVMCoreUI.xcodeproj/project.pbxproj index 92430680..ab4db4c1 100644 --- a/MVMCoreUI.xcodeproj/project.pbxproj +++ b/MVMCoreUI.xcodeproj/project.pbxproj @@ -84,12 +84,6 @@ 0A21DB8E235E06EF00C160A2 /* MFDigitTextField.xib in Resources */ = {isa = PBXBuildFile; fileRef = D29DF24A21E6A177003B2FB9 /* MFDigitTextField.xib */; }; 0A21DB91235E0EDB00C160A2 /* DigitBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A8321AE2355FE9500CB7F00 /* DigitBox.swift */; }; 0A21DB94235E24ED00C160A2 /* DigitEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A21DB93235E24ED00C160A2 /* DigitEntryField.swift */; }; - 0A30D3E32432741A00124AF0 /* BarsCarouselIndicatorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A30D3DD2432741A00124AF0 /* BarsCarouselIndicatorModel.swift */; }; - 0A30D3E42432741A00124AF0 /* NumericCarouselIndicatorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A30D3DE2432741A00124AF0 /* NumericCarouselIndicatorModel.swift */; }; - 0A30D3E52432741A00124AF0 /* NumericIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A30D3DF2432741A00124AF0 /* NumericIndicatorView.swift */; }; - 0A30D3E62432741A00124AF0 /* BarsIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A30D3E02432741A00124AF0 /* BarsIndicatorView.swift */; }; - 0A30D3E72432741A00124AF0 /* CarouselIndicatorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A30D3E12432741A00124AF0 /* CarouselIndicatorModel.swift */; }; - 0A30D3E82432741A00124AF0 /* CarouselIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A30D3E22432741A00124AF0 /* CarouselIndicator.swift */; }; 0A41BA6E2344FCD400D4C0BC /* CATransaction+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A41BA6D2344FCD400D4C0BC /* CATransaction+Extension.swift */; }; 0A41BA7F23453A6400D4C0BC /* TextEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A41BA7E23453A6400D4C0BC /* TextEntryField.swift */; }; 0A5D59C223AD2F5700EFD9E9 /* AppleGuidelinesProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A5D59C123AD2F5700EFD9E9 /* AppleGuidelinesProtocol.swift */; }; @@ -104,6 +98,12 @@ 0A7EF86323D8AFA000B2AAD1 /* BaseDropdownEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF86223D8AFA000B2AAD1 /* BaseDropdownEntryFieldModel.swift */; }; 0A7EF86523D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF86423D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift */; }; 0A7EF86723D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF86623D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift */; }; + 0A9D091D2433796500D2E6C0 /* BarsCarouselIndicatorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A9D09172433796500D2E6C0 /* BarsCarouselIndicatorModel.swift */; }; + 0A9D091E2433796500D2E6C0 /* NumericCarouselIndicatorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A9D09182433796500D2E6C0 /* NumericCarouselIndicatorModel.swift */; }; + 0A9D091F2433796500D2E6C0 /* NumericIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A9D09192433796500D2E6C0 /* NumericIndicatorView.swift */; }; + 0A9D09202433796500D2E6C0 /* BarsIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A9D091A2433796500D2E6C0 /* BarsIndicatorView.swift */; }; + 0A9D09212433796500D2E6C0 /* CarouselIndicatorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A9D091B2433796500D2E6C0 /* CarouselIndicatorModel.swift */; }; + 0A9D09222433796500D2E6C0 /* CarouselIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A9D091C2433796500D2E6C0 /* CarouselIndicator.swift */; }; 0AA33B3A2398524F0067DD0F /* Toggle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AA33B392398524F0067DD0F /* Toggle.swift */; }; 0ABD136D237CAD1E0081388D /* DateDropdownEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ABD136C237CAD1E0081388D /* DateDropdownEntryField.swift */; }; 0ABD1371237DB0450081388D /* ItemDropdownEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ABD1370237DB0450081388D /* ItemDropdownEntryField.swift */; }; @@ -471,12 +471,6 @@ 0A21DB7E235DECC500C160A2 /* EntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EntryField.swift; sourceTree = ""; }; 0A21DB82235DFBC500C160A2 /* MdnEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MdnEntryField.swift; sourceTree = ""; }; 0A21DB93235E24ED00C160A2 /* DigitEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DigitEntryField.swift; sourceTree = ""; }; - 0A30D3DD2432741A00124AF0 /* BarsCarouselIndicatorModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BarsCarouselIndicatorModel.swift; sourceTree = ""; }; - 0A30D3DE2432741A00124AF0 /* NumericCarouselIndicatorModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NumericCarouselIndicatorModel.swift; sourceTree = ""; }; - 0A30D3DF2432741A00124AF0 /* NumericIndicatorView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NumericIndicatorView.swift; sourceTree = ""; }; - 0A30D3E02432741A00124AF0 /* BarsIndicatorView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BarsIndicatorView.swift; sourceTree = ""; }; - 0A30D3E12432741A00124AF0 /* CarouselIndicatorModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CarouselIndicatorModel.swift; sourceTree = ""; }; - 0A30D3E22432741A00124AF0 /* CarouselIndicator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CarouselIndicator.swift; sourceTree = ""; }; 0A41BA6D2344FCD400D4C0BC /* CATransaction+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CATransaction+Extension.swift"; sourceTree = ""; }; 0A41BA7E23453A6400D4C0BC /* TextEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextEntryField.swift; sourceTree = ""; }; 0A5D59C123AD2F5700EFD9E9 /* AppleGuidelinesProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppleGuidelinesProtocol.swift; sourceTree = ""; }; @@ -494,6 +488,12 @@ 0A7EF86423D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemDropdownEntryFieldModel.swift; sourceTree = ""; }; 0A7EF86623D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateDropdownEntryFieldModel.swift; sourceTree = ""; }; 0A8321AE2355FE9500CB7F00 /* DigitBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DigitBox.swift; sourceTree = ""; }; + 0A9D09172433796500D2E6C0 /* BarsCarouselIndicatorModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BarsCarouselIndicatorModel.swift; sourceTree = ""; }; + 0A9D09182433796500D2E6C0 /* NumericCarouselIndicatorModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NumericCarouselIndicatorModel.swift; sourceTree = ""; }; + 0A9D09192433796500D2E6C0 /* NumericIndicatorView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NumericIndicatorView.swift; sourceTree = ""; }; + 0A9D091A2433796500D2E6C0 /* BarsIndicatorView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BarsIndicatorView.swift; sourceTree = ""; }; + 0A9D091B2433796500D2E6C0 /* CarouselIndicatorModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CarouselIndicatorModel.swift; sourceTree = ""; }; + 0A9D091C2433796500D2E6C0 /* CarouselIndicator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CarouselIndicator.swift; sourceTree = ""; }; 0AA33B33239813C50067DD0F /* UIColor+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+Extension.swift"; sourceTree = ""; }; 0AA33B392398524F0067DD0F /* Toggle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Toggle.swift; sourceTree = ""; }; 0ABD136C237CAD1E0081388D /* DateDropdownEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateDropdownEntryField.swift; sourceTree = ""; }; @@ -876,20 +876,6 @@ path = FormUIHelpers; sourceTree = ""; }; - 0A30D3DC2432741A00124AF0 /* CarouselIndicator */ = { - isa = PBXGroup; - children = ( - 0A30D3E12432741A00124AF0 /* CarouselIndicatorModel.swift */, - 0A30D3E22432741A00124AF0 /* CarouselIndicator.swift */, - 0A30D3DE2432741A00124AF0 /* NumericCarouselIndicatorModel.swift */, - 0A30D3DF2432741A00124AF0 /* NumericIndicatorView.swift */, - 0A30D3DD2432741A00124AF0 /* BarsCarouselIndicatorModel.swift */, - 0A30D3E02432741A00124AF0 /* BarsIndicatorView.swift */, - ); - name = CarouselIndicator; - path = ../../../../../../../mvmrc_ios/mvm_core_ui/MVMCoreUI/Atoms/Views/CarouselIndicator; - sourceTree = ""; - }; 0A5D59C323AD488600EFD9E9 /* Protocols */ = { isa = PBXGroup; children = ( @@ -898,6 +884,19 @@ path = Protocols; sourceTree = ""; }; + 0A9D09162433796500D2E6C0 /* CarouselIndicator */ = { + isa = PBXGroup; + children = ( + 0A9D09172433796500D2E6C0 /* BarsCarouselIndicatorModel.swift */, + 0A9D09182433796500D2E6C0 /* NumericCarouselIndicatorModel.swift */, + 0A9D09192433796500D2E6C0 /* NumericIndicatorView.swift */, + 0A9D091A2433796500D2E6C0 /* BarsIndicatorView.swift */, + 0A9D091B2433796500D2E6C0 /* CarouselIndicatorModel.swift */, + 0A9D091C2433796500D2E6C0 /* CarouselIndicator.swift */, + ); + path = CarouselIndicator; + sourceTree = ""; + }; 0ABD1369237B18EE0081388D /* Views */ = { isa = PBXGroup; children = ( @@ -1518,7 +1517,7 @@ D29DF17D21E69E26003B2FB9 /* Views */ = { isa = PBXGroup; children = ( - 0A30D3DC2432741A00124AF0 /* CarouselIndicator */, + 0A9D09162433796500D2E6C0 /* CarouselIndicator */, 9445890B2385BCE300DE9FD4 /* ProgressBarModel.swift */, 01509D922327ECFB00EF99AA /* ProgressBar.swift */, 9445890D2385C3F800DE9FD4 /* MultiProgressModel.swift */, @@ -1926,6 +1925,7 @@ D27CD40E2322EEAF00C1DC07 /* TabsTableViewCell.swift in Sources */, D224799B231965AD003FCCF9 /* AccordionMoleculeTableViewCell.swift in Sources */, D22D1F1F220343560077CEC0 /* MVMCoreUICheckMarkView.m in Sources */, + 0A9D09202433796500D2E6C0 /* BarsIndicatorView.swift in Sources */, D2E2A99423D8CCBC000B42E6 /* HeadlineBodyLinkModel.swift in Sources */, 01004F3022721C3800991ECC /* RadioButton.swift in Sources */, D268C70E238C22D7007F2C1C /* DropDownFilterTableViewCell.swift in Sources */, @@ -1977,6 +1977,7 @@ D29DF27621E79E81003B2FB9 /* MVMCoreUILoggingHandler.m in Sources */, C695A69623C990BC00BFB94E /* DoughnutChart.swift in Sources */, 014AA72D23C5059B006F3E93 /* StackPageTemplateModel.swift in Sources */, + 0A9D091F2433796500D2E6C0 /* NumericIndicatorView.swift in Sources */, D260106123D0C02A00764D80 /* StackItemModelProtocol.swift in Sources */, 0AE98BAF23FEF956004C5109 /* ExternalLink.swift in Sources */, 012A88C4238D86E600FE3DA1 /* CarouselItemModelProtocol.swift in Sources */, @@ -1985,7 +1986,6 @@ D22D8395241FB41200D3DF69 /* UIStackView+Extension.swift in Sources */, 52B201D324081CFB00D2011E /* ListLeftVariableRadioButtonAndPaymentMethodModel.swift in Sources */, 525239C02407BCFF00454969 /* ListTwoColumnPriceDetailsModel.swift in Sources */, - 0A30D3E72432741A00124AF0 /* CarouselIndicatorModel.swift in Sources */, D2E2A99A23D8D6B4000B42E6 /* HeadlineBodyButtonModel.swift in Sources */, D202AFE6242A6A9C00E5BEDF /* UICollectionViewScrollPosition+Extension.swift in Sources */, 8D084AD22410BF7600951227 /* ListOneColumnFullWidthTextBodyText.swift in Sources */, @@ -2012,9 +2012,10 @@ D2A514672213885800345BFB /* MoleculeHeaderView.swift in Sources */, D29E28D823D21AB800ACEA85 /* StringAndMoleculeView.swift in Sources */, 01EB369023609801006832FA /* MoleculeListItemModel.swift in Sources */, + 0A9D09212433796500D2E6C0 /* CarouselIndicatorModel.swift in Sources */, D28A838323CCBD3F00DFE4FC /* CircleProgressModel.swift in Sources */, - 0A30D3E82432741A00124AF0 /* CarouselIndicator.swift in Sources */, D268C70C2386DFFD007F2C1C /* MoleculeStackItemModel.swift in Sources */, + 0A9D091D2433796500D2E6C0 /* BarsCarouselIndicatorModel.swift in Sources */, DBEFFA04225A829700230692 /* Label.swift in Sources */, D2D6CD4022E78C1A00D701B8 /* Scroller.swift in Sources */, 0A7EF85F23D8ABC500B2AAD1 /* MdnEntryFieldModel.swift in Sources */, @@ -2045,6 +2046,7 @@ D29DF2EF21ECEAE1003B2FB9 /* MFFonts.m in Sources */, D22479942316AE5E003FCCF9 /* NSLayoutConstraintExtension.swift in Sources */, D2B18B94236214AD00A9AEDC /* NavigationController.swift in Sources */, + 0A9D09222433796500D2E6C0 /* CarouselIndicator.swift in Sources */, D29E28DA23D21AFA00ACEA85 /* StringAndMoleculeModel.swift in Sources */, D282AACB2243C61700C46919 /* ButtonView.swift in Sources */, D260105D23D0BCD400764D80 /* Stack.swift in Sources */, @@ -2078,7 +2080,6 @@ 94C2D9842386F3F80006CF46 /* LabelAttributeModel.swift in Sources */, 944589212385D6E900DE9FD4 /* DashLineModel.swift in Sources */, D2E2A99623D8CF85000B42E6 /* HeadlineBodyLinkToggleModel.swift in Sources */, - 0A30D3E52432741A00124AF0 /* NumericIndicatorView.swift in Sources */, C6FA7D5323C77A4A00A3614A /* StringAndMoleculeStack.swift in Sources */, 011D958524042432000E3791 /* RulesProtocol.swift in Sources */, 94AF4A3F23E9D13900676048 /* MFCaretButton.m in Sources */, @@ -2089,6 +2090,7 @@ D28A838F23CCDEDE00DFE4FC /* TwoButtonViewModel.swift in Sources */, D2D90B42240463E100DD6EC9 /* MoleculeHeaderModel.swift in Sources */, 012A88B1238C880100FE3DA1 /* CarouselPagingModelProtocol.swift in Sources */, + 0A9D091E2433796500D2E6C0 /* NumericCarouselIndicatorModel.swift in Sources */, D29DF2C921E7BFC6003B2FB9 /* MFSizeObject.m in Sources */, 9445890E2385C3F800DE9FD4 /* MultiProgressModel.swift in Sources */, 011D95A5240455DC000E3791 /* FormGroupRule.swift in Sources */, @@ -2106,7 +2108,6 @@ 8D084AD02410BF4800951227 /* ListOneColumnFullWidthTextBodyTextModel.swift in Sources */, 0ABD1371237DB0450081388D /* ItemDropdownEntryField.swift in Sources */, 8D24041123E7FB9E009E23BE /* ListLeftVariableIconWithRightCaret.swift in Sources */, - 0A30D3E42432741A00124AF0 /* NumericCarouselIndicatorModel.swift in Sources */, D2E1FAE12268E81D00AEFD8C /* MoleculeListTemplate.swift in Sources */, 525019E72406853600EED91C /* ListFourColumnDataUsageDivider.swift in Sources */, 0AE98BB323FF0934004C5109 /* ExternalLinkModel.swift in Sources */, @@ -2136,7 +2137,6 @@ D29DF29821E7ADB8003B2FB9 /* MFScrollingViewController.m in Sources */, D28A839323CE828900DFE4FC /* HeadlineBodyCaretLinkImageModel.swift in Sources */, D29770C821F7C4AE00B2F0D0 /* TopLabelsView.m in Sources */, - 0A30D3E32432741A00124AF0 /* BarsCarouselIndicatorModel.swift in Sources */, D260105F23D0BFFC00764D80 /* StackItem.swift in Sources */, 9432A79F23DB47BA00719041 /* EntryFieldContainer.swift in Sources */, 01EB369323609801006832FA /* HeaderModel.swift in Sources */, @@ -2164,7 +2164,6 @@ D2A5146122121FBF00345BFB /* MoleculeStackTemplate.swift in Sources */, D2E2A9A323E096B1000B42E6 /* DisableableModelProtocol.swift in Sources */, D29DF11821E6805F003B2FB9 /* NSLayoutConstraint+MFConvenience.m in Sources */, - 0A30D3E62432741A00124AF0 /* BarsIndicatorView.swift in Sources */, 94C2D9A323872C110006CF46 /* LabelAttributeStrikeThroughModel.swift in Sources */, D28A838523CCCA8900DFE4FC /* ScrollerModel.swift in Sources */, D29DF26C21E6AA0B003B2FB9 /* FLAnimatedImage.m in Sources */, diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift index 5724a76e..8ac95ed0 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift @@ -14,8 +14,9 @@ open class BarsIndicatorView: CarouselIndicator { // MARK: - Stored Properties //-------------------------------------------------- - public let stackView: StackView = { - let stackView = StackView() + public let stackView: UIStackView = { + let stackView = UIStackView() + stackView.translatesAutoresizingMaskIntoConstraints = false stackView.axis = .horizontal stackView.alignment = .bottom stackView.distribution = .equalSpacing From 2e418760060a299b4cdbda65a1450cb7275d3c45 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 31 Mar 2020 10:21:42 -0400 Subject: [PATCH 27/78] revised due to registry limitations --- .../CarouselIndicator/BarsIndicatorView.swift | 12 ------------ .../CarouselIndicatorModel.swift | 2 +- .../CarouselIndicator/NumericIndicatorView.swift | 16 ---------------- MVMCoreUI/Atomic/Organisms/Carousel.swift | 4 ++-- MVMCoreUI/Atomic/Organisms/CarouselModel.swift | 2 +- .../CarouselPagingModelProtocol.swift | 2 +- 6 files changed, 5 insertions(+), 33 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift index 8ac95ed0..89a06e9e 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift @@ -74,18 +74,6 @@ open class BarsIndicatorView: CarouselIndicator { } } - //-------------------------------------------------- - // MARK: - Initializers - //-------------------------------------------------- - - public init() { - super.init(frame: .zero) - } - - public required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - //-------------------------------------------------- // MARK: - Setup //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift index 75e5ed58..206e67de 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift @@ -9,7 +9,7 @@ import Foundation -open class CarouselIndicatorModel: CarouselPagingModelProtocol { +open class CarouselIndicatorModel: CarouselPagingModelProtocol, MoleculeModelProtocol { //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift index 8cd9e05c..12d350e0 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift @@ -60,22 +60,6 @@ open class NumericIndicatorView: CarouselIndicator { } } - //-------------------------------------------------- - // MARK: - Initializers - //-------------------------------------------------- - - public override init(frame: CGRect) { - super.init(frame: .zero) - } - - public convenience init() { - self.init(frame: .zero) - } - - public required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - //-------------------------------------------------- // MARK: - Lifecycle //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Organisms/Carousel.swift b/MVMCoreUI/Atomic/Organisms/Carousel.swift index a45eaf72..7e529ae2 100644 --- a/MVMCoreUI/Atomic/Organisms/Carousel.swift +++ b/MVMCoreUI/Atomic/Organisms/Carousel.swift @@ -125,7 +125,7 @@ open class Carousel: View { collectionViewHeight?.isActive = true } - setupPagingMolecule(carouselModel.pagingMolecule, delegateObject: delegateObject) + setupPagingMolecule((carouselModel.pagingMolecule as! (CarouselPagingModelProtocol & MoleculeModelProtocol)), delegateObject: delegateObject) collectionView.reloadData() } @@ -174,7 +174,7 @@ open class Carousel: View { } /// Sets up the paging molecule - open func setupPagingMolecule(_ molecule: CarouselPagingModelProtocol?, delegateObject: MVMCoreUIDelegateObject?) { + open func setupPagingMolecule(_ molecule: (MoleculeModelProtocol & CarouselPagingModelProtocol)?, delegateObject: MVMCoreUIDelegateObject?) { var pagingView: (UIView & CarouselPageControlProtocol)? = nil diff --git a/MVMCoreUI/Atomic/Organisms/CarouselModel.swift b/MVMCoreUI/Atomic/Organisms/CarouselModel.swift index b117b4ba..6f7d1a88 100644 --- a/MVMCoreUI/Atomic/Organisms/CarouselModel.swift +++ b/MVMCoreUI/Atomic/Organisms/CarouselModel.swift @@ -27,7 +27,7 @@ import UIKit public var height: Float? public var itemWidthPercent: Float? public var itemAlignment: UICollectionView.ScrollPosition? - public var pagingMolecule: CarouselPagingModelProtocol? + public var pagingMolecule: MoleculeModelProtocol? //-------------------------------------------------- // MARK: - Initializer diff --git a/MVMCoreUI/Atomic/Protocols/ModelProtocols/CarouselPagingModelProtocol.swift b/MVMCoreUI/Atomic/Protocols/ModelProtocols/CarouselPagingModelProtocol.swift index 94b1277a..72138290 100644 --- a/MVMCoreUI/Atomic/Protocols/ModelProtocols/CarouselPagingModelProtocol.swift +++ b/MVMCoreUI/Atomic/Protocols/ModelProtocols/CarouselPagingModelProtocol.swift @@ -9,6 +9,6 @@ import Foundation -public protocol CarouselPagingModelProtocol: MoleculeModelProtocol { +public protocol CarouselPagingModelProtocol { var position: Float? { get } } From d19653557f2ebddd2795f4bbaa71061e2b87bab9 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 31 Mar 2020 10:30:13 -0400 Subject: [PATCH 28/78] organized files --- MVMCoreUI.xcodeproj/project.pbxproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/MVMCoreUI.xcodeproj/project.pbxproj b/MVMCoreUI.xcodeproj/project.pbxproj index ab4db4c1..e62e99f5 100644 --- a/MVMCoreUI.xcodeproj/project.pbxproj +++ b/MVMCoreUI.xcodeproj/project.pbxproj @@ -887,12 +887,12 @@ 0A9D09162433796500D2E6C0 /* CarouselIndicator */ = { isa = PBXGroup; children = ( - 0A9D09172433796500D2E6C0 /* BarsCarouselIndicatorModel.swift */, - 0A9D09182433796500D2E6C0 /* NumericCarouselIndicatorModel.swift */, - 0A9D09192433796500D2E6C0 /* NumericIndicatorView.swift */, - 0A9D091A2433796500D2E6C0 /* BarsIndicatorView.swift */, 0A9D091B2433796500D2E6C0 /* CarouselIndicatorModel.swift */, 0A9D091C2433796500D2E6C0 /* CarouselIndicator.swift */, + 0A9D09172433796500D2E6C0 /* BarsCarouselIndicatorModel.swift */, + 0A9D091A2433796500D2E6C0 /* BarsIndicatorView.swift */, + 0A9D09182433796500D2E6C0 /* NumericCarouselIndicatorModel.swift */, + 0A9D09192433796500D2E6C0 /* NumericIndicatorView.swift */, ); path = CarouselIndicator; sourceTree = ""; From 2037cbba826af6ffe5029acff76959e48e1bc801 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 31 Mar 2020 14:24:20 -0400 Subject: [PATCH 29/78] latest carousel --- .../CarouselIndicator/CarouselIndicator.swift | 1 + .../CarouselIndicatorModel.swift | 8 +--- .../NumericCarouselIndicatorModel.swift | 1 + MVMCoreUI/Atomic/Organisms/Carousel.swift | 17 +++----- .../Atomic/Organisms/CarouselModel.swift | 43 +++++++++++++------ 5 files changed, 41 insertions(+), 29 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift index 1e4db496..0604d3a0 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift @@ -58,6 +58,7 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { } } + /// The maxmum count of pages before the indicatorView forces a Numeric Indicator in place of Bar. private var _numberOfPages = 0 /// Holds the total number of pages displayed by the carousel. diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift index 206e67de..3705beaa 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift @@ -15,13 +15,11 @@ open class CarouselIndicatorModel: CarouselPagingModelProtocol, MoleculeModelPro //-------------------------------------------------- public class var identifier: String { - return "" + return "barsCarouselIndicator" } public var backgroundColor: Color? public var moleculeName: String? - - /// The maxmum count of pages before the indicatorView forces a Numeric Indicator in place of Bar. public var numberOfPages: Int = 0 // Sets the current Index to focus on. @@ -67,10 +65,6 @@ open class CarouselIndicatorModel: CarouselPagingModelProtocol, MoleculeModelPro moleculeName = try typeContainer.decodeIfPresent(String.self, forKey: .moleculeName) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) - if let numberOfPages = try typeContainer.decodeIfPresent(Int.self, forKey: .numberOfPages) { - self.numberOfPages = numberOfPages - } - if let currentIndex = try typeContainer.decodeIfPresent(Int.self, forKey: .currentIndex) { self.currentIndex = currentIndex } diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericCarouselIndicatorModel.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericCarouselIndicatorModel.swift index 2b454fc8..7739dc12 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericCarouselIndicatorModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericCarouselIndicatorModel.swift @@ -8,6 +8,7 @@ import UIKit + open class NumericCarouselIndicatorModel: CarouselIndicatorModel { //-------------------------------------------------- // MARK: - Properties diff --git a/MVMCoreUI/Atomic/Organisms/Carousel.swift b/MVMCoreUI/Atomic/Organisms/Carousel.swift index 7e529ae2..215f9c12 100644 --- a/MVMCoreUI/Atomic/Organisms/Carousel.swift +++ b/MVMCoreUI/Atomic/Organisms/Carousel.swift @@ -105,25 +105,22 @@ open class Carousel: View { public override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { self.delegateObject = delegateObject super.set(with: model, delegateObject, additionalData) + guard let carouselModel = model as? CarouselModel else { return } collectionView.backgroundColor = backgroundColor collectionView.layer.borderColor = backgroundColor?.cgColor - collectionView.layer.borderWidth = (carouselModel.border ?? false) ? 1 : 0 + collectionView.layer.borderWidth = carouselModel.border ? 1 : 0 backgroundColor = .white registerCells(with: carouselModel, delegateObject: delegateObject) setupLayout(with: carouselModel) prepareMolecules(with: carouselModel) - itemWidthPercent = (carouselModel.itemWidthPercent ?? 100) / 100 - if let alignment = carouselModel.itemAlignment { - itemAlignment = alignment - } - - if let height = carouselModel.height { - collectionViewHeight?.constant = CGFloat(height) - collectionViewHeight?.isActive = true - } + itemWidthPercent = carouselModel.itemWidthPercent / 100 + itemAlignment = carouselModel.itemAlignment + + collectionViewHeight?.constant = CGFloat(carouselModel.height) + collectionViewHeight?.isActive = true setupPagingMolecule((carouselModel.pagingMolecule as! (CarouselPagingModelProtocol & MoleculeModelProtocol)), delegateObject: delegateObject) collectionView.reloadData() diff --git a/MVMCoreUI/Atomic/Organisms/CarouselModel.swift b/MVMCoreUI/Atomic/Organisms/CarouselModel.swift index 6f7d1a88..09ab708b 100644 --- a/MVMCoreUI/Atomic/Organisms/CarouselModel.swift +++ b/MVMCoreUI/Atomic/Organisms/CarouselModel.swift @@ -21,12 +21,12 @@ import UIKit public var backgroundColor: Color? public var molecules: [CarouselItemModel] public var moleculeName: String? - public var spacing: Float? - public var border: Bool? - public var loop: Bool? - public var height: Float? - public var itemWidthPercent: Float? - public var itemAlignment: UICollectionView.ScrollPosition? + public var spacing: Float = 1 + public var border: Bool = false + public var loop: Bool = false + public var height: Float = 300 + public var itemWidthPercent: Float = 100 + public var itemAlignment: UICollectionView.ScrollPosition = .left public var pagingMolecule: MoleculeModelProtocol? //-------------------------------------------------- @@ -62,12 +62,31 @@ import UIKit let typeContainer = try decoder.container(keyedBy: CodingKeys.self) self.molecules = try typeContainer.decode([CarouselItemModel].self, forKey: .molecules) self.backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) - self.spacing = try typeContainer.decode(Float.self, forKey: .spacing) - self.border = try typeContainer.decode(Bool.self, forKey: .border) - self.loop = try typeContainer.decode(Bool.self, forKey: .loop) - self.height = try typeContainer.decode(Float.self, forKey: .height) - self.itemWidthPercent = try typeContainer.decode(Float.self, forKey: .itemWidthPercent) - self.itemAlignment = try typeContainer.decode(UICollectionView.ScrollPosition.self, forKey: .itemAlignment) + + if let spacing = try typeContainer.decodeIfPresent(Float.self, forKey: .spacing) { + self.spacing = spacing + } + + if let border = try typeContainer.decodeIfPresent(Bool.self, forKey: .border) { + self.border = border + } + + if let loop = try typeContainer.decodeIfPresent(Bool.self, forKey: .loop) { + self.loop = loop + } + + if let height = try typeContainer.decodeIfPresent(Float.self, forKey: .height) { + self.height = height + } + + if let itemWidthPercent = try typeContainer.decodeIfPresent(Float.self, forKey: .itemWidthPercent) { + self.itemWidthPercent = itemWidthPercent + } + + if let itemAlignment = try typeContainer.decodeIfPresent(UICollectionView.ScrollPosition.self, forKey: .itemAlignment) { + self.itemAlignment = itemAlignment + } + self.pagingMolecule = try typeContainer.decodeModelIfPresent(codingKey: .pagingMolecule) } From 0b0aaefe99509d63fd6b1789578d423099f389c1 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 31 Mar 2020 16:28:25 -0400 Subject: [PATCH 30/78] more logos and accessibility --- .../CarouselIndicator/BarsIndicatorView.swift | 4 +++ .../CarouselIndicator/CarouselIndicator.swift | 25 ++++++++++++++----- .../NumericIndicatorView.swift | 15 +++++++++-- MVMCoreUI/Atomic/Organisms/Carousel.swift | 5 ++-- 4 files changed, 38 insertions(+), 11 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift index 89a06e9e..f925a02a 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift @@ -17,6 +17,7 @@ open class BarsIndicatorView: CarouselIndicator { public let stackView: UIStackView = { let stackView = UIStackView() stackView.translatesAutoresizingMaskIntoConstraints = false + stackView.isAccessibilityElement = false stackView.axis = .horizontal stackView.alignment = .bottom stackView.distribution = .equalSpacing @@ -83,6 +84,7 @@ open class BarsIndicatorView: CarouselIndicator { addSubview(stackView) isUserInteractionEnabled = false + isAccessibilityElement = false NSLayoutConstraint.activate([ stackView.heightAnchor.constraint(equalToConstant: 4), @@ -105,6 +107,7 @@ open class BarsIndicatorView: CarouselIndicator { for i in 0.. ())? open override var isEnabled: Bool { - didSet { - isUserInteractionEnabled = isEnabled - } + didSet { isUserInteractionEnabled = isEnabled } } //-------------------------------------------------- @@ -52,8 +50,12 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { previousIndex = _currentIndex _currentIndex = newIndex performAction() + if previousIndex != newIndex { - updateUI(previousIndex: previousIndex, newIndex: newIndex, totalCount: numberOfPages, isAnimated: carouselIndicatorModel?.isAnimated ?? true) + updateUI(previousIndex: previousIndex, + newIndex: newIndex, + totalCount: numberOfPages, + isAnimated: carouselIndicatorModel?.isAnimated ?? true) } } } @@ -71,12 +73,21 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { _numberOfPages = newTotal isHidden = carouselIndicatorModel?.hidesForSinglePage ?? false && newTotal <= 1 - updateUI(previousIndex: previousIndex, newIndex: currentIndex, totalCount: newTotal, isAnimated: carouselIndicatorModel?.isAnimated ?? true) + updateUI(previousIndex: previousIndex, + newIndex: currentIndex, + totalCount: newTotal, + isAnimated: carouselIndicatorModel?.isAnimated ?? true) } } + private(set) var _disabledIndicatorColor: UIColor = .mvmCoolGray3 + public var disabledIndicatorColor: UIColor { - return carouselIndicatorModel?.disabledIndicatorColor.uiColor ?? .mvmCoolGray3 + get { return _disabledIndicatorColor } + set (newDisabledColor) { + _disabledIndicatorColor = newDisabledColor + carouselIndicatorModel?.disabledIndicatorColor = Color(uiColor: newDisabledColor) + } } private(set) var _indicatorColor: UIColor = .black @@ -84,6 +95,7 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { public var indicatorColor: UIColor { get { return _indicatorColor } set (newColor) { + _indicatorColor = newColor carouselIndicatorModel?.indicatorColor = Color(uiColor: newColor) } } @@ -196,6 +208,7 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { guard let model = model as? CarouselIndicatorModel else { return } indicatorColor = model.indicatorColor.uiColor + disabledIndicatorColor = model.disabledIndicatorColor.uiColor currentIndex = model.currentIndex isEnabled = model.isEnabled diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift index 12d350e0..628e1fc6 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift @@ -18,18 +18,25 @@ open class NumericIndicatorView: CarouselIndicator { open var pageCount: Label = { let label = Label.commonLabelB2(true) label.setContentCompressionResistancePriority(.required, for: .vertical) + label.accessibilityLabel = "Page Count" label.textAlignment = .center return label }() let leftArrow: Arrow = { let arrow = Arrow(model: ArrowModel(), degrees: 180) + arrow.isAccessibilityElement = true + arrow.accessibilityLabel = "Left arrow" + arrow.accessibilityHint = "Double tap to swipe carousel left" arrow.pinHeightAndWidth() return arrow }() let rightArrow: Arrow = { let arrow = Arrow(model: ArrowModel()) + arrow.isAccessibilityElement = true + arrow.accessibilityLabel = "Right arrow" + arrow.accessibilityHint = "Double tap to swipe carousel right" arrow.pinHeightAndWidth() return arrow }() @@ -54,8 +61,8 @@ open class NumericIndicatorView: CarouselIndicator { if isEnabled { pageCount.textColor = newColor - leftArrow.tintColor = newColor - rightArrow.tintColor = newColor + leftArrow.arrowModel?.color = Color(uiColor: newColor) + rightArrow.arrowModel?.color = Color(uiColor: newColor) } } } @@ -77,6 +84,7 @@ open class NumericIndicatorView: CarouselIndicator { super.setupView() isUserInteractionEnabled = false + isAccessibilityElement = false addSubview(pageCount) addSubview(leftArrow) addSubview(rightArrow) @@ -92,6 +100,8 @@ open class NumericIndicatorView: CarouselIndicator { rightArrow.leadingAnchor.constraint(equalTo: pageCount.trailingAnchor, constant: PaddingOne), trailingAnchor.constraint(equalTo: rightArrow.trailingAnchor) ]) + + accessibilityElements = [leftArrow, pageCount, rightArrow] } public override func assessTouchOf(_ touchPoint_X: CGFloat) { @@ -110,6 +120,7 @@ open class NumericIndicatorView: CarouselIndicator { open override func updateUI(previousIndex oldIndex: Int, newIndex: Int, totalCount: Int, isAnimated: Bool) { pageCount.text = "\(newIndex + 1)/\(totalCount)" + pageCount.accessibilityValue = "Page \(newIndex + 1) of \(totalCount)" layoutIfNeeded() } } diff --git a/MVMCoreUI/Atomic/Organisms/Carousel.swift b/MVMCoreUI/Atomic/Organisms/Carousel.swift index 215f9c12..699a036d 100644 --- a/MVMCoreUI/Atomic/Organisms/Carousel.swift +++ b/MVMCoreUI/Atomic/Organisms/Carousel.swift @@ -260,9 +260,8 @@ open class Carousel: View { } public func setAccessiblity(_ cell: UICollectionViewCell?, index: Int) { - guard let cell = cell else { - return - } + guard let cell = cell else { return } + if index == currentIndex { cell.accessibilityElementsHidden = false var array = cell.accessibilityElements From a3af344991adecf206315f3ed13ef93d5c5f7897 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Wed, 1 Apr 2020 09:15:07 -0400 Subject: [PATCH 31/78] little more added --- .../Atoms/Views/CarouselIndicator/BarsIndicatorView.swift | 5 +++++ .../Views/CarouselIndicator/CarouselIndicatorModel.swift | 3 +-- .../Atoms/Views/CarouselIndicator/NumericIndicatorView.swift | 4 ++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift index f925a02a..8625bfb1 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift @@ -105,9 +105,14 @@ open class BarsIndicatorView: CarouselIndicator { var bars = [(View, NSLayoutConstraint)]() + let ordinalFormatter = NumberFormatter() + ordinalFormatter.numberStyle = .ordinal + for i in 0.. Date: Wed, 1 Apr 2020 14:26:18 -0400 Subject: [PATCH 32/78] removed ghost file --- MVMCoreUI.xcodeproj/project.pbxproj.orig | 2459 ---------------------- 1 file changed, 2459 deletions(-) delete mode 100644 MVMCoreUI.xcodeproj/project.pbxproj.orig diff --git a/MVMCoreUI.xcodeproj/project.pbxproj.orig b/MVMCoreUI.xcodeproj/project.pbxproj.orig deleted file mode 100644 index 69ba4c43..00000000 --- a/MVMCoreUI.xcodeproj/project.pbxproj.orig +++ /dev/null @@ -1,2459 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 48; - objects = { - -/* Begin PBXBuildFile section */ - 01004F3022721C3800991ECC /* RadioButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01004F2F22721C3800991ECC /* RadioButton.swift */; }; - 0103B84E23D7E33A009C315C /* HeadlineBodyToggleModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0103B84D23D7E33A009C315C /* HeadlineBodyToggleModel.swift */; }; - 0105618D224BBE7700E1557D /* FormValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0105618A224BBE7700E1557D /* FormValidator.swift */; }; - 0116A4E5228B19640094F3ED /* RadioButtonSelectionHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0116A4E4228B19640094F3ED /* RadioButtonSelectionHelper.swift */; }; - 011B58F023A2AA980085F53C /* ListItemModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 011B58EF23A2AA980085F53C /* ListItemModelProtocol.swift */; }; - 011B58F223A2AE2C0085F53C /* DropDownListItemModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 011B58F123A2AE2C0085F53C /* DropDownListItemModel.swift */; }; - 011D958524042432000E3791 /* RulesProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 011D958424042432000E3791 /* RulesProtocol.swift */; }; - 011D958724042492000E3791 /* FormFieldProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 011D958624042492000E3791 /* FormFieldProtocol.swift */; }; - 011D95892404249B000E3791 /* FormHolderModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 011D95882404249B000E3791 /* FormHolderModelProtocol.swift */; }; - 011D959B240451E3000E3791 /* RuleRequiredModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 011D959A240451E3000E3791 /* RuleRequiredModel.swift */; }; - 011D959D2404536F000E3791 /* RuleAnyValueChangedModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 011D959C2404536F000E3791 /* RuleAnyValueChangedModel.swift */; }; - 011D959F240453A1000E3791 /* RuleAllValueChangedModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 011D959E240453A1000E3791 /* RuleAllValueChangedModel.swift */; }; - 011D95A1240453D0000E3791 /* RuleEqualsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 011D95A0240453D0000E3791 /* RuleEqualsModel.swift */; }; - 011D95A3240453F8000E3791 /* RuleRegexModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 011D95A2240453F8000E3791 /* RuleRegexModel.swift */; }; - 011D95A5240455DC000E3791 /* FormGroupRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 011D95A4240455DC000E3791 /* FormGroupRule.swift */; }; - 011D95A924057AC7000E3791 /* FormActionFieldProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 011D95A824057AC7000E3791 /* FormActionFieldProtocol.swift */; }; - 011D95AB2405C553000E3791 /* FormItemProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 011D95AA2405C553000E3791 /* FormItemProtocol.swift */; }; - 011D95AD2406BB57000E3791 /* FormHolderProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 011D95AC2406BB57000E3791 /* FormHolderProtocol.swift */; }; - 011D95AF2407266E000E3791 /* RadioButtonModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 011D95AE2407266E000E3791 /* RadioButtonModel.swift */; }; - 011D9602240DA20A000E3791 /* ValidProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 011D9601240DA20A000E3791 /* ValidProtocol.swift */; }; - 011D9626240EBB16000E3791 /* RadioButtonLabelModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 011D9625240EBB16000E3791 /* RadioButtonLabelModel.swift */; }; - 011D9628240EFA1E000E3791 /* MFViewController+Form.swift in Sources */ = {isa = PBXBuildFile; fileRef = 011D9627240EFA1E000E3791 /* MFViewController+Form.swift */; }; - 012A889C23889E8400FE3DA1 /* TemplateModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012A889B23889E8400FE3DA1 /* TemplateModelProtocol.swift */; }; - 012A88AD238C418100FE3DA1 /* TemplateProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012A88AC238C418100FE3DA1 /* TemplateProtocol.swift */; }; - 012A88B1238C880100FE3DA1 /* CarouselPagingModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012A88B0238C880100FE3DA1 /* CarouselPagingModelProtocol.swift */; }; - 012A88C2238D7BCA00FE3DA1 /* CarouselItemModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012A88C1238D7BCA00FE3DA1 /* CarouselItemModel.swift */; }; - 012A88C4238D86E600FE3DA1 /* CarouselItemModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012A88C3238D86E600FE3DA1 /* CarouselItemModelProtocol.swift */; }; - 012A88C6238DA34000FE3DA1 /* ModuleMoleculeModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012A88C5238DA34000FE3DA1 /* ModuleMoleculeModel.swift */; }; - 012A88C8238DB02000FE3DA1 /* ModelMoleculeDelegateProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012A88C7238DB02000FE3DA1 /* ModelMoleculeDelegateProtocol.swift */; }; - 012A88DB238ED45900FE3DA1 /* CarouselModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012A88AE238C626E00FE3DA1 /* CarouselModel.swift */; }; - 012A88EC238F084D00FE3DA1 /* FooterModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012A88EB238F084D00FE3DA1 /* FooterModel.swift */; }; - 012A88F123985E0100FE3DA1 /* Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012A88F023985E0100FE3DA1 /* Color.swift */; }; - 012CA99E2385A2D3003F810F /* MFView+ModelExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012CA99D2385A2D3003F810F /* MFView+ModelExtension.swift */; }; - 013F801923FB4A8E00AD8013 /* UIContentMode+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 013F801823FB4A8E00AD8013 /* UIContentMode+Extension.swift */; }; - 014AA72423C501E2006F3E93 /* MoleculeContainerModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 014AA72123C501E2006F3E93 /* MoleculeContainerModel.swift */; }; - 014AA72523C501E2006F3E93 /* ContainerModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 014AA72223C501E2006F3E93 /* ContainerModel.swift */; }; - 014AA72623C501E2006F3E93 /* ContainerModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 014AA72323C501E2006F3E93 /* ContainerModelProtocol.swift */; }; - 014AA72D23C5059B006F3E93 /* StackPageTemplateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 014AA72823C5059B006F3E93 /* StackPageTemplateModel.swift */; }; - 014AA72E23C5059B006F3E93 /* StackCenteredPageTemplateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 014AA72923C5059B006F3E93 /* StackCenteredPageTemplateModel.swift */; }; - 014AA72F23C5059B006F3E93 /* ThreeLayerPageTemplateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 014AA72A23C5059B006F3E93 /* ThreeLayerPageTemplateModel.swift */; }; - 014AA73123C5059B006F3E93 /* ListPageTemplateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 014AA72C23C5059B006F3E93 /* ListPageTemplateModel.swift */; }; - 01509D8F2327EC6F00EF99AA /* MoleculeTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01509D8E2327EC6F00EF99AA /* MoleculeTableViewCell.swift */; }; - 01509D912327ECE600EF99AA /* CornerLabels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01509D902327ECE600EF99AA /* CornerLabels.swift */; }; - 01509D932327ECFB00EF99AA /* ProgressBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01509D922327ECFB00EF99AA /* ProgressBar.swift */; }; - 01509D952327ED1900EF99AA /* HeadlineBodyLinkToggle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01509D942327ED1900EF99AA /* HeadlineBodyLinkToggle.swift */; }; - 017BEB382360C6AC0024EF95 /* RadioButtonLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 017BEB372360C6AC0024EF95 /* RadioButtonLabel.swift */; }; - 017BEB3C2361EA1D0024EF95 /* MFViewController+Model.swift in Sources */ = {isa = PBXBuildFile; fileRef = 017BEB3B2361EA1D0024EF95 /* MFViewController+Model.swift */; }; - 017BEB4023620A230024EF95 /* TextFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 017BEB3F23620A230024EF95 /* TextFieldModel.swift */; }; - 017BEB442362192F0024EF95 /* MVMCoreUIMoleculeMappingObject+ModelExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 017BEB432362192F0024EF95 /* MVMCoreUIMoleculeMappingObject+ModelExtension.swift */; }; - 017BEB48236230DB0024EF95 /* MoleculeViewProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 017BEB47236230DB0024EF95 /* MoleculeViewProtocol.swift */; }; - 017BEB4A236235BA0024EF95 /* ModelMoleculeViewProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 017BEB49236235BA0024EF95 /* ModelMoleculeViewProtocol.swift */; }; - 017BEB7B236763000024EF95 /* LineModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 017BEB7A236763000024EF95 /* LineModel.swift */; }; - 017BEB7F23676E870024EF95 /* MoleculeObjectMapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = 017BEB7E23676E870024EF95 /* MoleculeObjectMapping.swift */; }; - 0198F7A62256A80B0066C936 /* MFRadioButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 0198F7A02256A80A0066C936 /* MFRadioButton.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0198F7A82256A80B0066C936 /* MFRadioButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 0198F7A22256A80A0066C936 /* MFRadioButton.m */; }; - 01C851D323CF9E740021F976 /* LabelToggleModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01C851D223CF9E740021F976 /* LabelToggleModel.swift */; }; - 01E569D3223FFFA500327251 /* ThreeLayerViewController.swift in Headers */ = {isa = PBXBuildFile; fileRef = D2A5146A2214905000345BFB /* ThreeLayerViewController.swift */; settings = {ATTRIBUTES = (Public, ); }; }; - 01EB3684236097C0006832FA /* MoleculeModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01EB3683236097C0006832FA /* MoleculeModelProtocol.swift */; }; - 01EB368F23609801006832FA /* LabelModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01EB368823609801006832FA /* LabelModel.swift */; }; - 01EB369023609801006832FA /* MoleculeListItemModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01EB368923609801006832FA /* MoleculeListItemModel.swift */; }; - 01EB369223609801006832FA /* MoleculeStackModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01EB368B23609801006832FA /* MoleculeStackModel.swift */; }; - 01EB369323609801006832FA /* HeaderModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01EB368C23609801006832FA /* HeaderModel.swift */; }; - 01EB369423609801006832FA /* HeadlineBodyModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01EB368D23609801006832FA /* HeadlineBodyModel.swift */; }; - 01F2A03223A4498200D954D8 /* CaretLinkModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01F2A03123A4498200D954D8 /* CaretLinkModel.swift */; }; - 0A1214A022C11A18007C7030 /* ActionDetailWithImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A12149F22C11A17007C7030 /* ActionDetailWithImage.swift */; }; - 0A14F69323E349EF00EDF7F7 /* CarouselIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A14F69223E349EF00EDF7F7 /* CarouselIndicator.swift */; }; - 0A14F6A523E4803A00EDF7F7 /* StackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A14F6A423E4803A00EDF7F7 /* StackView.swift */; }; - 0A14F6A923E8750300EDF7F7 /* CarouselIndicatorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A14F6A823E8750300EDF7F7 /* CarouselIndicatorModel.swift */; }; - 0A14F6B423E8C29700EDF7F7 /* NumericIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A14F6B323E8C29700EDF7F7 /* NumericIndicatorView.swift */; }; - 0A1B4A96233BB18F005B3FB4 /* CheckboxLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7BAFA2232BE63400FB8E22 /* CheckboxLabel.swift */; }; - 0A21DB7F235DECC500C160A2 /* EntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A21DB7E235DECC500C160A2 /* EntryField.swift */; }; - 0A21DB83235DFBC500C160A2 /* MdnEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A21DB82235DFBC500C160A2 /* MdnEntryField.swift */; }; - 0A21DB84235E06EF00C160A2 /* MFTextField.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF24C21E6A177003B2FB9 /* MFTextField.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0A21DB85235E06EF00C160A2 /* MFTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF24221E6A176003B2FB9 /* MFTextField.m */; }; - 0A21DB86235E06EF00C160A2 /* MFTextField.xib in Resources */ = {isa = PBXBuildFile; fileRef = D29DF24421E6A176003B2FB9 /* MFTextField.xib */; }; - 0A21DB87235E06EF00C160A2 /* MFTextFieldSubclassExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF24B21E6A177003B2FB9 /* MFTextFieldSubclassExtension.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0A21DB88235E06EF00C160A2 /* MFMdnTextField.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF24721E6A176003B2FB9 /* MFMdnTextField.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0A21DB89235E06EF00C160A2 /* MFMdnTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF24921E6A177003B2FB9 /* MFMdnTextField.m */; }; - 0A21DB8A235E06EF00C160A2 /* MFDigitTextBox.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF24521E6A176003B2FB9 /* MFDigitTextBox.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0A21DB8B235E06EF00C160A2 /* MFDigitTextBox.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF24621E6A176003B2FB9 /* MFDigitTextBox.m */; }; - 0A21DB8C235E06EF00C160A2 /* MFDigitTextField.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF24321E6A176003B2FB9 /* MFDigitTextField.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0A21DB8D235E06EF00C160A2 /* MFDigitTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF24821E6A177003B2FB9 /* MFDigitTextField.m */; }; - 0A21DB8E235E06EF00C160A2 /* MFDigitTextField.xib in Resources */ = {isa = PBXBuildFile; fileRef = D29DF24A21E6A177003B2FB9 /* MFDigitTextField.xib */; }; - 0A21DB91235E0EDB00C160A2 /* DigitBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A8321AE2355FE9500CB7F00 /* DigitBox.swift */; }; - 0A21DB94235E24ED00C160A2 /* DigitEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A21DB93235E24ED00C160A2 /* DigitEntryField.swift */; }; - 0A41BA6E2344FCD400D4C0BC /* CATransaction+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A41BA6D2344FCD400D4C0BC /* CATransaction+Extension.swift */; }; - 0A41BA7F23453A6400D4C0BC /* TextEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A41BA7E23453A6400D4C0BC /* TextEntryField.swift */; }; - 0A4253AF23F5C2C100554656 /* BarsIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A4253AE23F5C2C000554656 /* BarsIndicatorView.swift */; }; - 0A5D59C223AD2F5700EFD9E9 /* AppleGuidelinesProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A5D59C123AD2F5700EFD9E9 /* AppleGuidelinesProtocol.swift */; }; - 0A69F611241BDEA700F7231B /* RuleAnyRequiredModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A69F610241BDEA700F7231B /* RuleAnyRequiredModel.swift */; }; - 0A6BF4722360C56C0028F841 /* BaseDropdownEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A6BF4712360C56C0028F841 /* BaseDropdownEntryField.swift */; }; - 0A7918F523F5E7EA00772FF4 /* ImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7918F423F5E7EA00772FF4 /* ImageView.swift */; }; - 0A7BAD74232A8DC700FB8E22 /* HeadlineBodyButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7BAD73232A8DC700FB8E22 /* HeadlineBodyButton.swift */; }; - 0A7BAFA1232BE61800FB8E22 /* Checkbox.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7BAFA0232BE61800FB8E22 /* Checkbox.swift */; }; - 0A7EF85B23D8A52800B2AAD1 /* EntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF85A23D8A52800B2AAD1 /* EntryFieldModel.swift */; }; - 0A7EF85D23D8A95600B2AAD1 /* TextEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF85C23D8A95600B2AAD1 /* TextEntryFieldModel.swift */; }; - 0A7EF85F23D8ABC500B2AAD1 /* MdnEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF85E23D8ABC500B2AAD1 /* MdnEntryFieldModel.swift */; }; - 0A7EF86123D8AC2500B2AAD1 /* DigitEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF86023D8AC2500B2AAD1 /* DigitEntryFieldModel.swift */; }; - 0A7EF86323D8AFA000B2AAD1 /* BaseDropdownEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF86223D8AFA000B2AAD1 /* BaseDropdownEntryFieldModel.swift */; }; - 0A7EF86523D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF86423D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift */; }; - 0A7EF86723D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF86623D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift */; }; - 0AA33B3A2398524F0067DD0F /* Toggle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AA33B392398524F0067DD0F /* Toggle.swift */; }; - 0AAF8E2A240EA57D008DD263 /* BarsCarouselIndicatorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AAF8E29240EA57D008DD263 /* BarsCarouselIndicatorModel.swift */; }; - 0AAF8E2C240EA594008DD263 /* NumericCarouselIndicatorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AAF8E2B240EA594008DD263 /* NumericCarouselIndicatorModel.swift */; }; - 0ABD136D237CAD1E0081388D /* DateDropdownEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ABD136C237CAD1E0081388D /* DateDropdownEntryField.swift */; }; - 0ABD1371237DB0450081388D /* ItemDropdownEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ABD1370237DB0450081388D /* ItemDropdownEntryField.swift */; }; - 0AE14F64238315D2005417F8 /* TextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AE14F63238315D2005417F8 /* TextField.swift */; }; - 0AE98BAF23FEF956004C5109 /* ExternalLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AE98BAE23FEF956004C5109 /* ExternalLink.swift */; }; - 0AE98BB323FF0934004C5109 /* ExternalLinkModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AE98BB223FF0934004C5109 /* ExternalLinkModel.swift */; }; - 0AE98BB523FF18D2004C5109 /* Arrow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AE98BB423FF18D2004C5109 /* Arrow.swift */; }; - 0AE98BB723FF18E9004C5109 /* ArrowModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AE98BB623FF18E9004C5109 /* ArrowModel.swift */; }; - 31BE15CB23D8924D00452370 /* CheckboxLabelModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31BE15C923D8924C00452370 /* CheckboxLabelModel.swift */; }; - 31BE15CC23D8924D00452370 /* CheckboxModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31BE15CA23D8924C00452370 /* CheckboxModel.swift */; }; - 522679C123FE886900906CBA /* ListLeftVariableCheckboxAllTextAndLinks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 522679BF23FE886900906CBA /* ListLeftVariableCheckboxAllTextAndLinks.swift */; }; - 522679C223FE886900906CBA /* ListLeftVariableCheckboxAllTextAndLinksModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 522679C023FE886900906CBA /* ListLeftVariableCheckboxAllTextAndLinksModel.swift */; }; - 52267A0723FFE25000906CBA /* ListOneColumnFullWidthTextAllTextAndLinks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52267A0623FFE25000906CBA /* ListOneColumnFullWidthTextAllTextAndLinks.swift */; }; - 5248BFEC23F12E350059236A /* ListThreeColumnPlanDataDivider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5248BFEA23F12E350059236A /* ListThreeColumnPlanDataDivider.swift */; }; - 5248BFED23F12E350059236A /* ListThreeColumnPlanDataDividerModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5248BFEB23F12E350059236A /* ListThreeColumnPlanDataDividerModel.swift */; }; - 525019DD2406430800EED91C /* ListProgressBarDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 525019DB2406430700EED91C /* ListProgressBarDataModel.swift */; }; - 525019DE2406430800EED91C /* ListProgressBarData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 525019DC2406430800EED91C /* ListProgressBarData.swift */; }; - 525019E52406852100EED91C /* ListFourColumnDataUsageDividerModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 525019E42406852100EED91C /* ListFourColumnDataUsageDividerModel.swift */; }; - 525019E72406853600EED91C /* ListFourColumnDataUsageDivider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 525019E62406853600EED91C /* ListFourColumnDataUsageDivider.swift */; }; - 525239C02407BCFF00454969 /* ListTwoColumnPriceDetailsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 525239BF2407BCFF00454969 /* ListTwoColumnPriceDetailsModel.swift */; }; - 525239C22407BD1000454969 /* ListTwoColumnPriceDetails.swift in Sources */ = {isa = PBXBuildFile; fileRef = 525239C12407BD1000454969 /* ListTwoColumnPriceDetails.swift */; }; - 526A265C240D1FF700B0D828 /* ListTwoColumnCompareChangesModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 526A265B240D1FF700B0D828 /* ListTwoColumnCompareChangesModel.swift */; }; - 526A265E240D200500B0D828 /* ListTwoColumnCompareChanges.swift in Sources */ = {isa = PBXBuildFile; fileRef = 526A265D240D200500B0D828 /* ListTwoColumnCompareChanges.swift */; }; - 52B201D224081CFB00D2011E /* ListLeftVariableRadioButtonAndPaymentMethod.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52B201D024081CFB00D2011E /* ListLeftVariableRadioButtonAndPaymentMethod.swift */; }; - 52B201D324081CFB00D2011E /* ListLeftVariableRadioButtonAndPaymentMethodModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52B201D124081CFB00D2011E /* ListLeftVariableRadioButtonAndPaymentMethodModel.swift */; }; - 8D070BB0241B56530099AC56 /* ListRightVariableTotalDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D070BAF241B56530099AC56 /* ListRightVariableTotalDataModel.swift */; }; - 8D070BB2241B56AD0099AC56 /* ListRightVariableTotalData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D070BB1241B56AD0099AC56 /* ListRightVariableTotalData.swift */; }; - 8D084AD02410BF4800951227 /* ListOneColumnFullWidthTextBodyTextModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D084ACF2410BF4800951227 /* ListOneColumnFullWidthTextBodyTextModel.swift */; }; - 8D084AD22410BF7600951227 /* ListOneColumnFullWidthTextBodyText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D084AD12410BF7600951227 /* ListOneColumnFullWidthTextBodyText.swift */; }; - 8D24041123E7FB9E009E23BE /* ListLeftVariableIconWithRightCaret.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D24041023E7FB9E009E23BE /* ListLeftVariableIconWithRightCaret.swift */; }; - 8D24041523E7FC0B009E23BE /* ListLeftVariableIconWithRightCaretModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D24041423E7FC0B009E23BE /* ListLeftVariableIconWithRightCaretModel.swift */; }; - 8D448E5524050A46006211BB /* ListOneColumnFullWidthTextAllTextAndLinksModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D448E5424050A46006211BB /* ListOneColumnFullWidthTextAllTextAndLinksModel.swift */; }; - 942C372E241149170066E45E /* NHaasGroteskDSStd-75Bd.otf in Resources */ = {isa = PBXBuildFile; fileRef = 942C372C241149170066E45E /* NHaasGroteskDSStd-75Bd.otf */; }; - 942C372F241149170066E45E /* NHaasGroteskDSStd-55Rg.otf in Resources */ = {isa = PBXBuildFile; fileRef = 942C372D241149170066E45E /* NHaasGroteskDSStd-55Rg.otf */; }; - 942C378C2412F4FA0066E45E /* ModalMoleculeListTemplate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 942C378B2412F4FA0066E45E /* ModalMoleculeListTemplate.swift */; }; - 942C378E2412F5B60066E45E /* ModalMoleculeStackTemplate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 942C378D2412F5B60066E45E /* ModalMoleculeStackTemplate.swift */; }; - 9432A79F23DB47BA00719041 /* EntryFieldContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9432A79E23DB47BA00719041 /* EntryFieldContainer.swift */; }; - 943784F5236B77BB006A1E82 /* GraphView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 943784F3236B77BB006A1E82 /* GraphView.swift */; }; - 943784F6236B77BB006A1E82 /* GraphViewAnimationHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 943784F4236B77BB006A1E82 /* GraphViewAnimationHandler.swift */; }; - 9445890C2385BCE300DE9FD4 /* ProgressBarModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9445890B2385BCE300DE9FD4 /* ProgressBarModel.swift */; }; - 9445890E2385C3F800DE9FD4 /* MultiProgressModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9445890D2385C3F800DE9FD4 /* MultiProgressModel.swift */; }; - 9445891F2385D2E900DE9FD4 /* CaretViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9445891E2385D2E900DE9FD4 /* CaretViewModel.swift */; }; - 944589212385D6E900DE9FD4 /* DashLineModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 944589202385D6E900DE9FD4 /* DashLineModel.swift */; }; - 944589232385DA9600DE9FD4 /* ImageViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 944589222385DA9500DE9FD4 /* ImageViewModel.swift */; }; - 9455B19C234F8A0400A574DB /* MVMAnimationFramework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9455B19B234F8A0400A574DB /* MVMAnimationFramework.framework */; }; - 9458C3172406C8FD00930963 /* UIFont+FontWrapping.h in Headers */ = {isa = PBXBuildFile; fileRef = 9458C3152406C8FD00930963 /* UIFont+FontWrapping.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9458C3182406C8FD00930963 /* UIFont+FontWrapping.m in Sources */ = {isa = PBXBuildFile; fileRef = 9458C3162406C8FD00930963 /* UIFont+FontWrapping.m */; }; - 948DB67E2326DCD90011F916 /* MultiProgress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 948DB67D2326DCD90011F916 /* MultiProgress.swift */; }; - 94AF4A3E23E9D13900676048 /* MFCaretButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 94AF4A3C23E9D13900676048 /* MFCaretButton.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 94AF4A3F23E9D13900676048 /* MFCaretButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 94AF4A3D23E9D13900676048 /* MFCaretButton.m */; }; - 94AF4A4223E9D19E00676048 /* MFCaretView.h in Headers */ = {isa = PBXBuildFile; fileRef = 94AF4A4023E9D19E00676048 /* MFCaretView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 94AF4A4323E9D19E00676048 /* MFCaretView.m in Sources */ = {isa = PBXBuildFile; fileRef = 94AF4A4123E9D19E00676048 /* MFCaretView.m */; }; - 94C0150A24215643005811A9 /* ActionTopAlertModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94C0150924215643005811A9 /* ActionTopAlertModel.swift */; }; - 94C0150C2421564A005811A9 /* ActionCollapseNotificationModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94C0150B2421564A005811A9 /* ActionCollapseNotificationModel.swift */; }; - 94C2D9842386F3F80006CF46 /* LabelAttributeModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94C2D9832386F3F80006CF46 /* LabelAttributeModel.swift */; }; - 94C2D9A123872BCC0006CF46 /* LabelAttributeUnderlineModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94C2D9A023872BCC0006CF46 /* LabelAttributeUnderlineModel.swift */; }; - 94C2D9A323872C110006CF46 /* LabelAttributeStrikeThroughModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94C2D9A223872C110006CF46 /* LabelAttributeStrikeThroughModel.swift */; }; - 94C2D9A523872C350006CF46 /* LabelAttributeFontModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94C2D9A423872C350006CF46 /* LabelAttributeFontModel.swift */; }; - 94C2D9A723872DA90006CF46 /* LabelAttributeColorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94C2D9A623872DA90006CF46 /* LabelAttributeColorModel.swift */; }; - 94C2D9A923872E5E0006CF46 /* LabelAttributeImageModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94C2D9A823872E5E0006CF46 /* LabelAttributeImageModel.swift */; }; - 94C2D9AB23872EB50006CF46 /* LabelAttributeActionModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94C2D9AA23872EB50006CF46 /* LabelAttributeActionModel.swift */; }; - 94C661D923CCF4B400D9FE5B /* LeftRightLabelModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9402C34F23A2CEA3004B974C /* LeftRightLabelModel.swift */; }; - 94C661DA23CCF4FB00D9FE5B /* UIColor+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AA33B33239813C50067DD0F /* UIColor+Extension.swift */; }; - 94CA227C24058534002D6750 /* VerizonNHGeTX-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 94CA227824058533002D6750 /* VerizonNHGeTX-Bold.otf */; }; - 94CA227D24058534002D6750 /* VerizonNHGeDS-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = 94CA227924058533002D6750 /* VerizonNHGeDS-Regular.otf */; }; - 94CA227E24058534002D6750 /* VerizonNHGeDS-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 94CA227A24058533002D6750 /* VerizonNHGeDS-Bold.otf */; }; - 94CA227F24058534002D6750 /* VerizonNHGeTX-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = 94CA227B24058533002D6750 /* VerizonNHGeTX-Regular.otf */; }; - 94F217B623E0BF6100A47C06 /* PrimaryButtonView.h in Headers */ = {isa = PBXBuildFile; fileRef = 94F217B423E0BF6100A47C06 /* PrimaryButtonView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 94F217B723E0BF6100A47C06 /* PrimaryButtonView.m in Sources */ = {isa = PBXBuildFile; fileRef = 94F217B523E0BF6100A47C06 /* PrimaryButtonView.m */; }; - 94FB966223D797DA003D482B /* MFTextButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 94FB966023D797DA003D482B /* MFTextButton.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 94FB966323D797DA003D482B /* MFTextButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 94FB966123D797DA003D482B /* MFTextButton.m */; }; - AA11A41F23F15D3100D7962F /* ListRightVariablePayments.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA11A41E23F15D3100D7962F /* ListRightVariablePayments.swift */; }; - AA11A42123F15D7000D7962F /* ListRightVariablePaymentsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA11A42023F15D7000D7962F /* ListRightVariablePaymentsModel.swift */; }; - AAA74A172410C04600080241 /* HeadersH2NoButtonsBodyText.swift in Sources */ = {isa = PBXBuildFile; fileRef = AAA74A162410C04600080241 /* HeadersH2NoButtonsBodyText.swift */; }; - AAA74A192410C05800080241 /* HeadersH2NoButtonsBodyTextModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AAA74A182410C05800080241 /* HeadersH2NoButtonsBodyTextModel.swift */; }; - BB47A586241615EF002BB23C /* ListOneColumnFullWidthTextDividerSubsectionModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB47A585241615EF002BB23C /* ListOneColumnFullWidthTextDividerSubsectionModel.swift */; }; - BB47A588241615FA002BB23C /* ListOneColumnFullWidthTextDividerSubsection.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB47A587241615FA002BB23C /* ListOneColumnFullWidthTextDividerSubsection.swift */; }; - BB6C6AC0242232DF005F7224 /* ListOneColumnTextWithWhitespaceDividerTallModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB6C6ABE242232DF005F7224 /* ListOneColumnTextWithWhitespaceDividerTallModel.swift */; }; - BB6C6AC1242232DF005F7224 /* ListOneColumnTextWithWhitespaceDividerTall.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB6C6ABF242232DF005F7224 /* ListOneColumnTextWithWhitespaceDividerTall.swift */; }; - BB6C6AC824225290005F7224 /* ListOneColumnTextWithWhitespaceDividerShort.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB6C6AC62422528F005F7224 /* ListOneColumnTextWithWhitespaceDividerShort.swift */; }; - BB6C6AC924225290005F7224 /* ListOneColumnTextWithWhitespaceDividerShortModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB6C6AC72422528F005F7224 /* ListOneColumnTextWithWhitespaceDividerShortModel.swift */; }; - C003506123AA94CD00B6AC29 /* Button.swift in Sources */ = {isa = PBXBuildFile; fileRef = C003506023AA94CD00B6AC29 /* Button.swift */; }; - C07065C42395677300FBF997 /* Link.swift in Sources */ = {isa = PBXBuildFile; fileRef = C07065C32395677300FBF997 /* Link.swift */; }; - C695A67F23C9830600BFB94E /* UnOrderedListModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C695A67E23C9830600BFB94E /* UnOrderedListModel.swift */; }; - C695A68123C9830D00BFB94E /* NumberedListModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C695A68023C9830D00BFB94E /* NumberedListModel.swift */; }; - C695A69423C9909000BFB94E /* DoughnutChartModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C695A69323C9909000BFB94E /* DoughnutChartModel.swift */; }; - C695A69623C990BC00BFB94E /* DoughnutChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = C695A69523C990BC00BFB94E /* DoughnutChart.swift */; }; - C695A69823C990C200BFB94E /* DoughnutChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C695A69723C990C200BFB94E /* DoughnutChartView.swift */; }; - C6FA7D5223C77A4A00A3614A /* UnOrderedList.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6FA7D4F23C77A4700A3614A /* UnOrderedList.swift */; }; - C6FA7D5323C77A4A00A3614A /* StringAndMoleculeStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6FA7D5023C77A4800A3614A /* StringAndMoleculeStack.swift */; }; - C6FA7D5423C77A4A00A3614A /* NumberedList.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6FA7D5123C77A4900A3614A /* NumberedList.swift */; }; - C7192E7D23C301750050C2A0 /* HeadLineBodyCaretLinkImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7192E7C23C301750050C2A0 /* HeadLineBodyCaretLinkImage.swift */; }; - C7F8012123E8303200396FBD /* ListRVWheel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7F8012023E8303200396FBD /* ListRVWheel.swift */; }; - C7F8012323E846C300396FBD /* ListRVWheelModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7F8012223E846C300396FBD /* ListRVWheelModel.swift */; }; - D20A9A5E2243D3E300ADE781 /* TwoButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20A9A5D2243D3E300ADE781 /* TwoButtonView.swift */; }; - D20FB165241A5D75004AFC3A /* NavigationItemModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20FB164241A5D75004AFC3A /* NavigationItemModelProtocol.swift */; }; - D213347723843825008E41B3 /* Line.swift in Sources */ = {isa = PBXBuildFile; fileRef = D213347623843825008E41B3 /* Line.swift */; }; - D21EE53C23AD3AD4003D1A30 /* NSLayoutConstraintAxis+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = D21EE53B23AD3AD4003D1A30 /* NSLayoutConstraintAxis+Extension.swift */; }; - D224798A2314445E003FCCF9 /* LabelToggle.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22479892314445E003FCCF9 /* LabelToggle.swift */; }; - D224798C231450C8003FCCF9 /* HeadlineBodyToggle.swift in Sources */ = {isa = PBXBuildFile; fileRef = D224798B231450C8003FCCF9 /* HeadlineBodyToggle.swift */; }; - D22479942316AE5E003FCCF9 /* NSLayoutConstraintExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22479932316AE5E003FCCF9 /* NSLayoutConstraintExtension.swift */; }; - D22479962316AF6E003FCCF9 /* HeadlineBodyLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22479952316AF6D003FCCF9 /* HeadlineBodyLink.swift */; }; - D224799B231965AD003FCCF9 /* AccordionMoleculeTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D224799A231965AD003FCCF9 /* AccordionMoleculeTableViewCell.swift */; }; - D22D1F1A220341F60077CEC0 /* MVMCoreUICheckBox.h in Headers */ = {isa = PBXBuildFile; fileRef = D22D1F18220341F50077CEC0 /* MVMCoreUICheckBox.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D22D1F1B220341F60077CEC0 /* MVMCoreUICheckBox.m in Sources */ = {isa = PBXBuildFile; fileRef = D22D1F19220341F50077CEC0 /* MVMCoreUICheckBox.m */; }; - D22D1F1E220343560077CEC0 /* MVMCoreUICheckMarkView.h in Headers */ = {isa = PBXBuildFile; fileRef = D22D1F1C220343560077CEC0 /* MVMCoreUICheckMarkView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D22D1F1F220343560077CEC0 /* MVMCoreUICheckMarkView.m in Sources */ = {isa = PBXBuildFile; fileRef = D22D1F1D220343560077CEC0 /* MVMCoreUICheckMarkView.m */; }; - D22D1F46220496A30077CEC0 /* MVMCoreUISwitch.h in Headers */ = {isa = PBXBuildFile; fileRef = D22D1F44220496A30077CEC0 /* MVMCoreUISwitch.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D22D1F47220496A30077CEC0 /* MVMCoreUISwitch.m in Sources */ = {isa = PBXBuildFile; fileRef = D22D1F45220496A30077CEC0 /* MVMCoreUISwitch.m */; }; - D22D1F562204CE5D0077CEC0 /* MVMCoreUIStackableViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = D22D1F542204CE5D0077CEC0 /* MVMCoreUIStackableViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D22D1F572204CE5D0077CEC0 /* MVMCoreUIStackableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D22D1F552204CE5D0077CEC0 /* MVMCoreUIStackableViewController.m */; }; - D22D8393241C27B100D3DF69 /* TemplateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22D8392241C27B100D3DF69 /* TemplateModel.swift */; }; - D22D8395241FB41200D3DF69 /* UIStackView+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22D8394241FB41200D3DF69 /* UIStackView+Extension.swift */; }; - D236E5B4241FEB1000C38625 /* ListTwoColumnPriceDescription.swift in Sources */ = {isa = PBXBuildFile; fileRef = D236E5B2241FEB1000C38625 /* ListTwoColumnPriceDescription.swift */; }; - D236E5B5241FEB1000C38625 /* ListTwoColumnPriceDescriptionModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D236E5B3241FEB1000C38625 /* ListTwoColumnPriceDescriptionModel.swift */; }; - D236E5B7242007C500C38625 /* MVMControllerModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D236E5B6242007C500C38625 /* MVMControllerModelProtocol.swift */; }; - D243859923A16B1800332775 /* Container.swift in Sources */ = {isa = PBXBuildFile; fileRef = D243859823A16B1800332775 /* Container.swift */; }; - D256E9932412880000360572 /* Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = D256E9922412880000360572 /* Header.swift */; }; - D260105323CEA61600764D80 /* ToggleModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D260105223CEA61600764D80 /* ToggleModel.swift */; }; - D260105523CEA7DC00764D80 /* MVMCoreUISwitch+Model.swift in Sources */ = {isa = PBXBuildFile; fileRef = D260105423CEA7DC00764D80 /* MVMCoreUISwitch+Model.swift */; }; - D260105923D0A92900764D80 /* ContainerProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D260105823D0A92900764D80 /* ContainerProtocol.swift */; }; - D260105B23D0BB7100764D80 /* StackModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D260105A23D0BB7100764D80 /* StackModelProtocol.swift */; }; - D260105D23D0BCD400764D80 /* Stack.swift in Sources */ = {isa = PBXBuildFile; fileRef = D260105C23D0BCD400764D80 /* Stack.swift */; }; - D260105F23D0BFFC00764D80 /* StackItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D260105E23D0BFFC00764D80 /* StackItem.swift */; }; - D260106123D0C02A00764D80 /* StackItemModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D260106023D0C02A00764D80 /* StackItemModelProtocol.swift */; }; - D260106323D0C05000764D80 /* StackItemModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D260106223D0C05000764D80 /* StackItemModel.swift */; }; - D260106523D0CEA700764D80 /* StackModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D260106423D0CEA700764D80 /* StackModel.swift */; }; - D260D7B122D65BDD007E7233 /* MVMCoreUIPageControl.h in Headers */ = {isa = PBXBuildFile; fileRef = D260D7AF22D65BDD007E7233 /* MVMCoreUIPageControl.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D260D7B222D65BDD007E7233 /* MVMCoreUIPageControl.m in Sources */ = {isa = PBXBuildFile; fileRef = D260D7B022D65BDD007E7233 /* MVMCoreUIPageControl.m */; }; - D260D7B622D68514007E7233 /* MVMCoreUIPagingProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = D260D7B522D68509007E7233 /* MVMCoreUIPagingProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D268C70C2386DFFD007F2C1C /* MoleculeStackItemModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01EB368A23609801006832FA /* MoleculeStackItemModel.swift */; }; - D268C70E238C22D7007F2C1C /* DropDownFilterTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D268C70D238C22D7007F2C1C /* DropDownFilterTableViewCell.swift */; }; - D26C5A6B23F4A40D007AEECE /* ListItemModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D26C5A6A23F4A40D007AEECE /* ListItemModel.swift */; }; - D274CA332236A78900B01B62 /* FooterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D274CA322236A78900B01B62 /* FooterView.swift */; }; - D2755D7B23689C7500485468 /* TableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2755D7A23689C7500485468 /* TableViewCell.swift */; }; - D27CD40E2322EEAF00C1DC07 /* TabsTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D27CD40D2322EEAF00C1DC07 /* TabsTableViewCell.swift */; }; - D27CD4102339057800C1DC07 /* EyebrowHeadlineBodyLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = D27CD40F2339057800C1DC07 /* EyebrowHeadlineBodyLink.swift */; }; - D282AAB4223FDDAE00C46919 /* MFLoadImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D282AAB3223FDDAE00C46919 /* MFLoadImageView.swift */; }; - D282AABA224131D100C46919 /* MFTransparentGIFView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D282AAB9224131D100C46919 /* MFTransparentGIFView.swift */; }; - D282AACB2243C61700C46919 /* ButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D282AACA2243C61700C46919 /* ButtonView.swift */; }; - D28A837723C79FC600DFE4FC /* MFCustomButton+ActionModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28A837623C79FC600DFE4FC /* MFCustomButton+ActionModel.swift */; }; - D28A837923C7D5BC00DFE4FC /* PageModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28A837823C7D5BC00DFE4FC /* PageModelProtocol.swift */; }; - D28A837B23C928DA00DFE4FC /* MoleculeListCellProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28A837A23C928DA00DFE4FC /* MoleculeListCellProtocol.swift */; }; - D28A837D23CCA86A00DFE4FC /* TabsListItemModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28A837C23CCA86A00DFE4FC /* TabsListItemModel.swift */; }; - D28A837F23CCA96400DFE4FC /* TabsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28A837E23CCA96400DFE4FC /* TabsModel.swift */; }; - D28A838123CCB0D800DFE4FC /* AccordionListItemModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28A838023CCB0D800DFE4FC /* AccordionListItemModel.swift */; }; - D28A838323CCBD3F00DFE4FC /* CircleProgressModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28A838223CCBD3F00DFE4FC /* CircleProgressModel.swift */; }; - D28A838523CCCA8900DFE4FC /* ScrollerModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28A838423CCCA8900DFE4FC /* ScrollerModel.swift */; }; - D28A838923CCCFCB00DFE4FC /* LinkModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28A838823CCCFCB00DFE4FC /* LinkModel.swift */; }; - D28A838B23CCDA6B00DFE4FC /* ButtonModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28A838A23CCDA6B00DFE4FC /* ButtonModel.swift */; }; - D28A838D23CCDCC200DFE4FC /* PrimaryButton+MoleculeProtocolExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28A838C23CCDCC200DFE4FC /* PrimaryButton+MoleculeProtocolExtension.swift */; }; - D28A838F23CCDEDE00DFE4FC /* TwoButtonViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28A838E23CCDEDE00DFE4FC /* TwoButtonViewModel.swift */; }; - D28A839123CD4FD400DFE4FC /* CornerLabelsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28A839023CD4FD400DFE4FC /* CornerLabelsModel.swift */; }; - D28A839323CE828900DFE4FC /* HeadlineBodyCaretLinkImageModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28A839223CE828900DFE4FC /* HeadlineBodyCaretLinkImageModel.swift */; }; - D296E14722A5984C0051EBE7 /* MVMCoreUIViewConstrainingProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = D296E14622A597490051EBE7 /* MVMCoreUIViewConstrainingProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29770C821F7C4AE00B2F0D0 /* TopLabelsView.m in Sources */ = {isa = PBXBuildFile; fileRef = D29770C621F7C4AE00B2F0D0 /* TopLabelsView.m */; }; - D29770C921F7C4AE00B2F0D0 /* TopLabelsView.h in Headers */ = {isa = PBXBuildFile; fileRef = D29770C721F7C4AE00B2F0D0 /* TopLabelsView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29770F221F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D29770EE21F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsTableViewController.m */; }; - D29770F321F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsTableViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = D29770EF21F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsTableViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29770F421F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = D29770F021F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29770F521F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D29770F121F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsViewController.m */; }; - D29770FC21F7C77400B2F0D0 /* MVMCoreUITextFieldView.m in Sources */ = {isa = PBXBuildFile; fileRef = D29770FA21F7C77400B2F0D0 /* MVMCoreUITextFieldView.m */; }; - D29770FD21F7C77400B2F0D0 /* MVMCoreUITextFieldView.h in Headers */ = {isa = PBXBuildFile; fileRef = D29770FB21F7C77400B2F0D0 /* MVMCoreUITextFieldView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29B771022C281F400D6ACE0 /* ModuleMolecule.swift in Sources */ = {isa = PBXBuildFile; fileRef = D29B770F22C281F400D6ACE0 /* ModuleMolecule.swift */; }; - D29C94D5242901C9003813BA /* MVMCoreUICommonViewsUtility+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = D29C94D4242901C9003813BA /* MVMCoreUICommonViewsUtility+Extension.swift */; }; - D29DF0D121E404D4003B2FB9 /* MVMCoreUI.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF0CF21E404D4003B2FB9 /* MVMCoreUI.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF0E621E4F3C7003B2FB9 /* MVMCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D29DF0E521E4F3C7003B2FB9 /* MVMCore.framework */; }; - D29DF11521E6805F003B2FB9 /* UIColor+MFConvenience.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF11121E6805F003B2FB9 /* UIColor+MFConvenience.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF11621E6805F003B2FB9 /* NSLayoutConstraint+MFConvenience.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF11221E6805F003B2FB9 /* NSLayoutConstraint+MFConvenience.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF11721E6805F003B2FB9 /* UIColor+MFConvenience.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF11321E6805F003B2FB9 /* UIColor+MFConvenience.m */; }; - D29DF11821E6805F003B2FB9 /* NSLayoutConstraint+MFConvenience.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF11421E6805F003B2FB9 /* NSLayoutConstraint+MFConvenience.m */; }; - D29DF11C21E684A9003B2FB9 /* MVMCoreUISplitViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF11A21E684A9003B2FB9 /* MVMCoreUISplitViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF11D21E684A9003B2FB9 /* MVMCoreUISplitViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF11B21E684A9003B2FB9 /* MVMCoreUISplitViewController.m */; }; - D29DF12921E6851E003B2FB9 /* MVMCoreUITopAlertMainView.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF11F21E6851E003B2FB9 /* MVMCoreUITopAlertMainView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF12A21E6851E003B2FB9 /* MVMCoreUITopAlertView.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF12021E6851E003B2FB9 /* MVMCoreUITopAlertView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF12B21E6851E003B2FB9 /* MVMCoreUITopAlertExpandableView.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF12121E6851E003B2FB9 /* MVMCoreUITopAlertExpandableView.m */; }; - D29DF12C21E6851E003B2FB9 /* MVMCoreUITopAlertShortView.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF12221E6851E003B2FB9 /* MVMCoreUITopAlertShortView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF12D21E6851E003B2FB9 /* MVMCoreUITopAlertBaseView.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF12321E6851E003B2FB9 /* MVMCoreUITopAlertBaseView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF12E21E6851E003B2FB9 /* MVMCoreUITopAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF12421E6851E003B2FB9 /* MVMCoreUITopAlertView.m */; }; - D29DF12F21E6851E003B2FB9 /* MVMCoreUITopAlertMainView.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF12521E6851E003B2FB9 /* MVMCoreUITopAlertMainView.m */; }; - D29DF13021E6851E003B2FB9 /* MVMCoreUITopAlertShortView.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF12621E6851E003B2FB9 /* MVMCoreUITopAlertShortView.m */; }; - D29DF13121E6851E003B2FB9 /* MVMCoreUITopAlertExpandableView.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF12721E6851E003B2FB9 /* MVMCoreUITopAlertExpandableView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF13221E6851E003B2FB9 /* MVMCoreUITopAlertBaseView.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF12821E6851E003B2FB9 /* MVMCoreUITopAlertBaseView.m */; }; - D29DF15421E69760003B2FB9 /* MVMCoreUIPanelButtonProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF15321E69760003B2FB9 /* MVMCoreUIPanelButtonProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF16121E69996003B2FB9 /* MFViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF15F21E69996003B2FB9 /* MFViewController.m */; }; - D29DF16221E69996003B2FB9 /* MFViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF16021E69996003B2FB9 /* MFViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF17421E69E1F003B2FB9 /* MFCustomButton.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF16A21E69E1F003B2FB9 /* MFCustomButton.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF17521E69E1F003B2FB9 /* ButtonDelegateProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF16B21E69E1F003B2FB9 /* ButtonDelegateProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF17621E69E1F003B2FB9 /* PrimaryButton.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF16C21E69E1F003B2FB9 /* PrimaryButton.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF17A21E69E1F003B2FB9 /* MFCustomButton.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF17021E69E1F003B2FB9 /* MFCustomButton.m */; }; - D29DF17B21E69E1F003B2FB9 /* PrimaryButton.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF17121E69E1F003B2FB9 /* PrimaryButton.m */; }; - D29DF18021E69E49003B2FB9 /* MFView.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF17E21E69E2E003B2FB9 /* MFView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF18121E69E50003B2FB9 /* MFView.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF17F21E69E2E003B2FB9 /* MFView.m */; }; - D29DF18221E69E54003B2FB9 /* SeparatorView.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF15921E697DA003B2FB9 /* SeparatorView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF18321E69E54003B2FB9 /* SeparatorView.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF15A21E697DA003B2FB9 /* SeparatorView.m */; }; - D29DF25921E6A22D003B2FB9 /* MFButtonProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF25821E6A22D003B2FB9 /* MFButtonProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF26C21E6AA0B003B2FB9 /* FLAnimatedImage.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF26821E6AA0B003B2FB9 /* FLAnimatedImage.m */; }; - D29DF26D21E6AA0B003B2FB9 /* FLAnimatedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF26921E6AA0B003B2FB9 /* FLAnimatedImageView.m */; }; - D29DF26E21E6AA0B003B2FB9 /* FLAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF26A21E6AA0B003B2FB9 /* FLAnimatedImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF26F21E6AA0B003B2FB9 /* FLAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF26B21E6AA0B003B2FB9 /* FLAnimatedImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF27521E79E81003B2FB9 /* MVMCoreUILoggingHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF27321E79E81003B2FB9 /* MVMCoreUILoggingHandler.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF27621E79E81003B2FB9 /* MVMCoreUILoggingHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF27421E79E81003B2FB9 /* MVMCoreUILoggingHandler.m */; }; - D29DF27921E7A533003B2FB9 /* MVMCoreUISession.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF27721E7A533003B2FB9 /* MVMCoreUISession.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF27A21E7A533003B2FB9 /* MVMCoreUISession.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF27821E7A533003B2FB9 /* MVMCoreUISession.m */; }; - D29DF28021E7AA51003B2FB9 /* MVMCoreUIDetailViewProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF27F21E7AA50003B2FB9 /* MVMCoreUIDetailViewProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF28321E7AB24003B2FB9 /* MVMCoreUICommonViewsUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF28121E7AB23003B2FB9 /* MVMCoreUICommonViewsUtility.m */; }; - D29DF28421E7AB24003B2FB9 /* MVMCoreUICommonViewsUtility.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF28221E7AB24003B2FB9 /* MVMCoreUICommonViewsUtility.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF28B21E7AC2B003B2FB9 /* ViewConstrainingView.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF28721E7AC2B003B2FB9 /* ViewConstrainingView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF28C21E7AC2B003B2FB9 /* ViewConstrainingView.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF28821E7AC2B003B2FB9 /* ViewConstrainingView.m */; }; - D29DF29521E7ADB8003B2FB9 /* MFProgrammaticScrollViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF28D21E7ADB8003B2FB9 /* MFProgrammaticScrollViewController.m */; }; - D29DF29621E7ADB8003B2FB9 /* StackableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF28E21E7ADB8003B2FB9 /* StackableViewController.m */; }; - D29DF29721E7ADB8003B2FB9 /* MFScrollingViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF28F21E7ADB8003B2FB9 /* MFScrollingViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF29821E7ADB8003B2FB9 /* MFScrollingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF29021E7ADB8003B2FB9 /* MFScrollingViewController.m */; }; - D29DF29921E7ADB8003B2FB9 /* MFProgrammaticScrollViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF29121E7ADB8003B2FB9 /* MFProgrammaticScrollViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF29A21E7ADB8003B2FB9 /* MFProgrammaticTableViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF29221E7ADB8003B2FB9 /* MFProgrammaticTableViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF29B21E7ADB9003B2FB9 /* StackableViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF29321E7ADB8003B2FB9 /* StackableViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF29C21E7ADB9003B2FB9 /* MFProgrammaticTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF29421E7ADB8003B2FB9 /* MFProgrammaticTableViewController.m */; }; - D29DF29D21E7AE38003B2FB9 /* MFStyler.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF13821E68636003B2FB9 /* MFStyler.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF29E21E7AE3B003B2FB9 /* MFStyler.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF13921E68637003B2FB9 /* MFStyler.m */; }; - D29DF2A121E7AF4E003B2FB9 /* MVMCoreUIUtility.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF29F21E7AF4E003B2FB9 /* MVMCoreUIUtility.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF2A221E7AF4E003B2FB9 /* MVMCoreUIUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF2A021E7AF4E003B2FB9 /* MVMCoreUIUtility.m */; }; - D29DF2A921E7B2F9003B2FB9 /* MVMCoreUIConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF2A721E7B2F9003B2FB9 /* MVMCoreUIConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF2AA21E7B2F9003B2FB9 /* MVMCoreUIConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF2A821E7B2F9003B2FB9 /* MVMCoreUIConstants.m */; }; - D29DF2AE21E7B3A4003B2FB9 /* MFTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF2AB21E7B3A4003B2FB9 /* MFTextView.m */; }; - D29DF2AF21E7B3A4003B2FB9 /* MFTextView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D29DF2AC21E7B3A4003B2FB9 /* MFTextView.xib */; }; - D29DF2B021E7B3A4003B2FB9 /* MFTextView.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF2AD21E7B3A4003B2FB9 /* MFTextView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF2B321E7B76D003B2FB9 /* MFLoadingSpinner.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF2B121E7B76C003B2FB9 /* MFLoadingSpinner.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF2B421E7B76D003B2FB9 /* MFLoadingSpinner.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF2B221E7B76D003B2FB9 /* MFLoadingSpinner.m */; }; - D29DF2BC21E7BEA4003B2FB9 /* TopTabbar.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF2B821E7BEA4003B2FB9 /* TopTabbar.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF2BD21E7BEA4003B2FB9 /* MVMCoreUITabBarPageControlViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF2B921E7BEA4003B2FB9 /* MVMCoreUITabBarPageControlViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF2BE21E7BEA4003B2FB9 /* TopTabbar.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF2BA21E7BEA4003B2FB9 /* TopTabbar.m */; }; - D29DF2BF21E7BEA4003B2FB9 /* MVMCoreUITabBarPageControlViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF2BB21E7BEA4003B2FB9 /* MVMCoreUITabBarPageControlViewController.m */; }; - D29DF2C421E7BF57003B2FB9 /* MFTabBarSwipeAnimator.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF2C021E7BF56003B2FB9 /* MFTabBarSwipeAnimator.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF2C521E7BF57003B2FB9 /* MFTabBarSwipeAnimator.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF2C121E7BF57003B2FB9 /* MFTabBarSwipeAnimator.m */; }; - D29DF2C621E7BF57003B2FB9 /* MFTabBarInteractor.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF2C221E7BF57003B2FB9 /* MFTabBarInteractor.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF2C721E7BF57003B2FB9 /* MFTabBarInteractor.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF2C321E7BF57003B2FB9 /* MFTabBarInteractor.m */; }; - D29DF2C821E7BFC1003B2FB9 /* MFSizeObject.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF14521E68728003B2FB9 /* MFSizeObject.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF2C921E7BFC6003B2FB9 /* MFSizeObject.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF14421E68728003B2FB9 /* MFSizeObject.m */; }; - D29DF2CA21E7BFC8003B2FB9 /* MFSizeThreshold.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF14621E68728003B2FB9 /* MFSizeThreshold.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF2CB21E7BFCC003B2FB9 /* MFSizeThreshold.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF14721E68728003B2FB9 /* MFSizeThreshold.m */; }; - D29DF2CE21E7C104003B2FB9 /* MFLoadingViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF2CC21E7C104003B2FB9 /* MFLoadingViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF2CF21E7C104003B2FB9 /* MFLoadingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF2CD21E7C104003B2FB9 /* MFLoadingViewController.m */; }; - D29DF2E121E9240B003B2FB9 /* MVMCoreUIPanelProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF2E021E9240B003B2FB9 /* MVMCoreUIPanelProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF2EE21ECEADF003B2FB9 /* MFFonts.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF14D21E693AD003B2FB9 /* MFFonts.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF2EF21ECEAE1003B2FB9 /* MFFonts.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF14C21E693AD003B2FB9 /* MFFonts.m */; }; - D29DF31B21ECECC0003B2FB9 /* OCRAExtended.ttf in Resources */ = {isa = PBXBuildFile; fileRef = D29DF31721ECECC0003B2FB9 /* OCRAExtended.ttf */; }; - D29DF32021ED0CBA003B2FB9 /* LabelView.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF31E21ED0CBA003B2FB9 /* LabelView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF32121ED0CBA003B2FB9 /* LabelView.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF31F21ED0CBA003B2FB9 /* LabelView.m */; }; - D29DF32421ED0DA2003B2FB9 /* TextButtonView.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF32221ED0DA2003B2FB9 /* TextButtonView.m */; }; - D29DF32521ED0DA2003B2FB9 /* TextButtonView.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF32321ED0DA2003B2FB9 /* TextButtonView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29DF32C21EE8736003B2FB9 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = D29DF32821EE8736003B2FB9 /* Localizable.strings */; }; - D29DF32E21EE8C3D003B2FB9 /* Media.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D29DF32D21EE8C3D003B2FB9 /* Media.xcassets */; }; - D29E28D823D21AB800ACEA85 /* StringAndMoleculeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D29E28D723D21AB800ACEA85 /* StringAndMoleculeView.swift */; }; - D29E28DA23D21AFA00ACEA85 /* StringAndMoleculeModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D29E28D923D21AFA00ACEA85 /* StringAndMoleculeModel.swift */; }; - D29E28DD23D7404C00ACEA85 /* ContainerHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = D29E28DC23D7404C00ACEA85 /* ContainerHelper.swift */; }; - D2A514582211C53C00345BFB /* MVMCoreUIMoleculeMappingObject.h in Headers */ = {isa = PBXBuildFile; fileRef = D2A514562211C53C00345BFB /* MVMCoreUIMoleculeMappingObject.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D2A514592211C53C00345BFB /* MVMCoreUIMoleculeMappingObject.m in Sources */ = {isa = PBXBuildFile; fileRef = D2A514572211C53C00345BFB /* MVMCoreUIMoleculeMappingObject.m */; }; - D2A5145D2211D22A00345BFB /* MVMCoreUIMoleculeViewProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = D2A5145C2211D22A00345BFB /* MVMCoreUIMoleculeViewProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D2A5145F2211DDC100345BFB /* MoleculeStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A5145E2211DDC100345BFB /* MoleculeStackView.swift */; }; - D2A5146122121FBF00345BFB /* MoleculeStackTemplate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A5146022121FBF00345BFB /* MoleculeStackTemplate.swift */; }; - D2A514632213643100345BFB /* MoleculeStackCenteredTemplate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A514622213643100345BFB /* MoleculeStackCenteredTemplate.swift */; }; - D2A514672213885800345BFB /* MoleculeHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A514662213885800345BFB /* MoleculeHeaderView.swift */; }; - D2A5146B2214905000345BFB /* ThreeLayerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A5146A2214905000345BFB /* ThreeLayerViewController.swift */; }; - D2A638FD22CA98280052ED1F /* HeadlineBody.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A638FC22CA98280052ED1F /* HeadlineBody.swift */; }; - D2A6390122CBB1820052ED1F /* Carousel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A6390022CBB1820052ED1F /* Carousel.swift */; }; - D2A6390522CBCE160052ED1F /* MoleculeCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A6390422CBCE160052ED1F /* MoleculeCollectionViewCell.swift */; }; - D2A92882241AAB67004E01C6 /* ScrollingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A92881241AAB67004E01C6 /* ScrollingViewController.swift */; }; - D2A92884241ACB25004E01C6 /* ProgrammaticScrollViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A92883241ACB25004E01C6 /* ProgrammaticScrollViewController.swift */; }; - D2A92886241ACD99004E01C6 /* ProgrammaticTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A92885241ACD99004E01C6 /* ProgrammaticTableViewController.swift */; }; - D2B18B7F2360913400A9AEDC /* Control.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2B18B7E2360913400A9AEDC /* Control.swift */; }; - D2B18B812360945C00A9AEDC /* View.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2B18B802360945C00A9AEDC /* View.swift */; }; - D2B18B922361E65A00A9AEDC /* CoreUIObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2B18B912361E65A00A9AEDC /* CoreUIObject.swift */; }; - D2B18B94236214AD00A9AEDC /* NavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2B18B93236214AD00A9AEDC /* NavigationController.swift */; }; - D2B1E3E522F37D6A0065F95C /* ImageHeadlineBody.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2B1E3E422F37D6A0065F95C /* ImageHeadlineBody.swift */; }; - D2C5001821F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.h in Headers */ = {isa = PBXBuildFile; fileRef = D2C5001621F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D2C5001921F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.m in Sources */ = {isa = PBXBuildFile; fileRef = D2C5001721F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.m */; }; - D2C521A923EDE79E00CA2634 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2C521A823EDE79E00CA2634 /* ViewController.swift */; }; - D2C78CD224228BBD00B69FDE /* ActionOpenPanelModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2C78CD124228BBD00B69FDE /* ActionOpenPanelModel.swift */; }; - D2D6CD4022E78C1A00D701B8 /* Scroller.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2D6CD3F22E78C1A00D701B8 /* Scroller.swift */; }; - D2D6CD4222E78FAB00D701B8 /* ThreeLayerTemplate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2D6CD4122E78FAB00D701B8 /* ThreeLayerTemplate.swift */; }; - D2D90B42240463E100DD6EC9 /* MoleculeHeaderModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2D90B41240463E100DD6EC9 /* MoleculeHeaderModel.swift */; }; - D2D90B442404789000DD6EC9 /* MoleculeContainerProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2D90B432404789000DD6EC9 /* MoleculeContainerProtocol.swift */; }; - D2E1FADB2260D3D200AEFD8C /* MVMCoreUIDelegateObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E1FADA2260D3D200AEFD8C /* MVMCoreUIDelegateObject.swift */; }; - D2E1FADF2268B8E700AEFD8C /* ThreeLayerTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E1FADE2268B8E700AEFD8C /* ThreeLayerTableViewController.swift */; }; - D2E1FAE12268E81D00AEFD8C /* MoleculeListTemplate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E1FAE02268E81D00AEFD8C /* MoleculeListTemplate.swift */; }; - D2E2A98323D8B32D000B42E6 /* EyebrowHeadlineBodyLinkModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E2A98223D8B32D000B42E6 /* EyebrowHeadlineBodyLinkModel.swift */; }; - D2E2A99423D8CCBC000B42E6 /* HeadlineBodyLinkModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E2A99323D8CCBC000B42E6 /* HeadlineBodyLinkModel.swift */; }; - D2E2A99623D8CF85000B42E6 /* HeadlineBodyLinkToggleModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E2A99523D8CF85000B42E6 /* HeadlineBodyLinkToggleModel.swift */; }; - D2E2A99823D8D63C000B42E6 /* ActionDetailWithImageModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E2A99723D8D63C000B42E6 /* ActionDetailWithImageModel.swift */; }; - D2E2A99A23D8D6B4000B42E6 /* HeadlineBodyButtonModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E2A99923D8D6B4000B42E6 /* HeadlineBodyButtonModel.swift */; }; - D2E2A99C23D8D975000B42E6 /* ImageHeadlineBodyModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E2A99B23D8D975000B42E6 /* ImageHeadlineBodyModel.swift */; }; - D2E2A99D23DA3217000B42E6 /* UIStackViewAlignment+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A209CD223A7E2810068F8B0 /* UIStackViewAlignment+Extension.swift */; }; - D2E2A99F23E07F8A000B42E6 /* PillButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E2A99E23E07F8A000B42E6 /* PillButton.swift */; }; - D2E2A9A123E095AB000B42E6 /* ButtonModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E2A9A023E095AB000B42E6 /* ButtonModelProtocol.swift */; }; - D2E2A9A323E096B1000B42E6 /* DisableableModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E2A9A223E096B1000B42E6 /* DisableableModelProtocol.swift */; }; - D2FB151B23A2B65B00C20E10 /* MoleculeContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2FB151A23A2B65B00C20E10 /* MoleculeContainer.swift */; }; - D2FB151D23A40F1500C20E10 /* MoleculeStackItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2FB151C23A40F1500C20E10 /* MoleculeStackItem.swift */; }; - DB06250B2293456500B72DD3 /* LeftRightLabelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB06250A2293456500B72DD3 /* LeftRightLabelView.swift */; }; - DBC4391822442197001AB423 /* CaretView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBC4391622442196001AB423 /* CaretView.swift */; }; - DBC4391922442197001AB423 /* DashLine.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBC4391722442197001AB423 /* DashLine.swift */; }; - DBC4391B224421A0001AB423 /* CaretLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBC4391A224421A0001AB423 /* CaretLink.swift */; }; - DBC4392122491730001AB423 /* LabelWithInternalButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBC4391C2245232D001AB423 /* LabelWithInternalButton.swift */; }; - DBEFFA04225A829700230692 /* Label.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB891E822253FA8500022516 /* Label.swift */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 01004F2F22721C3800991ECC /* RadioButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadioButton.swift; sourceTree = ""; }; - 0103B84D23D7E33A009C315C /* HeadlineBodyToggleModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadlineBodyToggleModel.swift; sourceTree = ""; }; - 0105618A224BBE7700E1557D /* FormValidator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FormValidator.swift; sourceTree = ""; }; - 0116A4E4228B19640094F3ED /* RadioButtonSelectionHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadioButtonSelectionHelper.swift; sourceTree = ""; }; - 011B58EF23A2AA980085F53C /* ListItemModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListItemModelProtocol.swift; sourceTree = ""; }; - 011B58F123A2AE2C0085F53C /* DropDownListItemModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DropDownListItemModel.swift; sourceTree = ""; }; - 011D958424042432000E3791 /* RulesProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RulesProtocol.swift; sourceTree = ""; }; - 011D958624042492000E3791 /* FormFieldProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FormFieldProtocol.swift; sourceTree = ""; }; - 011D95882404249B000E3791 /* FormHolderModelProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FormHolderModelProtocol.swift; sourceTree = ""; }; - 011D959A240451E3000E3791 /* RuleRequiredModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RuleRequiredModel.swift; sourceTree = ""; }; - 011D959C2404536F000E3791 /* RuleAnyValueChangedModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RuleAnyValueChangedModel.swift; sourceTree = ""; }; - 011D959E240453A1000E3791 /* RuleAllValueChangedModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RuleAllValueChangedModel.swift; sourceTree = ""; }; - 011D95A0240453D0000E3791 /* RuleEqualsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RuleEqualsModel.swift; sourceTree = ""; }; - 011D95A2240453F8000E3791 /* RuleRegexModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RuleRegexModel.swift; sourceTree = ""; }; - 011D95A4240455DC000E3791 /* FormGroupRule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FormGroupRule.swift; sourceTree = ""; }; - 011D95A824057AC7000E3791 /* FormActionFieldProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FormActionFieldProtocol.swift; sourceTree = ""; }; - 011D95AA2405C553000E3791 /* FormItemProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FormItemProtocol.swift; sourceTree = ""; }; - 011D95AC2406BB57000E3791 /* FormHolderProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FormHolderProtocol.swift; sourceTree = ""; }; - 011D95AE2407266E000E3791 /* RadioButtonModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadioButtonModel.swift; sourceTree = ""; }; - 011D9601240DA20A000E3791 /* ValidProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ValidProtocol.swift; sourceTree = ""; }; - 011D9625240EBB16000E3791 /* RadioButtonLabelModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RadioButtonLabelModel.swift; sourceTree = ""; }; - 011D9627240EFA1E000E3791 /* MFViewController+Form.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MFViewController+Form.swift"; sourceTree = ""; }; - 012A889B23889E8400FE3DA1 /* TemplateModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TemplateModelProtocol.swift; sourceTree = ""; }; - 012A88AC238C418100FE3DA1 /* TemplateProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TemplateProtocol.swift; sourceTree = ""; }; - 012A88AE238C626E00FE3DA1 /* CarouselModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarouselModel.swift; sourceTree = ""; }; - 012A88B0238C880100FE3DA1 /* CarouselPagingModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarouselPagingModelProtocol.swift; sourceTree = ""; }; - 012A88C1238D7BCA00FE3DA1 /* CarouselItemModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarouselItemModel.swift; sourceTree = ""; }; - 012A88C3238D86E600FE3DA1 /* CarouselItemModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarouselItemModelProtocol.swift; sourceTree = ""; }; - 012A88C5238DA34000FE3DA1 /* ModuleMoleculeModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModuleMoleculeModel.swift; sourceTree = ""; }; - 012A88C7238DB02000FE3DA1 /* ModelMoleculeDelegateProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModelMoleculeDelegateProtocol.swift; sourceTree = ""; }; - 012A88EB238F084D00FE3DA1 /* FooterModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FooterModel.swift; sourceTree = ""; }; - 012A88F023985E0100FE3DA1 /* Color.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Color.swift; sourceTree = ""; }; - 012CA99D2385A2D3003F810F /* MFView+ModelExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MFView+ModelExtension.swift"; sourceTree = ""; }; - 013F801823FB4A8E00AD8013 /* UIContentMode+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIContentMode+Extension.swift"; sourceTree = ""; }; - 014AA72123C501E2006F3E93 /* MoleculeContainerModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MoleculeContainerModel.swift; sourceTree = ""; }; - 014AA72223C501E2006F3E93 /* ContainerModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContainerModel.swift; sourceTree = ""; }; - 014AA72323C501E2006F3E93 /* ContainerModelProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContainerModelProtocol.swift; sourceTree = ""; }; - 014AA72823C5059B006F3E93 /* StackPageTemplateModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StackPageTemplateModel.swift; sourceTree = ""; }; - 014AA72923C5059B006F3E93 /* StackCenteredPageTemplateModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StackCenteredPageTemplateModel.swift; sourceTree = ""; }; - 014AA72A23C5059B006F3E93 /* ThreeLayerPageTemplateModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThreeLayerPageTemplateModel.swift; sourceTree = ""; }; - 014AA72C23C5059B006F3E93 /* ListPageTemplateModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListPageTemplateModel.swift; sourceTree = ""; }; - 01509D8E2327EC6F00EF99AA /* MoleculeTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MoleculeTableViewCell.swift; sourceTree = ""; }; - 01509D902327ECE600EF99AA /* CornerLabels.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CornerLabels.swift; sourceTree = ""; }; - 01509D922327ECFB00EF99AA /* ProgressBar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProgressBar.swift; sourceTree = ""; }; - 01509D942327ED1900EF99AA /* HeadlineBodyLinkToggle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeadlineBodyLinkToggle.swift; sourceTree = ""; }; - 017BEB372360C6AC0024EF95 /* RadioButtonLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RadioButtonLabel.swift; sourceTree = ""; }; - 017BEB3B2361EA1D0024EF95 /* MFViewController+Model.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MFViewController+Model.swift"; sourceTree = ""; }; - 017BEB3F23620A230024EF95 /* TextFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextFieldModel.swift; sourceTree = ""; }; - 017BEB432362192F0024EF95 /* MVMCoreUIMoleculeMappingObject+ModelExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MVMCoreUIMoleculeMappingObject+ModelExtension.swift"; sourceTree = ""; }; - 017BEB47236230DB0024EF95 /* MoleculeViewProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoleculeViewProtocol.swift; sourceTree = ""; }; - 017BEB49236235BA0024EF95 /* ModelMoleculeViewProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModelMoleculeViewProtocol.swift; sourceTree = ""; }; - 017BEB7A236763000024EF95 /* LineModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LineModel.swift; sourceTree = ""; }; - 017BEB7E23676E870024EF95 /* MoleculeObjectMapping.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoleculeObjectMapping.swift; sourceTree = ""; }; - 0198F7A02256A80A0066C936 /* MFRadioButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFRadioButton.h; sourceTree = ""; }; - 0198F7A22256A80A0066C936 /* MFRadioButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFRadioButton.m; sourceTree = ""; }; - 01C851D223CF9E740021F976 /* LabelToggleModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelToggleModel.swift; sourceTree = ""; }; - 01EB3683236097C0006832FA /* MoleculeModelProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MoleculeModelProtocol.swift; sourceTree = ""; }; - 01EB368823609801006832FA /* LabelModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LabelModel.swift; sourceTree = ""; }; - 01EB368923609801006832FA /* MoleculeListItemModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MoleculeListItemModel.swift; sourceTree = ""; }; - 01EB368A23609801006832FA /* MoleculeStackItemModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MoleculeStackItemModel.swift; sourceTree = ""; }; - 01EB368B23609801006832FA /* MoleculeStackModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MoleculeStackModel.swift; sourceTree = ""; }; - 01EB368C23609801006832FA /* HeaderModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeaderModel.swift; sourceTree = ""; }; - 01EB368D23609801006832FA /* HeadlineBodyModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeadlineBodyModel.swift; sourceTree = ""; }; - 01F2A03123A4498200D954D8 /* CaretLinkModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaretLinkModel.swift; sourceTree = ""; }; - 0A12149F22C11A17007C7030 /* ActionDetailWithImage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActionDetailWithImage.swift; sourceTree = ""; }; - 0A14F69223E349EF00EDF7F7 /* CarouselIndicator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarouselIndicator.swift; sourceTree = ""; }; - 0A14F6A423E4803A00EDF7F7 /* StackView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StackView.swift; sourceTree = ""; }; - 0A14F6A823E8750300EDF7F7 /* CarouselIndicatorModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarouselIndicatorModel.swift; sourceTree = ""; }; - 0A14F6B323E8C29700EDF7F7 /* NumericIndicatorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NumericIndicatorView.swift; sourceTree = ""; }; - 0A209CD223A7E2810068F8B0 /* UIStackViewAlignment+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIStackViewAlignment+Extension.swift"; sourceTree = ""; }; - 0A21DB7E235DECC500C160A2 /* EntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EntryField.swift; sourceTree = ""; }; - 0A21DB82235DFBC500C160A2 /* MdnEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MdnEntryField.swift; sourceTree = ""; }; - 0A21DB93235E24ED00C160A2 /* DigitEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DigitEntryField.swift; sourceTree = ""; }; - 0A41BA6D2344FCD400D4C0BC /* CATransaction+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CATransaction+Extension.swift"; sourceTree = ""; }; - 0A41BA7E23453A6400D4C0BC /* TextEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextEntryField.swift; sourceTree = ""; }; - 0A4253AE23F5C2C000554656 /* BarsIndicatorView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BarsIndicatorView.swift; sourceTree = ""; }; - 0A5D59C123AD2F5700EFD9E9 /* AppleGuidelinesProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppleGuidelinesProtocol.swift; sourceTree = ""; }; - 0A69F610241BDEA700F7231B /* RuleAnyRequiredModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RuleAnyRequiredModel.swift; sourceTree = ""; }; - 0A6BF4712360C56C0028F841 /* BaseDropdownEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseDropdownEntryField.swift; sourceTree = ""; }; - 0A7918F423F5E7EA00772FF4 /* ImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageView.swift; sourceTree = ""; }; - 0A7BAD73232A8DC700FB8E22 /* HeadlineBodyButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadlineBodyButton.swift; sourceTree = ""; }; - 0A7BAFA0232BE61800FB8E22 /* Checkbox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Checkbox.swift; sourceTree = ""; }; - 0A7BAFA2232BE63400FB8E22 /* CheckboxLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckboxLabel.swift; sourceTree = ""; }; - 0A7EF85A23D8A52800B2AAD1 /* EntryFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EntryFieldModel.swift; sourceTree = ""; }; - 0A7EF85C23D8A95600B2AAD1 /* TextEntryFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextEntryFieldModel.swift; sourceTree = ""; }; - 0A7EF85E23D8ABC500B2AAD1 /* MdnEntryFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MdnEntryFieldModel.swift; sourceTree = ""; }; - 0A7EF86023D8AC2500B2AAD1 /* DigitEntryFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DigitEntryFieldModel.swift; sourceTree = ""; }; - 0A7EF86223D8AFA000B2AAD1 /* BaseDropdownEntryFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseDropdownEntryFieldModel.swift; sourceTree = ""; }; - 0A7EF86423D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemDropdownEntryFieldModel.swift; sourceTree = ""; }; - 0A7EF86623D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateDropdownEntryFieldModel.swift; sourceTree = ""; }; - 0A8321AE2355FE9500CB7F00 /* DigitBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DigitBox.swift; sourceTree = ""; }; - 0AA33B33239813C50067DD0F /* UIColor+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+Extension.swift"; sourceTree = ""; }; - 0AA33B392398524F0067DD0F /* Toggle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Toggle.swift; sourceTree = ""; }; - 0AAF8E29240EA57D008DD263 /* BarsCarouselIndicatorModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BarsCarouselIndicatorModel.swift; sourceTree = ""; }; - 0AAF8E2B240EA594008DD263 /* NumericCarouselIndicatorModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NumericCarouselIndicatorModel.swift; sourceTree = ""; }; - 0ABD136C237CAD1E0081388D /* DateDropdownEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateDropdownEntryField.swift; sourceTree = ""; }; - 0ABD1370237DB0450081388D /* ItemDropdownEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemDropdownEntryField.swift; sourceTree = ""; }; - 0AE14F63238315D2005417F8 /* TextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextField.swift; sourceTree = ""; }; - 0AE98BAE23FEF956004C5109 /* ExternalLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExternalLink.swift; sourceTree = ""; }; - 0AE98BB223FF0934004C5109 /* ExternalLinkModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExternalLinkModel.swift; sourceTree = ""; }; - 0AE98BB423FF18D2004C5109 /* Arrow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Arrow.swift; sourceTree = ""; }; - 0AE98BB623FF18E9004C5109 /* ArrowModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArrowModel.swift; sourceTree = ""; }; - 31BE15C923D8924C00452370 /* CheckboxLabelModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CheckboxLabelModel.swift; sourceTree = ""; }; - 31BE15CA23D8924C00452370 /* CheckboxModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CheckboxModel.swift; sourceTree = ""; }; - 522679BF23FE886900906CBA /* ListLeftVariableCheckboxAllTextAndLinks.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListLeftVariableCheckboxAllTextAndLinks.swift; sourceTree = ""; }; - 522679C023FE886900906CBA /* ListLeftVariableCheckboxAllTextAndLinksModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListLeftVariableCheckboxAllTextAndLinksModel.swift; sourceTree = ""; }; - 52267A0623FFE25000906CBA /* ListOneColumnFullWidthTextAllTextAndLinks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListOneColumnFullWidthTextAllTextAndLinks.swift; sourceTree = ""; }; - 5248BFEA23F12E350059236A /* ListThreeColumnPlanDataDivider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListThreeColumnPlanDataDivider.swift; sourceTree = ""; }; - 5248BFEB23F12E350059236A /* ListThreeColumnPlanDataDividerModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListThreeColumnPlanDataDividerModel.swift; sourceTree = ""; }; - 525019DB2406430700EED91C /* ListProgressBarDataModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListProgressBarDataModel.swift; sourceTree = ""; }; - 525019DC2406430800EED91C /* ListProgressBarData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListProgressBarData.swift; sourceTree = ""; }; - 525019E42406852100EED91C /* ListFourColumnDataUsageDividerModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListFourColumnDataUsageDividerModel.swift; sourceTree = ""; }; - 525019E62406853600EED91C /* ListFourColumnDataUsageDivider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListFourColumnDataUsageDivider.swift; sourceTree = ""; }; - 525239BF2407BCFF00454969 /* ListTwoColumnPriceDetailsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListTwoColumnPriceDetailsModel.swift; sourceTree = ""; }; - 525239C12407BD1000454969 /* ListTwoColumnPriceDetails.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListTwoColumnPriceDetails.swift; sourceTree = ""; }; - 526A265B240D1FF700B0D828 /* ListTwoColumnCompareChangesModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListTwoColumnCompareChangesModel.swift; sourceTree = ""; }; - 526A265D240D200500B0D828 /* ListTwoColumnCompareChanges.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListTwoColumnCompareChanges.swift; sourceTree = ""; }; - 52B201D024081CFB00D2011E /* ListLeftVariableRadioButtonAndPaymentMethod.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListLeftVariableRadioButtonAndPaymentMethod.swift; sourceTree = ""; }; - 52B201D124081CFB00D2011E /* ListLeftVariableRadioButtonAndPaymentMethodModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListLeftVariableRadioButtonAndPaymentMethodModel.swift; sourceTree = ""; }; - 8D070BAF241B56530099AC56 /* ListRightVariableTotalDataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListRightVariableTotalDataModel.swift; sourceTree = ""; }; - 8D070BB1241B56AD0099AC56 /* ListRightVariableTotalData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListRightVariableTotalData.swift; sourceTree = ""; }; - 8D084ACF2410BF4800951227 /* ListOneColumnFullWidthTextBodyTextModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListOneColumnFullWidthTextBodyTextModel.swift; sourceTree = ""; }; - 8D084AD12410BF7600951227 /* ListOneColumnFullWidthTextBodyText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListOneColumnFullWidthTextBodyText.swift; sourceTree = ""; }; - 8D24041023E7FB9E009E23BE /* ListLeftVariableIconWithRightCaret.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListLeftVariableIconWithRightCaret.swift; sourceTree = ""; }; - 8D24041423E7FC0B009E23BE /* ListLeftVariableIconWithRightCaretModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListLeftVariableIconWithRightCaretModel.swift; sourceTree = ""; }; - 8D448E5424050A46006211BB /* ListOneColumnFullWidthTextAllTextAndLinksModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListOneColumnFullWidthTextAllTextAndLinksModel.swift; sourceTree = ""; }; - 9402C34F23A2CEA3004B974C /* LeftRightLabelModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LeftRightLabelModel.swift; sourceTree = ""; }; - 942C372C241149170066E45E /* NHaasGroteskDSStd-75Bd.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "NHaasGroteskDSStd-75Bd.otf"; sourceTree = ""; }; - 942C372D241149170066E45E /* NHaasGroteskDSStd-55Rg.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "NHaasGroteskDSStd-55Rg.otf"; sourceTree = ""; }; - 942C378B2412F4FA0066E45E /* ModalMoleculeListTemplate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModalMoleculeListTemplate.swift; sourceTree = ""; }; - 942C378D2412F5B60066E45E /* ModalMoleculeStackTemplate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModalMoleculeStackTemplate.swift; sourceTree = ""; }; - 9432A79E23DB47BA00719041 /* EntryFieldContainer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EntryFieldContainer.swift; sourceTree = ""; }; - 943784F3236B77BB006A1E82 /* GraphView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphView.swift; sourceTree = ""; }; - 943784F4236B77BB006A1E82 /* GraphViewAnimationHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphViewAnimationHandler.swift; sourceTree = ""; }; - 9445890B2385BCE300DE9FD4 /* ProgressBarModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProgressBarModel.swift; sourceTree = ""; }; - 9445890D2385C3F800DE9FD4 /* MultiProgressModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultiProgressModel.swift; sourceTree = ""; }; - 9445891E2385D2E900DE9FD4 /* CaretViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaretViewModel.swift; sourceTree = ""; }; - 944589202385D6E900DE9FD4 /* DashLineModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DashLineModel.swift; sourceTree = ""; }; - 944589222385DA9500DE9FD4 /* ImageViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageViewModel.swift; sourceTree = ""; }; - 9455B19B234F8A0400A574DB /* MVMAnimationFramework.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MVMAnimationFramework.framework; path = ../SharedFrameworks/MVMAnimationFramework.framework; sourceTree = ""; }; - 9458C3152406C8FD00930963 /* UIFont+FontWrapping.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIFont+FontWrapping.h"; sourceTree = ""; }; - 9458C3162406C8FD00930963 /* UIFont+FontWrapping.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIFont+FontWrapping.m"; sourceTree = ""; }; - 948DB67D2326DCD90011F916 /* MultiProgress.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultiProgress.swift; sourceTree = ""; }; - 94AF4A3C23E9D13900676048 /* MFCaretButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MFCaretButton.h; sourceTree = ""; }; - 94AF4A3D23E9D13900676048 /* MFCaretButton.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MFCaretButton.m; sourceTree = ""; }; - 94AF4A4023E9D19E00676048 /* MFCaretView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MFCaretView.h; sourceTree = ""; }; - 94AF4A4123E9D19E00676048 /* MFCaretView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MFCaretView.m; sourceTree = ""; }; - 94C0150924215643005811A9 /* ActionTopAlertModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActionTopAlertModel.swift; sourceTree = ""; }; - 94C0150B2421564A005811A9 /* ActionCollapseNotificationModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActionCollapseNotificationModel.swift; sourceTree = ""; }; - 94C2D9832386F3F80006CF46 /* LabelAttributeModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelAttributeModel.swift; sourceTree = ""; }; - 94C2D9A023872BCC0006CF46 /* LabelAttributeUnderlineModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelAttributeUnderlineModel.swift; sourceTree = ""; }; - 94C2D9A223872C110006CF46 /* LabelAttributeStrikeThroughModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelAttributeStrikeThroughModel.swift; sourceTree = ""; }; - 94C2D9A423872C350006CF46 /* LabelAttributeFontModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelAttributeFontModel.swift; sourceTree = ""; }; - 94C2D9A623872DA90006CF46 /* LabelAttributeColorModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelAttributeColorModel.swift; sourceTree = ""; }; - 94C2D9A823872E5E0006CF46 /* LabelAttributeImageModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelAttributeImageModel.swift; sourceTree = ""; }; - 94C2D9AA23872EB50006CF46 /* LabelAttributeActionModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelAttributeActionModel.swift; sourceTree = ""; }; - 94CA227824058533002D6750 /* VerizonNHGeTX-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "VerizonNHGeTX-Bold.otf"; sourceTree = ""; }; - 94CA227924058533002D6750 /* VerizonNHGeDS-Regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "VerizonNHGeDS-Regular.otf"; sourceTree = ""; }; - 94CA227A24058533002D6750 /* VerizonNHGeDS-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "VerizonNHGeDS-Bold.otf"; sourceTree = ""; }; - 94CA227B24058533002D6750 /* VerizonNHGeTX-Regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "VerizonNHGeTX-Regular.otf"; sourceTree = ""; }; - 94F217B423E0BF6100A47C06 /* PrimaryButtonView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PrimaryButtonView.h; sourceTree = ""; }; - 94F217B523E0BF6100A47C06 /* PrimaryButtonView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PrimaryButtonView.m; sourceTree = ""; }; - 94FB966023D797DA003D482B /* MFTextButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFTextButton.h; sourceTree = ""; }; - 94FB966123D797DA003D482B /* MFTextButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFTextButton.m; sourceTree = ""; }; - AA11A41E23F15D3100D7962F /* ListRightVariablePayments.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListRightVariablePayments.swift; sourceTree = ""; }; - AA11A42023F15D7000D7962F /* ListRightVariablePaymentsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListRightVariablePaymentsModel.swift; sourceTree = ""; }; - AAA74A162410C04600080241 /* HeadersH2NoButtonsBodyText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadersH2NoButtonsBodyText.swift; sourceTree = ""; }; - AAA74A182410C05800080241 /* HeadersH2NoButtonsBodyTextModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadersH2NoButtonsBodyTextModel.swift; sourceTree = ""; }; - BB47A585241615EF002BB23C /* ListOneColumnFullWidthTextDividerSubsectionModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListOneColumnFullWidthTextDividerSubsectionModel.swift; sourceTree = ""; }; - BB47A587241615FA002BB23C /* ListOneColumnFullWidthTextDividerSubsection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListOneColumnFullWidthTextDividerSubsection.swift; sourceTree = ""; }; - BB6C6ABE242232DF005F7224 /* ListOneColumnTextWithWhitespaceDividerTallModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ListOneColumnTextWithWhitespaceDividerTallModel.swift; path = MVMCoreUI/Molecules/DesignedComponents/List/OneColumn/ListOneColumnTextWithWhitespaceDividerTallModel.swift; sourceTree = SOURCE_ROOT; }; - BB6C6ABF242232DF005F7224 /* ListOneColumnTextWithWhitespaceDividerTall.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ListOneColumnTextWithWhitespaceDividerTall.swift; path = MVMCoreUI/Molecules/DesignedComponents/List/OneColumn/ListOneColumnTextWithWhitespaceDividerTall.swift; sourceTree = SOURCE_ROOT; }; - BB6C6AC62422528F005F7224 /* ListOneColumnTextWithWhitespaceDividerShort.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListOneColumnTextWithWhitespaceDividerShort.swift; sourceTree = ""; }; - BB6C6AC72422528F005F7224 /* ListOneColumnTextWithWhitespaceDividerShortModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListOneColumnTextWithWhitespaceDividerShortModel.swift; sourceTree = ""; }; - C003506023AA94CD00B6AC29 /* Button.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Button.swift; sourceTree = ""; }; - C07065C32395677300FBF997 /* Link.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Link.swift; sourceTree = ""; }; - C695A67E23C9830600BFB94E /* UnOrderedListModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UnOrderedListModel.swift; sourceTree = ""; }; - C695A68023C9830D00BFB94E /* NumberedListModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NumberedListModel.swift; sourceTree = ""; }; - C695A69323C9909000BFB94E /* DoughnutChartModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DoughnutChartModel.swift; sourceTree = ""; }; - C695A69523C990BC00BFB94E /* DoughnutChart.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DoughnutChart.swift; sourceTree = ""; }; - C695A69723C990C200BFB94E /* DoughnutChartView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DoughnutChartView.swift; sourceTree = ""; }; - C6FA7D4F23C77A4700A3614A /* UnOrderedList.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UnOrderedList.swift; sourceTree = ""; }; - C6FA7D5023C77A4800A3614A /* StringAndMoleculeStack.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StringAndMoleculeStack.swift; sourceTree = ""; }; - C6FA7D5123C77A4900A3614A /* NumberedList.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NumberedList.swift; sourceTree = ""; }; - C7192E7C23C301750050C2A0 /* HeadLineBodyCaretLinkImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadLineBodyCaretLinkImage.swift; sourceTree = ""; }; - C7F8012023E8303200396FBD /* ListRVWheel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListRVWheel.swift; sourceTree = ""; }; - C7F8012223E846C300396FBD /* ListRVWheelModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListRVWheelModel.swift; sourceTree = ""; }; - D20A9A5D2243D3E300ADE781 /* TwoButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TwoButtonView.swift; sourceTree = ""; }; - D20FB164241A5D75004AFC3A /* NavigationItemModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationItemModelProtocol.swift; sourceTree = ""; }; - D213347623843825008E41B3 /* Line.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Line.swift; sourceTree = ""; }; - D21EE53B23AD3AD4003D1A30 /* NSLayoutConstraintAxis+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSLayoutConstraintAxis+Extension.swift"; sourceTree = ""; }; - D22479892314445E003FCCF9 /* LabelToggle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelToggle.swift; sourceTree = ""; }; - D224798B231450C8003FCCF9 /* HeadlineBodyToggle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadlineBodyToggle.swift; sourceTree = ""; }; - D22479932316AE5E003FCCF9 /* NSLayoutConstraintExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSLayoutConstraintExtension.swift; sourceTree = ""; }; - D22479952316AF6D003FCCF9 /* HeadlineBodyLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadlineBodyLink.swift; sourceTree = ""; }; - D224799A231965AD003FCCF9 /* AccordionMoleculeTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccordionMoleculeTableViewCell.swift; sourceTree = ""; }; - D22D1F18220341F50077CEC0 /* MVMCoreUICheckBox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreUICheckBox.h; sourceTree = ""; }; - D22D1F19220341F50077CEC0 /* MVMCoreUICheckBox.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUICheckBox.m; sourceTree = ""; }; - D22D1F1C220343560077CEC0 /* MVMCoreUICheckMarkView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreUICheckMarkView.h; sourceTree = ""; }; - D22D1F1D220343560077CEC0 /* MVMCoreUICheckMarkView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUICheckMarkView.m; sourceTree = ""; }; - D22D1F44220496A30077CEC0 /* MVMCoreUISwitch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreUISwitch.h; sourceTree = ""; }; - D22D1F45220496A30077CEC0 /* MVMCoreUISwitch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUISwitch.m; sourceTree = ""; }; - D22D1F542204CE5D0077CEC0 /* MVMCoreUIStackableViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIStackableViewController.h; sourceTree = ""; }; - D22D1F552204CE5D0077CEC0 /* MVMCoreUIStackableViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUIStackableViewController.m; sourceTree = ""; }; - D22D8392241C27B100D3DF69 /* TemplateModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TemplateModel.swift; sourceTree = ""; }; - D22D8394241FB41200D3DF69 /* UIStackView+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIStackView+Extension.swift"; sourceTree = ""; }; - D236E5B2241FEB1000C38625 /* ListTwoColumnPriceDescription.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListTwoColumnPriceDescription.swift; sourceTree = ""; }; - D236E5B3241FEB1000C38625 /* ListTwoColumnPriceDescriptionModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListTwoColumnPriceDescriptionModel.swift; sourceTree = ""; }; - D236E5B6242007C500C38625 /* MVMControllerModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MVMControllerModelProtocol.swift; sourceTree = ""; }; - D243859823A16B1800332775 /* Container.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Container.swift; sourceTree = ""; }; - D256E9922412880000360572 /* Header.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Header.swift; sourceTree = ""; }; - D260105223CEA61600764D80 /* ToggleModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToggleModel.swift; sourceTree = ""; }; - D260105423CEA7DC00764D80 /* MVMCoreUISwitch+Model.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MVMCoreUISwitch+Model.swift"; sourceTree = ""; }; - D260105823D0A92900764D80 /* ContainerProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContainerProtocol.swift; sourceTree = ""; }; - D260105A23D0BB7100764D80 /* StackModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StackModelProtocol.swift; sourceTree = ""; }; - D260105C23D0BCD400764D80 /* Stack.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Stack.swift; sourceTree = ""; }; - D260105E23D0BFFC00764D80 /* StackItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StackItem.swift; sourceTree = ""; }; - D260106023D0C02A00764D80 /* StackItemModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StackItemModelProtocol.swift; sourceTree = ""; }; - D260106223D0C05000764D80 /* StackItemModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StackItemModel.swift; sourceTree = ""; }; - D260106423D0CEA700764D80 /* StackModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StackModel.swift; sourceTree = ""; }; - D260D7AF22D65BDD007E7233 /* MVMCoreUIPageControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIPageControl.h; sourceTree = ""; }; - D260D7B022D65BDD007E7233 /* MVMCoreUIPageControl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUIPageControl.m; sourceTree = ""; }; - D260D7B522D68509007E7233 /* MVMCoreUIPagingProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIPagingProtocol.h; sourceTree = ""; }; - D268C70D238C22D7007F2C1C /* DropDownFilterTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DropDownFilterTableViewCell.swift; sourceTree = ""; }; - D26C5A6A23F4A40D007AEECE /* ListItemModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListItemModel.swift; sourceTree = ""; }; - D274CA322236A78900B01B62 /* FooterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FooterView.swift; sourceTree = ""; }; - D2755D7A23689C7500485468 /* TableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableViewCell.swift; sourceTree = ""; }; - D27CD40D2322EEAF00C1DC07 /* TabsTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabsTableViewCell.swift; sourceTree = ""; }; - D27CD40F2339057800C1DC07 /* EyebrowHeadlineBodyLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EyebrowHeadlineBodyLink.swift; sourceTree = ""; }; - D282AAB3223FDDAE00C46919 /* MFLoadImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MFLoadImageView.swift; sourceTree = ""; }; - D282AAB9224131D100C46919 /* MFTransparentGIFView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MFTransparentGIFView.swift; sourceTree = ""; }; - D282AACA2243C61700C46919 /* ButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonView.swift; sourceTree = ""; }; - D28A837623C79FC600DFE4FC /* MFCustomButton+ActionModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MFCustomButton+ActionModel.swift"; sourceTree = ""; }; - D28A837823C7D5BC00DFE4FC /* PageModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PageModelProtocol.swift; sourceTree = ""; }; - D28A837A23C928DA00DFE4FC /* MoleculeListCellProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoleculeListCellProtocol.swift; sourceTree = ""; }; - D28A837C23CCA86A00DFE4FC /* TabsListItemModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabsListItemModel.swift; sourceTree = ""; }; - D28A837E23CCA96400DFE4FC /* TabsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabsModel.swift; sourceTree = ""; }; - D28A838023CCB0D800DFE4FC /* AccordionListItemModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccordionListItemModel.swift; sourceTree = ""; }; - D28A838223CCBD3F00DFE4FC /* CircleProgressModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CircleProgressModel.swift; sourceTree = ""; }; - D28A838423CCCA8900DFE4FC /* ScrollerModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScrollerModel.swift; sourceTree = ""; }; - D28A838823CCCFCB00DFE4FC /* LinkModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LinkModel.swift; sourceTree = ""; }; - D28A838A23CCDA6B00DFE4FC /* ButtonModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonModel.swift; sourceTree = ""; }; - D28A838C23CCDCC200DFE4FC /* PrimaryButton+MoleculeProtocolExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PrimaryButton+MoleculeProtocolExtension.swift"; sourceTree = ""; }; - D28A838E23CCDEDE00DFE4FC /* TwoButtonViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TwoButtonViewModel.swift; sourceTree = ""; }; - D28A839023CD4FD400DFE4FC /* CornerLabelsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CornerLabelsModel.swift; sourceTree = ""; }; - D28A839223CE828900DFE4FC /* HeadlineBodyCaretLinkImageModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadlineBodyCaretLinkImageModel.swift; sourceTree = ""; }; - D296E14622A597490051EBE7 /* MVMCoreUIViewConstrainingProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIViewConstrainingProtocol.h; sourceTree = ""; }; - D29770C621F7C4AE00B2F0D0 /* TopLabelsView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TopLabelsView.m; sourceTree = ""; }; - D29770C721F7C4AE00B2F0D0 /* TopLabelsView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TopLabelsView.h; sourceTree = ""; }; - D29770EE21F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TopLabelsAndBottomButtonsTableViewController.m; sourceTree = ""; }; - D29770EF21F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TopLabelsAndBottomButtonsTableViewController.h; sourceTree = ""; }; - D29770F021F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TopLabelsAndBottomButtonsViewController.h; sourceTree = ""; }; - D29770F121F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TopLabelsAndBottomButtonsViewController.m; sourceTree = ""; }; - D29770FA21F7C77400B2F0D0 /* MVMCoreUITextFieldView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUITextFieldView.m; sourceTree = ""; }; - D29770FB21F7C77400B2F0D0 /* MVMCoreUITextFieldView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreUITextFieldView.h; sourceTree = ""; }; - D29B770F22C281F400D6ACE0 /* ModuleMolecule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModuleMolecule.swift; sourceTree = ""; }; - D29C94D4242901C9003813BA /* MVMCoreUICommonViewsUtility+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MVMCoreUICommonViewsUtility+Extension.swift"; sourceTree = ""; }; - D29DF0CC21E404D4003B2FB9 /* MVMCoreUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MVMCoreUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D29DF0CF21E404D4003B2FB9 /* MVMCoreUI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUI.h; sourceTree = ""; }; - D29DF0D021E404D4003B2FB9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - D29DF0E521E4F3C7003B2FB9 /* MVMCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = MVMCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D29DF11121E6805F003B2FB9 /* UIColor+MFConvenience.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIColor+MFConvenience.h"; sourceTree = ""; }; - D29DF11221E6805F003B2FB9 /* NSLayoutConstraint+MFConvenience.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSLayoutConstraint+MFConvenience.h"; sourceTree = ""; }; - D29DF11321E6805F003B2FB9 /* UIColor+MFConvenience.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIColor+MFConvenience.m"; sourceTree = ""; }; - D29DF11421E6805F003B2FB9 /* NSLayoutConstraint+MFConvenience.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSLayoutConstraint+MFConvenience.m"; sourceTree = ""; }; - D29DF11A21E684A9003B2FB9 /* MVMCoreUISplitViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreUISplitViewController.h; sourceTree = ""; }; - D29DF11B21E684A9003B2FB9 /* MVMCoreUISplitViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUISplitViewController.m; sourceTree = ""; }; - D29DF11F21E6851E003B2FB9 /* MVMCoreUITopAlertMainView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreUITopAlertMainView.h; sourceTree = ""; }; - D29DF12021E6851E003B2FB9 /* MVMCoreUITopAlertView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreUITopAlertView.h; sourceTree = ""; }; - D29DF12121E6851E003B2FB9 /* MVMCoreUITopAlertExpandableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUITopAlertExpandableView.m; sourceTree = ""; }; - D29DF12221E6851E003B2FB9 /* MVMCoreUITopAlertShortView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreUITopAlertShortView.h; sourceTree = ""; }; - D29DF12321E6851E003B2FB9 /* MVMCoreUITopAlertBaseView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreUITopAlertBaseView.h; sourceTree = ""; }; - D29DF12421E6851E003B2FB9 /* MVMCoreUITopAlertView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUITopAlertView.m; sourceTree = ""; }; - D29DF12521E6851E003B2FB9 /* MVMCoreUITopAlertMainView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUITopAlertMainView.m; sourceTree = ""; }; - D29DF12621E6851E003B2FB9 /* MVMCoreUITopAlertShortView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUITopAlertShortView.m; sourceTree = ""; }; - D29DF12721E6851E003B2FB9 /* MVMCoreUITopAlertExpandableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreUITopAlertExpandableView.h; sourceTree = ""; }; - D29DF12821E6851E003B2FB9 /* MVMCoreUITopAlertBaseView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUITopAlertBaseView.m; sourceTree = ""; }; - D29DF13821E68636003B2FB9 /* MFStyler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MFStyler.h; sourceTree = ""; }; - D29DF13921E68637003B2FB9 /* MFStyler.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MFStyler.m; sourceTree = ""; }; - D29DF14421E68728003B2FB9 /* MFSizeObject.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MFSizeObject.m; sourceTree = ""; }; - D29DF14521E68728003B2FB9 /* MFSizeObject.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MFSizeObject.h; sourceTree = ""; }; - D29DF14621E68728003B2FB9 /* MFSizeThreshold.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MFSizeThreshold.h; sourceTree = ""; }; - D29DF14721E68728003B2FB9 /* MFSizeThreshold.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MFSizeThreshold.m; sourceTree = ""; }; - D29DF14C21E693AD003B2FB9 /* MFFonts.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MFFonts.m; sourceTree = ""; }; - D29DF14D21E693AD003B2FB9 /* MFFonts.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MFFonts.h; sourceTree = ""; }; - D29DF15321E69760003B2FB9 /* MVMCoreUIPanelButtonProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIPanelButtonProtocol.h; sourceTree = ""; }; - D29DF15921E697DA003B2FB9 /* SeparatorView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SeparatorView.h; sourceTree = ""; }; - D29DF15A21E697DA003B2FB9 /* SeparatorView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SeparatorView.m; sourceTree = ""; }; - D29DF15F21E69996003B2FB9 /* MFViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFViewController.m; sourceTree = ""; }; - D29DF16021E69996003B2FB9 /* MFViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFViewController.h; sourceTree = ""; }; - D29DF16A21E69E1F003B2FB9 /* MFCustomButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFCustomButton.h; sourceTree = ""; }; - D29DF16B21E69E1F003B2FB9 /* ButtonDelegateProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ButtonDelegateProtocol.h; sourceTree = ""; }; - D29DF16C21E69E1F003B2FB9 /* PrimaryButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PrimaryButton.h; sourceTree = ""; }; - D29DF17021E69E1F003B2FB9 /* MFCustomButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFCustomButton.m; sourceTree = ""; }; - D29DF17121E69E1F003B2FB9 /* PrimaryButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PrimaryButton.m; sourceTree = ""; }; - D29DF17E21E69E2E003B2FB9 /* MFView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MFView.h; sourceTree = ""; }; - D29DF17F21E69E2E003B2FB9 /* MFView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MFView.m; sourceTree = ""; }; - D29DF24221E6A176003B2FB9 /* MFTextField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFTextField.m; sourceTree = ""; }; - D29DF24321E6A176003B2FB9 /* MFDigitTextField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFDigitTextField.h; sourceTree = ""; }; - D29DF24421E6A176003B2FB9 /* MFTextField.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MFTextField.xib; sourceTree = ""; }; - D29DF24521E6A176003B2FB9 /* MFDigitTextBox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFDigitTextBox.h; sourceTree = ""; }; - D29DF24621E6A176003B2FB9 /* MFDigitTextBox.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFDigitTextBox.m; sourceTree = ""; }; - D29DF24721E6A176003B2FB9 /* MFMdnTextField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFMdnTextField.h; sourceTree = ""; }; - D29DF24821E6A177003B2FB9 /* MFDigitTextField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFDigitTextField.m; sourceTree = ""; }; - D29DF24921E6A177003B2FB9 /* MFMdnTextField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFMdnTextField.m; sourceTree = ""; }; - D29DF24A21E6A177003B2FB9 /* MFDigitTextField.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MFDigitTextField.xib; sourceTree = ""; }; - D29DF24B21E6A177003B2FB9 /* MFTextFieldSubclassExtension.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFTextFieldSubclassExtension.h; sourceTree = ""; }; - D29DF24C21E6A177003B2FB9 /* MFTextField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFTextField.h; sourceTree = ""; }; - D29DF25821E6A22D003B2FB9 /* MFButtonProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFButtonProtocol.h; sourceTree = ""; }; - D29DF26821E6AA0B003B2FB9 /* FLAnimatedImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLAnimatedImage.m; sourceTree = ""; }; - D29DF26921E6AA0B003B2FB9 /* FLAnimatedImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLAnimatedImageView.m; sourceTree = ""; }; - D29DF26A21E6AA0B003B2FB9 /* FLAnimatedImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLAnimatedImage.h; sourceTree = ""; }; - D29DF26B21E6AA0B003B2FB9 /* FLAnimatedImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLAnimatedImageView.h; sourceTree = ""; }; - D29DF27321E79E81003B2FB9 /* MVMCoreUILoggingHandler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUILoggingHandler.h; sourceTree = ""; }; - D29DF27421E79E81003B2FB9 /* MVMCoreUILoggingHandler.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUILoggingHandler.m; sourceTree = ""; }; - D29DF27721E7A533003B2FB9 /* MVMCoreUISession.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUISession.h; sourceTree = ""; }; - D29DF27821E7A533003B2FB9 /* MVMCoreUISession.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUISession.m; sourceTree = ""; }; - D29DF27F21E7AA50003B2FB9 /* MVMCoreUIDetailViewProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIDetailViewProtocol.h; sourceTree = ""; }; - D29DF28121E7AB23003B2FB9 /* MVMCoreUICommonViewsUtility.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUICommonViewsUtility.m; sourceTree = ""; }; - D29DF28221E7AB24003B2FB9 /* MVMCoreUICommonViewsUtility.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreUICommonViewsUtility.h; sourceTree = ""; }; - D29DF28721E7AC2B003B2FB9 /* ViewConstrainingView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ViewConstrainingView.h; sourceTree = ""; }; - D29DF28821E7AC2B003B2FB9 /* ViewConstrainingView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ViewConstrainingView.m; sourceTree = ""; }; - D29DF28D21E7ADB8003B2FB9 /* MFProgrammaticScrollViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFProgrammaticScrollViewController.m; sourceTree = ""; }; - D29DF28E21E7ADB8003B2FB9 /* StackableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StackableViewController.m; sourceTree = ""; }; - D29DF28F21E7ADB8003B2FB9 /* MFScrollingViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFScrollingViewController.h; sourceTree = ""; }; - D29DF29021E7ADB8003B2FB9 /* MFScrollingViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFScrollingViewController.m; sourceTree = ""; }; - D29DF29121E7ADB8003B2FB9 /* MFProgrammaticScrollViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFProgrammaticScrollViewController.h; sourceTree = ""; }; - D29DF29221E7ADB8003B2FB9 /* MFProgrammaticTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFProgrammaticTableViewController.h; sourceTree = ""; }; - D29DF29321E7ADB8003B2FB9 /* StackableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StackableViewController.h; sourceTree = ""; }; - D29DF29421E7ADB8003B2FB9 /* MFProgrammaticTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFProgrammaticTableViewController.m; sourceTree = ""; }; - D29DF29F21E7AF4E003B2FB9 /* MVMCoreUIUtility.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIUtility.h; sourceTree = ""; }; - D29DF2A021E7AF4E003B2FB9 /* MVMCoreUIUtility.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUIUtility.m; sourceTree = ""; }; - D29DF2A721E7B2F9003B2FB9 /* MVMCoreUIConstants.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIConstants.h; sourceTree = ""; }; - D29DF2A821E7B2F9003B2FB9 /* MVMCoreUIConstants.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUIConstants.m; sourceTree = ""; }; - D29DF2AB21E7B3A4003B2FB9 /* MFTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFTextView.m; sourceTree = ""; }; - D29DF2AC21E7B3A4003B2FB9 /* MFTextView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MFTextView.xib; sourceTree = ""; }; - D29DF2AD21E7B3A4003B2FB9 /* MFTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFTextView.h; sourceTree = ""; }; - D29DF2B121E7B76C003B2FB9 /* MFLoadingSpinner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFLoadingSpinner.h; sourceTree = ""; }; - D29DF2B221E7B76D003B2FB9 /* MFLoadingSpinner.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFLoadingSpinner.m; sourceTree = ""; }; - D29DF2B821E7BEA4003B2FB9 /* TopTabbar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TopTabbar.h; sourceTree = ""; }; - D29DF2B921E7BEA4003B2FB9 /* MVMCoreUITabBarPageControlViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreUITabBarPageControlViewController.h; sourceTree = ""; }; - D29DF2BA21E7BEA4003B2FB9 /* TopTabbar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TopTabbar.m; sourceTree = ""; }; - D29DF2BB21E7BEA4003B2FB9 /* MVMCoreUITabBarPageControlViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUITabBarPageControlViewController.m; sourceTree = ""; }; - D29DF2C021E7BF56003B2FB9 /* MFTabBarSwipeAnimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFTabBarSwipeAnimator.h; sourceTree = ""; }; - D29DF2C121E7BF57003B2FB9 /* MFTabBarSwipeAnimator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFTabBarSwipeAnimator.m; sourceTree = ""; }; - D29DF2C221E7BF57003B2FB9 /* MFTabBarInteractor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFTabBarInteractor.h; sourceTree = ""; }; - D29DF2C321E7BF57003B2FB9 /* MFTabBarInteractor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFTabBarInteractor.m; sourceTree = ""; }; - D29DF2CC21E7C104003B2FB9 /* MFLoadingViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFLoadingViewController.h; sourceTree = ""; }; - D29DF2CD21E7C104003B2FB9 /* MFLoadingViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFLoadingViewController.m; sourceTree = ""; }; - D29DF2E021E9240B003B2FB9 /* MVMCoreUIPanelProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIPanelProtocol.h; sourceTree = ""; }; - D29DF31721ECECC0003B2FB9 /* OCRAExtended.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = OCRAExtended.ttf; sourceTree = ""; }; - D29DF31E21ED0CBA003B2FB9 /* LabelView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LabelView.h; sourceTree = ""; }; - D29DF31F21ED0CBA003B2FB9 /* LabelView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LabelView.m; sourceTree = ""; }; - D29DF32221ED0DA2003B2FB9 /* TextButtonView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TextButtonView.m; sourceTree = ""; }; - D29DF32321ED0DA2003B2FB9 /* TextButtonView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextButtonView.h; sourceTree = ""; }; - D29DF32921EE8736003B2FB9 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; - D29DF32A21EE8736003B2FB9 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; }; - D29DF32B21EE8736003B2FB9 /* es-MX */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-MX"; path = "es-MX.lproj/Localizable.strings"; sourceTree = ""; }; - D29DF32D21EE8C3D003B2FB9 /* Media.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Media.xcassets; sourceTree = ""; }; - D29E28D723D21AB800ACEA85 /* StringAndMoleculeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringAndMoleculeView.swift; sourceTree = ""; }; - D29E28D923D21AFA00ACEA85 /* StringAndMoleculeModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringAndMoleculeModel.swift; sourceTree = ""; }; - D29E28DC23D7404C00ACEA85 /* ContainerHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContainerHelper.swift; sourceTree = ""; }; - D2A514562211C53C00345BFB /* MVMCoreUIMoleculeMappingObject.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIMoleculeMappingObject.h; sourceTree = ""; }; - D2A514572211C53C00345BFB /* MVMCoreUIMoleculeMappingObject.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUIMoleculeMappingObject.m; sourceTree = ""; }; - D2A5145C2211D22A00345BFB /* MVMCoreUIMoleculeViewProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIMoleculeViewProtocol.h; sourceTree = ""; }; - D2A5145E2211DDC100345BFB /* MoleculeStackView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoleculeStackView.swift; sourceTree = ""; }; - D2A5146022121FBF00345BFB /* MoleculeStackTemplate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoleculeStackTemplate.swift; sourceTree = ""; }; - D2A514622213643100345BFB /* MoleculeStackCenteredTemplate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoleculeStackCenteredTemplate.swift; sourceTree = ""; }; - D2A514662213885800345BFB /* MoleculeHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoleculeHeaderView.swift; sourceTree = ""; }; - D2A5146A2214905000345BFB /* ThreeLayerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThreeLayerViewController.swift; sourceTree = ""; }; - D2A638FC22CA98280052ED1F /* HeadlineBody.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadlineBody.swift; sourceTree = ""; }; - D2A6390022CBB1820052ED1F /* Carousel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Carousel.swift; sourceTree = ""; }; - D2A6390422CBCE160052ED1F /* MoleculeCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoleculeCollectionViewCell.swift; sourceTree = ""; }; - D2A92881241AAB67004E01C6 /* ScrollingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScrollingViewController.swift; sourceTree = ""; }; - D2A92883241ACB25004E01C6 /* ProgrammaticScrollViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProgrammaticScrollViewController.swift; sourceTree = ""; }; - D2A92885241ACD99004E01C6 /* ProgrammaticTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProgrammaticTableViewController.swift; sourceTree = ""; }; - D2B18B7E2360913400A9AEDC /* Control.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Control.swift; sourceTree = ""; }; - D2B18B802360945C00A9AEDC /* View.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = View.swift; sourceTree = ""; }; - D2B18B912361E65A00A9AEDC /* CoreUIObject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreUIObject.swift; sourceTree = ""; }; - D2B18B93236214AD00A9AEDC /* NavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationController.swift; sourceTree = ""; }; - D2B1E3E422F37D6A0065F95C /* ImageHeadlineBody.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageHeadlineBody.swift; sourceTree = ""; }; - D2C5001621F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIViewControllerMappingObject.h; sourceTree = ""; }; - D2C5001721F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUIViewControllerMappingObject.m; sourceTree = ""; }; - D2C521A823EDE79E00CA2634 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - D2C78CD124228BBD00B69FDE /* ActionOpenPanelModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActionOpenPanelModel.swift; sourceTree = ""; }; - D2D6CD3F22E78C1A00D701B8 /* Scroller.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Scroller.swift; sourceTree = ""; }; - D2D6CD4122E78FAB00D701B8 /* ThreeLayerTemplate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThreeLayerTemplate.swift; sourceTree = ""; }; - D2D90B41240463E100DD6EC9 /* MoleculeHeaderModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoleculeHeaderModel.swift; sourceTree = ""; }; - D2D90B432404789000DD6EC9 /* MoleculeContainerProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoleculeContainerProtocol.swift; sourceTree = ""; }; - D2E1FADA2260D3D200AEFD8C /* MVMCoreUIDelegateObject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MVMCoreUIDelegateObject.swift; sourceTree = ""; }; - D2E1FADE2268B8E700AEFD8C /* ThreeLayerTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThreeLayerTableViewController.swift; sourceTree = ""; }; - D2E1FAE02268E81D00AEFD8C /* MoleculeListTemplate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoleculeListTemplate.swift; sourceTree = ""; }; - D2E2A98223D8B32D000B42E6 /* EyebrowHeadlineBodyLinkModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EyebrowHeadlineBodyLinkModel.swift; sourceTree = ""; }; - D2E2A99323D8CCBC000B42E6 /* HeadlineBodyLinkModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadlineBodyLinkModel.swift; sourceTree = ""; }; - D2E2A99523D8CF85000B42E6 /* HeadlineBodyLinkToggleModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadlineBodyLinkToggleModel.swift; sourceTree = ""; }; - D2E2A99723D8D63C000B42E6 /* ActionDetailWithImageModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionDetailWithImageModel.swift; sourceTree = ""; }; - D2E2A99923D8D6B4000B42E6 /* HeadlineBodyButtonModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadlineBodyButtonModel.swift; sourceTree = ""; }; - D2E2A99B23D8D975000B42E6 /* ImageHeadlineBodyModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageHeadlineBodyModel.swift; sourceTree = ""; }; - D2E2A99E23E07F8A000B42E6 /* PillButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PillButton.swift; sourceTree = ""; }; - D2E2A9A023E095AB000B42E6 /* ButtonModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonModelProtocol.swift; sourceTree = ""; }; - D2E2A9A223E096B1000B42E6 /* DisableableModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DisableableModelProtocol.swift; sourceTree = ""; }; - D2FB151A23A2B65B00C20E10 /* MoleculeContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoleculeContainer.swift; sourceTree = ""; }; - D2FB151C23A40F1500C20E10 /* MoleculeStackItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoleculeStackItem.swift; sourceTree = ""; }; - DB06250A2293456500B72DD3 /* LeftRightLabelView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LeftRightLabelView.swift; sourceTree = ""; }; - DB891E822253FA8500022516 /* Label.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Label.swift; sourceTree = ""; }; - DBC4391622442196001AB423 /* CaretView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CaretView.swift; sourceTree = ""; }; - DBC4391722442197001AB423 /* DashLine.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DashLine.swift; sourceTree = ""; }; - DBC4391A224421A0001AB423 /* CaretLink.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CaretLink.swift; sourceTree = ""; }; - DBC4391C2245232D001AB423 /* LabelWithInternalButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelWithInternalButton.swift; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - D29DF0C921E404D4003B2FB9 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - D29DF0E621E4F3C7003B2FB9 /* MVMCore.framework in Frameworks */, - 9455B19C234F8A0400A574DB /* MVMAnimationFramework.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 011B58EE23A2AA850085F53C /* ModelProtocols */ = { - isa = PBXGroup; - children = ( - 014AA72323C501E2006F3E93 /* ContainerModelProtocol.swift */, - 012A88C3238D86E600FE3DA1 /* CarouselItemModelProtocol.swift */, - 012A88B0238C880100FE3DA1 /* CarouselPagingModelProtocol.swift */, - 01EB3683236097C0006832FA /* MoleculeModelProtocol.swift */, - 012A889B23889E8400FE3DA1 /* TemplateModelProtocol.swift */, - D28A837823C7D5BC00DFE4FC /* PageModelProtocol.swift */, - 011B58EF23A2AA980085F53C /* ListItemModelProtocol.swift */, - D2E2A9A223E096B1000B42E6 /* DisableableModelProtocol.swift */, - ); - path = ModelProtocols; - sourceTree = ""; - }; - 011D958A24042794000E3791 /* Rules */ = { - isa = PBXGroup; - children = ( - 011D958424042432000E3791 /* RulesProtocol.swift */, - 011D959A240451E3000E3791 /* RuleRequiredModel.swift */, - 011D959C2404536F000E3791 /* RuleAnyValueChangedModel.swift */, - 011D959E240453A1000E3791 /* RuleAllValueChangedModel.swift */, - 011D95A0240453D0000E3791 /* RuleEqualsModel.swift */, - 011D95A2240453F8000E3791 /* RuleRegexModel.swift */, - 011D95A4240455DC000E3791 /* FormGroupRule.swift */, - 0A69F610241BDEA700F7231B /* RuleAnyRequiredModel.swift */, - ); - name = Rules; - path = Rules/Rules; - sourceTree = ""; - }; - 012A88EF23985E0100FE3DA1 /* CustomPrimitives */ = { - isa = PBXGroup; - children = ( - 012A88F023985E0100FE3DA1 /* Color.swift */, - ); - path = CustomPrimitives; - sourceTree = ""; - }; - 01509D96232803B200EF99AA /* Models */ = { - isa = PBXGroup; - children = ( - 011B58EE23A2AA850085F53C /* ModelProtocols */, - ); - path = Models; - sourceTree = ""; - }; - 01C74D87224298E2009C25A3 /* FormUIHelpers */ = { - isa = PBXGroup; - children = ( - 011D95882404249B000E3791 /* FormHolderModelProtocol.swift */, - 011D95AC2406BB57000E3791 /* FormHolderProtocol.swift */, - 011D95AA2405C553000E3791 /* FormItemProtocol.swift */, - 011D958624042492000E3791 /* FormFieldProtocol.swift */, - 011D95A824057AC7000E3791 /* FormActionFieldProtocol.swift */, - 011D9601240DA20A000E3791 /* ValidProtocol.swift */, - 0105618A224BBE7700E1557D /* FormValidator.swift */, - 011D958A24042794000E3791 /* Rules */, - ); - path = FormUIHelpers; - sourceTree = ""; - }; - 0A14F6B023E8C27A00EDF7F7 /* CarouselIndicator */ = { - isa = PBXGroup; - children = ( - 0A14F6A823E8750300EDF7F7 /* CarouselIndicatorModel.swift */, - 0A14F69223E349EF00EDF7F7 /* CarouselIndicator.swift */, - 0AAF8E29240EA57D008DD263 /* BarsCarouselIndicatorModel.swift */, - 0A4253AE23F5C2C000554656 /* BarsIndicatorView.swift */, - 0AAF8E2B240EA594008DD263 /* NumericCarouselIndicatorModel.swift */, - 0A14F6B323E8C29700EDF7F7 /* NumericIndicatorView.swift */, - ); - path = CarouselIndicator; - sourceTree = ""; - }; - 0A5D59C323AD488600EFD9E9 /* Protocols */ = { - isa = PBXGroup; - children = ( - 0A5D59C123AD2F5700EFD9E9 /* AppleGuidelinesProtocol.swift */, - ); - path = Protocols; - sourceTree = ""; - }; - 0ABD1369237B18EE0081388D /* Views */ = { - isa = PBXGroup; - children = ( - 9432A79E23DB47BA00719041 /* EntryFieldContainer.swift */, - D29E28DE23D740FC00ACEA85 /* Container */, - D2D90B432404789000DD6EC9 /* MoleculeContainerProtocol.swift */, - 014AA72123C501E2006F3E93 /* MoleculeContainerModel.swift */, - D2FB151A23A2B65B00C20E10 /* MoleculeContainer.swift */, - ); - path = Views; - sourceTree = ""; - }; - 0AE98BAD23FEF92B004C5109 /* Link */ = { - isa = PBXGroup; - children = ( - D28A838823CCCFCB00DFE4FC /* LinkModel.swift */, - C07065C32395677300FBF997 /* Link.swift */, - 0AE98BB223FF0934004C5109 /* ExternalLinkModel.swift */, - 0AE98BAE23FEF956004C5109 /* ExternalLink.swift */, - ); - path = Link; - sourceTree = ""; - }; - 5206F150241144A900658DC5 /* Headers */ = { - isa = PBXGroup; - children = ( - AAA74A182410C05800080241 /* HeadersH2NoButtonsBodyTextModel.swift */, - AAA74A162410C04600080241 /* HeadersH2NoButtonsBodyText.swift */, - ); - path = Headers; - sourceTree = ""; - }; - 52267A0523FFE0A900906CBA /* OneColumn */ = { - isa = PBXGroup; - children = ( - 8D448E5424050A46006211BB /* ListOneColumnFullWidthTextAllTextAndLinksModel.swift */, - 52267A0623FFE25000906CBA /* ListOneColumnFullWidthTextAllTextAndLinks.swift */, - 8D084ACF2410BF4800951227 /* ListOneColumnFullWidthTextBodyTextModel.swift */, - 8D084AD12410BF7600951227 /* ListOneColumnFullWidthTextBodyText.swift */, - ); - path = OneColumn; - sourceTree = ""; - }; - 525019E3240684E500EED91C /* FourColumn */ = { - isa = PBXGroup; - children = ( - 525019E42406852100EED91C /* ListFourColumnDataUsageDividerModel.swift */, - 525019E62406853600EED91C /* ListFourColumnDataUsageDivider.swift */, - ); - path = FourColumn; - sourceTree = ""; - }; - 525239C32407FFCC00454969 /* LockUps */ = { - isa = PBXGroup; - children = ( - 525019DB2406430700EED91C /* ListProgressBarDataModel.swift */, - 525019DC2406430800EED91C /* ListProgressBarData.swift */, - ); - path = LockUps; - sourceTree = ""; - }; - 525665CB24211FD5007BF25F /* OneColumn */ = { - isa = PBXGroup; - children = ( - BB6C6AC72422528F005F7224 /* ListOneColumnTextWithWhitespaceDividerShortModel.swift */, - BB6C6AC62422528F005F7224 /* ListOneColumnTextWithWhitespaceDividerShort.swift */, - BB6C6ABE242232DF005F7224 /* ListOneColumnTextWithWhitespaceDividerTallModel.swift */, - BB6C6ABF242232DF005F7224 /* ListOneColumnTextWithWhitespaceDividerTall.swift */, - BB47A585241615EF002BB23C /* ListOneColumnFullWidthTextDividerSubsectionModel.swift */, - BB47A587241615FA002BB23C /* ListOneColumnFullWidthTextDividerSubsection.swift */, - ); - path = OneColumn; - sourceTree = ""; - }; - 526A265A240D1FCE00B0D828 /* TwoColumn */ = { - isa = PBXGroup; - children = ( - ); - path = TwoColumn; - sourceTree = ""; - }; - 94C01508242155FE005811A9 /* Actions */ = { - isa = PBXGroup; - children = ( - 94C0150924215643005811A9 /* ActionTopAlertModel.swift */, - 94C0150B2421564A005811A9 /* ActionCollapseNotificationModel.swift */, - D2C78CD124228BBD00B69FDE /* ActionOpenPanelModel.swift */, - ); - path = Actions; - sourceTree = ""; - }; - 94C2D9822386F3E30006CF46 /* Label */ = { - isa = PBXGroup; - children = ( - 01EB368823609801006832FA /* LabelModel.swift */, - 94C2D9832386F3F80006CF46 /* LabelAttributeModel.swift */, - 94C2D9A023872BCC0006CF46 /* LabelAttributeUnderlineModel.swift */, - 94C2D9A223872C110006CF46 /* LabelAttributeStrikeThroughModel.swift */, - 94C2D9A423872C350006CF46 /* LabelAttributeFontModel.swift */, - 94C2D9A623872DA90006CF46 /* LabelAttributeColorModel.swift */, - 94C2D9A823872E5E0006CF46 /* LabelAttributeImageModel.swift */, - 94C2D9AA23872EB50006CF46 /* LabelAttributeActionModel.swift */, - DB891E822253FA8500022516 /* Label.swift */, - ); - path = Label; - sourceTree = ""; - }; - AA4FC2A323F4F69600E251DB /* RightVariable */ = { - isa = PBXGroup; - children = ( - AA11A42023F15D7000D7962F /* ListRightVariablePaymentsModel.swift */, - AA11A41E23F15D3100D7962F /* ListRightVariablePayments.swift */, - 8D070BAF241B56530099AC56 /* ListRightVariableTotalDataModel.swift */, - 8D070BB1241B56AD0099AC56 /* ListRightVariableTotalData.swift */, - C7F8012223E846C300396FBD /* ListRVWheelModel.swift */, - C7F8012023E8303200396FBD /* ListRVWheel.swift */, - ); - path = RightVariable; - sourceTree = ""; - }; - D213347423842FE3008E41B3 /* Controllers */ = { - isa = PBXGroup; - children = ( - D29DF16021E69996003B2FB9 /* MFViewController.h */, - D29DF15F21E69996003B2FB9 /* MFViewController.m */, - 017BEB3B2361EA1D0024EF95 /* MFViewController+Model.swift */, - 011D9627240EFA1E000E3791 /* MFViewController+Form.swift */, - D29DF28F21E7ADB8003B2FB9 /* MFScrollingViewController.h */, - D29DF29021E7ADB8003B2FB9 /* MFScrollingViewController.m */, - D29DF29121E7ADB8003B2FB9 /* MFProgrammaticScrollViewController.h */, - D29DF28D21E7ADB8003B2FB9 /* MFProgrammaticScrollViewController.m */, - D29DF29321E7ADB8003B2FB9 /* StackableViewController.h */, - D29DF28E21E7ADB8003B2FB9 /* StackableViewController.m */, - D29DF29221E7ADB8003B2FB9 /* MFProgrammaticTableViewController.h */, - D29DF29421E7ADB8003B2FB9 /* MFProgrammaticTableViewController.m */, - D22D1F542204CE5D0077CEC0 /* MVMCoreUIStackableViewController.h */, - D22D1F552204CE5D0077CEC0 /* MVMCoreUIStackableViewController.m */, - D29770F021F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsViewController.h */, - D29770F121F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsViewController.m */, - D29770EF21F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsTableViewController.h */, - D29770EE21F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsTableViewController.m */, - ); - path = Controllers; - sourceTree = ""; - }; - D213347523842FF5008E41B3 /* Views */ = { - isa = PBXGroup; - children = ( - 94FB966023D797DA003D482B /* MFTextButton.h */, - 94FB966123D797DA003D482B /* MFTextButton.m */, - D29DF17E21E69E2E003B2FB9 /* MFView.h */, - D29DF17F21E69E2E003B2FB9 /* MFView.m */, - D29DF31E21ED0CBA003B2FB9 /* LabelView.h */, - D29DF31F21ED0CBA003B2FB9 /* LabelView.m */, - D29DF15921E697DA003B2FB9 /* SeparatorView.h */, - D29DF15A21E697DA003B2FB9 /* SeparatorView.m */, - D22D1F1C220343560077CEC0 /* MVMCoreUICheckMarkView.h */, - D22D1F1D220343560077CEC0 /* MVMCoreUICheckMarkView.m */, - D22D1F18220341F50077CEC0 /* MVMCoreUICheckBox.h */, - D22D1F19220341F50077CEC0 /* MVMCoreUICheckBox.m */, - 0198F7A02256A80A0066C936 /* MFRadioButton.h */, - 0198F7A22256A80A0066C936 /* MFRadioButton.m */, - D29DF28721E7AC2B003B2FB9 /* ViewConstrainingView.h */, - D29DF28821E7AC2B003B2FB9 /* ViewConstrainingView.m */, - D29DF2AD21E7B3A4003B2FB9 /* MFTextView.h */, - D29DF2AB21E7B3A4003B2FB9 /* MFTextView.m */, - D29DF2AC21E7B3A4003B2FB9 /* MFTextView.xib */, - D29DF2B121E7B76C003B2FB9 /* MFLoadingSpinner.h */, - D29DF2B221E7B76D003B2FB9 /* MFLoadingSpinner.m */, - D29DF32321ED0DA2003B2FB9 /* TextButtonView.h */, - D29DF32221ED0DA2003B2FB9 /* TextButtonView.m */, - D29770FB21F7C77400B2F0D0 /* MVMCoreUITextFieldView.h */, - D29770FA21F7C77400B2F0D0 /* MVMCoreUITextFieldView.m */, - D22D1F44220496A30077CEC0 /* MVMCoreUISwitch.h */, - D22D1F45220496A30077CEC0 /* MVMCoreUISwitch.m */, - D29DF16A21E69E1F003B2FB9 /* MFCustomButton.h */, - D29DF17021E69E1F003B2FB9 /* MFCustomButton.m */, - D29DF16C21E69E1F003B2FB9 /* PrimaryButton.h */, - D29DF17121E69E1F003B2FB9 /* PrimaryButton.m */, - D29DF25821E6A22D003B2FB9 /* MFButtonProtocol.h */, - D29DF16B21E69E1F003B2FB9 /* ButtonDelegateProtocol.h */, - D260D7AF22D65BDD007E7233 /* MVMCoreUIPageControl.h */, - D260D7B022D65BDD007E7233 /* MVMCoreUIPageControl.m */, - D260D7B522D68509007E7233 /* MVMCoreUIPagingProtocol.h */, - D29DF24C21E6A177003B2FB9 /* MFTextField.h */, - D29DF24221E6A176003B2FB9 /* MFTextField.m */, - D29DF24421E6A176003B2FB9 /* MFTextField.xib */, - D29DF24B21E6A177003B2FB9 /* MFTextFieldSubclassExtension.h */, - D29DF24721E6A176003B2FB9 /* MFMdnTextField.h */, - D29DF24921E6A177003B2FB9 /* MFMdnTextField.m */, - D29DF24521E6A176003B2FB9 /* MFDigitTextBox.h */, - D29DF24621E6A176003B2FB9 /* MFDigitTextBox.m */, - D29DF24321E6A176003B2FB9 /* MFDigitTextField.h */, - D29DF24821E6A177003B2FB9 /* MFDigitTextField.m */, - D29DF24A21E6A177003B2FB9 /* MFDigitTextField.xib */, - D2A5145C2211D22A00345BFB /* MVMCoreUIMoleculeViewProtocol.h */, - D29770C721F7C4AE00B2F0D0 /* TopLabelsView.h */, - D29770C621F7C4AE00B2F0D0 /* TopLabelsView.m */, - 94F217B423E0BF6100A47C06 /* PrimaryButtonView.h */, - 94F217B523E0BF6100A47C06 /* PrimaryButtonView.m */, - D282AACA2243C61700C46919 /* ButtonView.swift */, - 94AF4A3C23E9D13900676048 /* MFCaretButton.h */, - 94AF4A3D23E9D13900676048 /* MFCaretButton.m */, - 94AF4A4023E9D19E00676048 /* MFCaretView.h */, - 94AF4A4123E9D19E00676048 /* MFCaretView.m */, - ); - path = Views; - sourceTree = ""; - }; - D224798823142BF2003FCCF9 /* ToggleMolecules */ = { - isa = PBXGroup; - children = ( - D2E2A99523D8CF85000B42E6 /* HeadlineBodyLinkToggleModel.swift */, - 01509D942327ED1900EF99AA /* HeadlineBodyLinkToggle.swift */, - 01C851D223CF9E740021F976 /* LabelToggleModel.swift */, - D22479892314445E003FCCF9 /* LabelToggle.swift */, - 0103B84D23D7E33A009C315C /* HeadlineBodyToggleModel.swift */, - D224798B231450C8003FCCF9 /* HeadlineBodyToggle.swift */, - ); - path = ToggleMolecules; - sourceTree = ""; - }; - D224798D2316A988003FCCF9 /* VerticalCombinationViews */ = { - isa = PBXGroup; - children = ( - D29E28D423D1FFFA00ACEA85 /* Lists */, - 01EB368D23609801006832FA /* HeadlineBodyModel.swift */, - D2A638FC22CA98280052ED1F /* HeadlineBody.swift */, - D2E2A99323D8CCBC000B42E6 /* HeadlineBodyLinkModel.swift */, - D22479952316AF6D003FCCF9 /* HeadlineBodyLink.swift */, - D2E2A98223D8B32D000B42E6 /* EyebrowHeadlineBodyLinkModel.swift */, - D27CD40F2339057800C1DC07 /* EyebrowHeadlineBodyLink.swift */, - D28A839223CE828900DFE4FC /* HeadlineBodyCaretLinkImageModel.swift */, - C7192E7C23C301750050C2A0 /* HeadLineBodyCaretLinkImage.swift */, - D2E2A99923D8D6B4000B42E6 /* HeadlineBodyButtonModel.swift */, - 0A7BAD73232A8DC700FB8E22 /* HeadlineBodyButton.swift */, - ); - path = VerticalCombinationViews; - sourceTree = ""; - }; - D224798E2316A995003FCCF9 /* HorizontalCombinationViews */ = { - isa = PBXGroup; - children = ( - D2E2A99B23D8D975000B42E6 /* ImageHeadlineBodyModel.swift */, - D2B1E3E422F37D6A0065F95C /* ImageHeadlineBody.swift */, - D28A838E23CCDEDE00DFE4FC /* TwoButtonViewModel.swift */, - D20A9A5D2243D3E300ADE781 /* TwoButtonView.swift */, - D28A837E23CCA96400DFE4FC /* TabsModel.swift */, - ); - path = HorizontalCombinationViews; - sourceTree = ""; - }; - D224798F2316A99F003FCCF9 /* LeftRightViews */ = { - isa = PBXGroup; - children = ( - D2E2A99723D8D63C000B42E6 /* ActionDetailWithImageModel.swift */, - 0A12149F22C11A17007C7030 /* ActionDetailWithImage.swift */, - D28A839023CD4FD400DFE4FC /* CornerLabelsModel.swift */, - 01509D902327ECE600EF99AA /* CornerLabels.swift */, - D224798823142BF2003FCCF9 /* ToggleMolecules */, - ); - path = LeftRightViews; - sourceTree = ""; - }; - D22479902316A9CB003FCCF9 /* Organisms */ = { - isa = PBXGroup; - children = ( - D260105A23D0BB7100764D80 /* StackModelProtocol.swift */, - D260106423D0CEA700764D80 /* StackModel.swift */, - D260105C23D0BCD400764D80 /* Stack.swift */, - 01EB368B23609801006832FA /* MoleculeStackModel.swift */, - D2A5145E2211DDC100345BFB /* MoleculeStackView.swift */, - 012A88AE238C626E00FE3DA1 /* CarouselModel.swift */, - D2A6390022CBB1820052ED1F /* Carousel.swift */, - ); - path = Organisms; - sourceTree = ""; - }; - D22479912316A9EF003FCCF9 /* Items */ = { - isa = PBXGroup; - children = ( - D26C5A6A23F4A40D007AEECE /* ListItemModel.swift */, - 01EB368923609801006832FA /* MoleculeListItemModel.swift */, - 01509D8E2327EC6F00EF99AA /* MoleculeTableViewCell.swift */, - 012A88C1238D7BCA00FE3DA1 /* CarouselItemModel.swift */, - D2A6390422CBCE160052ED1F /* MoleculeCollectionViewCell.swift */, - D28A838023CCB0D800DFE4FC /* AccordionListItemModel.swift */, - D224799A231965AD003FCCF9 /* AccordionMoleculeTableViewCell.swift */, - D28A837C23CCA86A00DFE4FC /* TabsListItemModel.swift */, - D27CD40D2322EEAF00C1DC07 /* TabsTableViewCell.swift */, - 011B58F123A2AE2C0085F53C /* DropDownListItemModel.swift */, - D268C70D238C22D7007F2C1C /* DropDownFilterTableViewCell.swift */, - D260106023D0C02A00764D80 /* StackItemModelProtocol.swift */, - D260106223D0C05000764D80 /* StackItemModel.swift */, - D260105E23D0BFFC00764D80 /* StackItem.swift */, - 01EB368A23609801006832FA /* MoleculeStackItemModel.swift */, - D2FB151C23A40F1500C20E10 /* MoleculeStackItem.swift */, - ); - path = Items; - sourceTree = ""; - }; - D22B38E923F4E07800490EF6 /* DesignedComponents */ = { - isa = PBXGroup; - children = ( - 5206F150241144A900658DC5 /* Headers */, - 525239C32407FFCC00454969 /* LockUps */, - D22B38EC23F4E10700490EF6 /* SectionDividers */, - D22B38EA23F4E08B00490EF6 /* List */, - ); - path = DesignedComponents; - sourceTree = ""; - }; - D22B38EA23F4E08B00490EF6 /* List */ = { - isa = PBXGroup; - children = ( - D22D8396241FDE4700D3DF69 /* TwoColumn */, - 52267A0523FFE0A900906CBA /* OneColumn */, - AA4FC2A323F4F69600E251DB /* RightVariable */, - D22B38EB23F4E0AE00490EF6 /* LeftVariable */, - ); - path = List; - sourceTree = ""; - }; - D22B38EB23F4E0AE00490EF6 /* LeftVariable */ = { - isa = PBXGroup; - children = ( - 52B201D124081CFB00D2011E /* ListLeftVariableRadioButtonAndPaymentMethodModel.swift */, - 52B201D024081CFB00D2011E /* ListLeftVariableRadioButtonAndPaymentMethod.swift */, - 522679C023FE886900906CBA /* ListLeftVariableCheckboxAllTextAndLinksModel.swift */, - 522679BF23FE886900906CBA /* ListLeftVariableCheckboxAllTextAndLinks.swift */, - 8D24041423E7FC0B009E23BE /* ListLeftVariableIconWithRightCaretModel.swift */, - 8D24041023E7FB9E009E23BE /* ListLeftVariableIconWithRightCaret.swift */, - ); - path = LeftVariable; - sourceTree = ""; - }; - D22B38EC23F4E10700490EF6 /* SectionDividers */ = { - isa = PBXGroup; - children = ( - 525665CB24211FD5007BF25F /* OneColumn */, - 526A265A240D1FCE00B0D828 /* TwoColumn */, - 525019E3240684E500EED91C /* FourColumn */, - D22B38ED23F4E11100490EF6 /* ThreeColumn */, - ); - path = SectionDividers; - sourceTree = ""; - }; - D22B38ED23F4E11100490EF6 /* ThreeColumn */ = { - isa = PBXGroup; - children = ( - 5248BFEB23F12E350059236A /* ListThreeColumnPlanDataDividerModel.swift */, - 5248BFEA23F12E350059236A /* ListThreeColumnPlanDataDivider.swift */, - ); - path = ThreeColumn; - sourceTree = ""; - }; - D22D1F582204D2590077CEC0 /* Legacy */ = { - isa = PBXGroup; - children = ( - D213347523842FF5008E41B3 /* Views */, - D213347423842FE3008E41B3 /* Controllers */, - ); - path = Legacy; - sourceTree = ""; - }; - D22D8396241FDE4700D3DF69 /* TwoColumn */ = { - isa = PBXGroup; - children = ( - D236E5B3241FEB1000C38625 /* ListTwoColumnPriceDescriptionModel.swift */, - D236E5B2241FEB1000C38625 /* ListTwoColumnPriceDescription.swift */, - 526A265B240D1FF700B0D828 /* ListTwoColumnCompareChangesModel.swift */, - 526A265D240D200500B0D828 /* ListTwoColumnCompareChanges.swift */, - 525239BF2407BCFF00454969 /* ListTwoColumnPriceDetailsModel.swift */, - 525239C12407BD1000454969 /* ListTwoColumnPriceDetails.swift */, - ); - path = TwoColumn; - sourceTree = ""; - }; - D260105723CF9CC500764D80 /* Doughnut */ = { - isa = PBXGroup; - children = ( - C695A69323C9909000BFB94E /* DoughnutChartModel.swift */, - C695A69523C990BC00BFB94E /* DoughnutChart.swift */, - C695A69723C990C200BFB94E /* DoughnutChartView.swift */, - ); - path = Doughnut; - sourceTree = ""; - }; - D29DF0C221E404D4003B2FB9 = { - isa = PBXGroup; - children = ( - D29DF0CE21E404D4003B2FB9 /* MVMCoreUI */, - D29DF0CD21E404D4003B2FB9 /* Products */, - D29DF0E421E4F3C7003B2FB9 /* Frameworks */, - ); - sourceTree = ""; - }; - D29DF0CD21E404D4003B2FB9 /* Products */ = { - isa = PBXGroup; - children = ( - D29DF0CC21E404D4003B2FB9 /* MVMCoreUI.framework */, - ); - name = Products; - sourceTree = ""; - }; - D29DF0CE21E404D4003B2FB9 /* MVMCoreUI */ = { - isa = PBXGroup; - children = ( - 01509D96232803B200EF99AA /* Models */, - 012A88EF23985E0100FE3DA1 /* CustomPrimitives */, - D2B18B7D236090D500A9AEDC /* BaseClasses */, - 01C74D87224298E2009C25A3 /* FormUIHelpers */, - D29DF31421ECECA7003B2FB9 /* SupportingFiles */, - D29DF27021E79B2C003B2FB9 /* OtherHandlers */, - D29DF13A21E68682003B2FB9 /* Utility */, - D29DF13321E68604003B2FB9 /* Styles */, - D29DF11021E6805F003B2FB9 /* Categories */, - D29DF11921E68467003B2FB9 /* Containers */, - D22D1F582204D2590077CEC0 /* Legacy */, - D29DF10F21E67A7D003B2FB9 /* BaseControllers */, - D29DF11E21E6851E003B2FB9 /* TopAlert */, - 94C01508242155FE005811A9 /* Actions */, - D29DF10D21E67A70003B2FB9 /* Atoms */, - D29DF10E21E67A77003B2FB9 /* Molecules */, - D22479902316A9CB003FCCF9 /* Organisms */, - D29DF0DF21E418B2003B2FB9 /* Templates */, - D29DF0CF21E404D4003B2FB9 /* MVMCoreUI.h */, - D29DF0D021E404D4003B2FB9 /* Info.plist */, - ); - path = MVMCoreUI; - sourceTree = ""; - }; - D29DF0DF21E418B2003B2FB9 /* Templates */ = { - isa = PBXGroup; - children = ( - 012A88AC238C418100FE3DA1 /* TemplateProtocol.swift */, - D22D8392241C27B100D3DF69 /* TemplateModel.swift */, - 014AA72823C5059B006F3E93 /* StackPageTemplateModel.swift */, - D2A5146022121FBF00345BFB /* MoleculeStackTemplate.swift */, - 942C378D2412F5B60066E45E /* ModalMoleculeStackTemplate.swift */, - 014AA72923C5059B006F3E93 /* StackCenteredPageTemplateModel.swift */, - D2A514622213643100345BFB /* MoleculeStackCenteredTemplate.swift */, - D28A837A23C928DA00DFE4FC /* MoleculeListCellProtocol.swift */, - 014AA72C23C5059B006F3E93 /* ListPageTemplateModel.swift */, - D2E1FAE02268E81D00AEFD8C /* MoleculeListTemplate.swift */, - 942C378B2412F4FA0066E45E /* ModalMoleculeListTemplate.swift */, - 014AA72A23C5059B006F3E93 /* ThreeLayerPageTemplateModel.swift */, - D2D6CD4122E78FAB00D701B8 /* ThreeLayerTemplate.swift */, - ); - path = Templates; - sourceTree = ""; - }; - D29DF0E421E4F3C7003B2FB9 /* Frameworks */ = { - isa = PBXGroup; - children = ( - D29DF0E521E4F3C7003B2FB9 /* MVMCore.framework */, - 9455B19B234F8A0400A574DB /* MVMAnimationFramework.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - D29DF10D21E67A70003B2FB9 /* Atoms */ = { - isa = PBXGroup; - children = ( - D29DF22B21E6A0FA003B2FB9 /* TextFields */, - D29DF17D21E69E26003B2FB9 /* Views */, - D29DF16821E69E1F003B2FB9 /* Buttons */, - ); - path = Atoms; - sourceTree = ""; - }; - D29DF10E21E67A77003B2FB9 /* Molecules */ = { - isa = PBXGroup; - children = ( - D22B38E923F4E07800490EF6 /* DesignedComponents */, - D22479912316A9EF003FCCF9 /* Items */, - D224798F2316A99F003FCCF9 /* LeftRightViews */, - D224798E2316A995003FCCF9 /* HorizontalCombinationViews */, - D224798D2316A988003FCCF9 /* VerticalCombinationViews */, - 01EB368C23609801006832FA /* HeaderModel.swift */, - D256E9922412880000360572 /* Header.swift */, - D2D90B41240463E100DD6EC9 /* MoleculeHeaderModel.swift */, - D2A514662213885800345BFB /* MoleculeHeaderView.swift */, - 012A88EB238F084D00FE3DA1 /* FooterModel.swift */, - D274CA322236A78900B01B62 /* FooterView.swift */, - 0116A4E4228B19640094F3ED /* RadioButtonSelectionHelper.swift */, - 012A88C5238DA34000FE3DA1 /* ModuleMoleculeModel.swift */, - D29B770F22C281F400D6ACE0 /* ModuleMolecule.swift */, - D28A838423CCCA8900DFE4FC /* ScrollerModel.swift */, - D2D6CD3F22E78C1A00D701B8 /* Scroller.swift */, - 011D9625240EBB16000E3791 /* RadioButtonLabelModel.swift */, - 017BEB372360C6AC0024EF95 /* RadioButtonLabel.swift */, - 017BEB47236230DB0024EF95 /* MoleculeViewProtocol.swift */, - 017BEB49236235BA0024EF95 /* ModelMoleculeViewProtocol.swift */, - D260105723CF9CC500764D80 /* Doughnut */, - D20FB164241A5D75004AFC3A /* NavigationItemModelProtocol.swift */, - ); - path = Molecules; - sourceTree = ""; - }; - D29DF10F21E67A7D003B2FB9 /* BaseControllers */ = { - isa = PBXGroup; - children = ( - D236E5B6242007C500C38625 /* MVMControllerModelProtocol.swift */, - D29DF2CC21E7C104003B2FB9 /* MFLoadingViewController.h */, - D29DF2CD21E7C104003B2FB9 /* MFLoadingViewController.m */, - D2A5146A2214905000345BFB /* ThreeLayerViewController.swift */, - D2E1FADE2268B8E700AEFD8C /* ThreeLayerTableViewController.swift */, - D2C521A823EDE79E00CA2634 /* ViewController.swift */, - D2A92881241AAB67004E01C6 /* ScrollingViewController.swift */, - D2A92883241ACB25004E01C6 /* ProgrammaticScrollViewController.swift */, - D2A92885241ACD99004E01C6 /* ProgrammaticTableViewController.swift */, - ); - path = BaseControllers; - sourceTree = ""; - }; - D29DF11021E6805F003B2FB9 /* Categories */ = { - isa = PBXGroup; - children = ( - 013F801823FB4A8E00AD8013 /* UIContentMode+Extension.swift */, - D29DF11121E6805F003B2FB9 /* UIColor+MFConvenience.h */, - D29DF11321E6805F003B2FB9 /* UIColor+MFConvenience.m */, - D29DF11221E6805F003B2FB9 /* NSLayoutConstraint+MFConvenience.h */, - D29DF11421E6805F003B2FB9 /* NSLayoutConstraint+MFConvenience.m */, - D22479932316AE5E003FCCF9 /* NSLayoutConstraintExtension.swift */, - 0AA33B33239813C50067DD0F /* UIColor+Extension.swift */, - D22D8394241FB41200D3DF69 /* UIStackView+Extension.swift */, - ); - path = Categories; - sourceTree = ""; - }; - D29DF11921E68467003B2FB9 /* Containers */ = { - isa = PBXGroup; - children = ( - 0ABD1369237B18EE0081388D /* Views */, - D29DF2B721E7BE79003B2FB9 /* TabBarController */, - D29DF2B621E7BE66003B2FB9 /* SplitViewController */, - D2B18B93236214AD00A9AEDC /* NavigationController.swift */, - ); - path = Containers; - sourceTree = ""; - }; - D29DF11E21E6851E003B2FB9 /* TopAlert */ = { - isa = PBXGroup; - children = ( - D29DF12021E6851E003B2FB9 /* MVMCoreUITopAlertView.h */, - D29DF12421E6851E003B2FB9 /* MVMCoreUITopAlertView.m */, - D29DF12321E6851E003B2FB9 /* MVMCoreUITopAlertBaseView.h */, - D29DF12821E6851E003B2FB9 /* MVMCoreUITopAlertBaseView.m */, - D29DF11F21E6851E003B2FB9 /* MVMCoreUITopAlertMainView.h */, - D29DF12521E6851E003B2FB9 /* MVMCoreUITopAlertMainView.m */, - D29DF12221E6851E003B2FB9 /* MVMCoreUITopAlertShortView.h */, - D29DF12621E6851E003B2FB9 /* MVMCoreUITopAlertShortView.m */, - D29DF12721E6851E003B2FB9 /* MVMCoreUITopAlertExpandableView.h */, - D29DF12121E6851E003B2FB9 /* MVMCoreUITopAlertExpandableView.m */, - ); - path = TopAlert; - sourceTree = ""; - }; - D29DF13321E68604003B2FB9 /* Styles */ = { - isa = PBXGroup; - children = ( - D29DF13821E68636003B2FB9 /* MFStyler.h */, - D29DF13921E68637003B2FB9 /* MFStyler.m */, - ); - path = Styles; - sourceTree = ""; - }; - D29DF13A21E68682003B2FB9 /* Utility */ = { - isa = PBXGroup; - children = ( - D29DF13B21E6870B003B2FB9 /* Sizing */, - D29DF28221E7AB24003B2FB9 /* MVMCoreUICommonViewsUtility.h */, - D29DF28121E7AB23003B2FB9 /* MVMCoreUICommonViewsUtility.m */, - D29C94D4242901C9003813BA /* MVMCoreUICommonViewsUtility+Extension.swift */, - D29DF14D21E693AD003B2FB9 /* MFFonts.h */, - D29DF14C21E693AD003B2FB9 /* MFFonts.m */, - 9458C3152406C8FD00930963 /* UIFont+FontWrapping.h */, - 9458C3162406C8FD00930963 /* UIFont+FontWrapping.m */, - D29DF29F21E7AF4E003B2FB9 /* MVMCoreUIUtility.h */, - D29DF2A021E7AF4E003B2FB9 /* MVMCoreUIUtility.m */, - D29DF2A721E7B2F9003B2FB9 /* MVMCoreUIConstants.h */, - D29DF2A821E7B2F9003B2FB9 /* MVMCoreUIConstants.m */, - 0A41BA6D2344FCD400D4C0BC /* CATransaction+Extension.swift */, - 0A209CD223A7E2810068F8B0 /* UIStackViewAlignment+Extension.swift */, - D21EE53B23AD3AD4003D1A30 /* NSLayoutConstraintAxis+Extension.swift */, - ); - path = Utility; - sourceTree = ""; - }; - D29DF13B21E6870B003B2FB9 /* Sizing */ = { - isa = PBXGroup; - children = ( - D29DF14521E68728003B2FB9 /* MFSizeObject.h */, - D29DF14421E68728003B2FB9 /* MFSizeObject.m */, - D29DF14621E68728003B2FB9 /* MFSizeThreshold.h */, - D29DF14721E68728003B2FB9 /* MFSizeThreshold.m */, - ); - path = Sizing; - sourceTree = ""; - }; - D29DF16821E69E1F003B2FB9 /* Buttons */ = { - isa = PBXGroup; - children = ( - 0AE98BAD23FEF92B004C5109 /* Link */, - 01F2A03123A4498200D954D8 /* CaretLinkModel.swift */, - DBC4391A224421A0001AB423 /* CaretLink.swift */, - D28A838A23CCDA6B00DFE4FC /* ButtonModel.swift */, - D2E2A99E23E07F8A000B42E6 /* PillButton.swift */, - D28A838C23CCDCC200DFE4FC /* PrimaryButton+MoleculeProtocolExtension.swift */, - D28A837623C79FC600DFE4FC /* MFCustomButton+ActionModel.swift */, - ); - path = Buttons; - sourceTree = ""; - }; - D29DF17D21E69E26003B2FB9 /* Views */ = { - isa = PBXGroup; - children = ( - 0A14F6B023E8C27A00EDF7F7 /* CarouselIndicator */, - 9445890B2385BCE300DE9FD4 /* ProgressBarModel.swift */, - 01509D922327ECFB00EF99AA /* ProgressBar.swift */, - 9445890D2385C3F800DE9FD4 /* MultiProgressModel.swift */, - 948DB67D2326DCD90011F916 /* MultiProgress.swift */, - 9445891E2385D2E900DE9FD4 /* CaretViewModel.swift */, - DBC4391622442196001AB423 /* CaretView.swift */, - 944589202385D6E900DE9FD4 /* DashLineModel.swift */, - DBC4391722442197001AB423 /* DashLine.swift */, - 9402C34F23A2CEA3004B974C /* LeftRightLabelModel.swift */, - DB06250A2293456500B72DD3 /* LeftRightLabelView.swift */, - D282AAB9224131D100C46919 /* MFTransparentGIFView.swift */, - 944589222385DA9500DE9FD4 /* ImageViewModel.swift */, - D282AAB3223FDDAE00C46919 /* MFLoadImageView.swift */, - 017BEB7A236763000024EF95 /* LineModel.swift */, - D213347623843825008E41B3 /* Line.swift */, - DBC4391C2245232D001AB423 /* LabelWithInternalButton.swift */, - 94C2D9822386F3E30006CF46 /* Label */, - 31BE15CA23D8924C00452370 /* CheckboxModel.swift */, - 0A7BAFA0232BE61800FB8E22 /* Checkbox.swift */, - 31BE15C923D8924C00452370 /* CheckboxLabelModel.swift */, - 0A7BAFA2232BE63400FB8E22 /* CheckboxLabel.swift */, - 011D95AE2407266E000E3791 /* RadioButtonModel.swift */, - 01004F2F22721C3800991ECC /* RadioButton.swift */, - D28A838223CCBD3F00DFE4FC /* CircleProgressModel.swift */, - 943784F3236B77BB006A1E82 /* GraphView.swift */, - 943784F4236B77BB006A1E82 /* GraphViewAnimationHandler.swift */, - D260105223CEA61600764D80 /* ToggleModel.swift */, - 0AA33B392398524F0067DD0F /* Toggle.swift */, - D260105423CEA7DC00764D80 /* MVMCoreUISwitch+Model.swift */, - 012CA99D2385A2D3003F810F /* MFView+ModelExtension.swift */, - 0AE98BB623FF18E9004C5109 /* ArrowModel.swift */, - 0AE98BB423FF18D2004C5109 /* Arrow.swift */, - ); - path = Views; - sourceTree = ""; - }; - D29DF22B21E6A0FA003B2FB9 /* TextFields */ = { - isa = PBXGroup; - children = ( - 0A7EF85C23D8A95600B2AAD1 /* TextEntryFieldModel.swift */, - 0A41BA7E23453A6400D4C0BC /* TextEntryField.swift */, - 0A7EF85A23D8A52800B2AAD1 /* EntryFieldModel.swift */, - 0A21DB7E235DECC500C160A2 /* EntryField.swift */, - 0A7EF85E23D8ABC500B2AAD1 /* MdnEntryFieldModel.swift */, - 0A21DB82235DFBC500C160A2 /* MdnEntryField.swift */, - 0A8321AE2355FE9500CB7F00 /* DigitBox.swift */, - 0A7EF86023D8AC2500B2AAD1 /* DigitEntryFieldModel.swift */, - 0A21DB93235E24ED00C160A2 /* DigitEntryField.swift */, - 0A7EF86223D8AFA000B2AAD1 /* BaseDropdownEntryFieldModel.swift */, - 0A6BF4712360C56C0028F841 /* BaseDropdownEntryField.swift */, - 0A7EF86623D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift */, - 0ABD136C237CAD1E0081388D /* DateDropdownEntryField.swift */, - 0A7EF86423D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift */, - 0ABD1370237DB0450081388D /* ItemDropdownEntryField.swift */, - 017BEB3F23620A230024EF95 /* TextFieldModel.swift */, - ); - path = TextFields; - sourceTree = ""; - }; - D29DF26621E6A9E4003B2FB9 /* ThirdParty */ = { - isa = PBXGroup; - children = ( - D29DF26721E6AA0B003B2FB9 /* FLAnimatedImage */, - ); - path = ThirdParty; - sourceTree = ""; - }; - D29DF26721E6AA0B003B2FB9 /* FLAnimatedImage */ = { - isa = PBXGroup; - children = ( - D29DF26A21E6AA0B003B2FB9 /* FLAnimatedImage.h */, - D29DF26821E6AA0B003B2FB9 /* FLAnimatedImage.m */, - D29DF26B21E6AA0B003B2FB9 /* FLAnimatedImageView.h */, - D29DF26921E6AA0B003B2FB9 /* FLAnimatedImageView.m */, - ); - path = FLAnimatedImage; - sourceTree = ""; - }; - D29DF27021E79B2C003B2FB9 /* OtherHandlers */ = { - isa = PBXGroup; - children = ( - D2E1FADA2260D3D200AEFD8C /* MVMCoreUIDelegateObject.swift */, - D2B18B912361E65A00A9AEDC /* CoreUIObject.swift */, - D29DF27721E7A533003B2FB9 /* MVMCoreUISession.h */, - D29DF27821E7A533003B2FB9 /* MVMCoreUISession.m */, - D29DF27321E79E81003B2FB9 /* MVMCoreUILoggingHandler.h */, - D29DF27421E79E81003B2FB9 /* MVMCoreUILoggingHandler.m */, - D2C5001621F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.h */, - D2C5001721F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.m */, - D296E14622A597490051EBE7 /* MVMCoreUIViewConstrainingProtocol.h */, - 012A88C7238DB02000FE3DA1 /* ModelMoleculeDelegateProtocol.swift */, - D2A514562211C53C00345BFB /* MVMCoreUIMoleculeMappingObject.h */, - D2A514572211C53C00345BFB /* MVMCoreUIMoleculeMappingObject.m */, - 017BEB432362192F0024EF95 /* MVMCoreUIMoleculeMappingObject+ModelExtension.swift */, - 017BEB7E23676E870024EF95 /* MoleculeObjectMapping.swift */, - ); - path = OtherHandlers; - sourceTree = ""; - }; - D29DF2B621E7BE66003B2FB9 /* SplitViewController */ = { - isa = PBXGroup; - children = ( - D29DF2E021E9240B003B2FB9 /* MVMCoreUIPanelProtocol.h */, - D29DF27F21E7AA50003B2FB9 /* MVMCoreUIDetailViewProtocol.h */, - D29DF15321E69760003B2FB9 /* MVMCoreUIPanelButtonProtocol.h */, - D29DF11A21E684A9003B2FB9 /* MVMCoreUISplitViewController.h */, - D29DF11B21E684A9003B2FB9 /* MVMCoreUISplitViewController.m */, - ); - path = SplitViewController; - sourceTree = ""; - }; - D29DF2B721E7BE79003B2FB9 /* TabBarController */ = { - isa = PBXGroup; - children = ( - D29DF2C021E7BF56003B2FB9 /* MFTabBarSwipeAnimator.h */, - D29DF2C121E7BF57003B2FB9 /* MFTabBarSwipeAnimator.m */, - D29DF2C221E7BF57003B2FB9 /* MFTabBarInteractor.h */, - D29DF2C321E7BF57003B2FB9 /* MFTabBarInteractor.m */, - D29DF2B821E7BEA4003B2FB9 /* TopTabbar.h */, - D29DF2BA21E7BEA4003B2FB9 /* TopTabbar.m */, - D29DF2B921E7BEA4003B2FB9 /* MVMCoreUITabBarPageControlViewController.h */, - D29DF2BB21E7BEA4003B2FB9 /* MVMCoreUITabBarPageControlViewController.m */, - ); - path = TabBarController; - sourceTree = ""; - }; - D29DF31421ECECA7003B2FB9 /* SupportingFiles */ = { - isa = PBXGroup; - children = ( - D29DF32721EE8736003B2FB9 /* Strings */, - D29DF26621E6A9E4003B2FB9 /* ThirdParty */, - D29DF31521ECECC0003B2FB9 /* Fonts */, - D29DF32D21EE8C3D003B2FB9 /* Media.xcassets */, - ); - path = SupportingFiles; - sourceTree = ""; - }; - D29DF31521ECECC0003B2FB9 /* Fonts */ = { - isa = PBXGroup; - children = ( - 94CA227A24058533002D6750 /* VerizonNHGeDS-Bold.otf */, - 94CA227924058533002D6750 /* VerizonNHGeDS-Regular.otf */, - 94CA227824058533002D6750 /* VerizonNHGeTX-Bold.otf */, - 94CA227B24058533002D6750 /* VerizonNHGeTX-Regular.otf */, - 942C372D241149170066E45E /* NHaasGroteskDSStd-55Rg.otf */, - 942C372C241149170066E45E /* NHaasGroteskDSStd-75Bd.otf */, - D29DF31721ECECC0003B2FB9 /* OCRAExtended.ttf */, - ); - path = Fonts; - sourceTree = ""; - }; - D29DF32721EE8736003B2FB9 /* Strings */ = { - isa = PBXGroup; - children = ( - D29DF32821EE8736003B2FB9 /* Localizable.strings */, - ); - path = Strings; - sourceTree = ""; - }; - D29E28D423D1FFFA00ACEA85 /* Lists */ = { - isa = PBXGroup; - children = ( - D29E28DB23D21B0A00ACEA85 /* StringAndMoleculeStack */, - C695A68023C9830D00BFB94E /* NumberedListModel.swift */, - C6FA7D5123C77A4900A3614A /* NumberedList.swift */, - C695A67E23C9830600BFB94E /* UnOrderedListModel.swift */, - C6FA7D4F23C77A4700A3614A /* UnOrderedList.swift */, - ); - path = Lists; - sourceTree = ""; - }; - D29E28DB23D21B0A00ACEA85 /* StringAndMoleculeStack */ = { - isa = PBXGroup; - children = ( - D29E28D923D21AFA00ACEA85 /* StringAndMoleculeModel.swift */, - D29E28D723D21AB800ACEA85 /* StringAndMoleculeView.swift */, - C6FA7D5023C77A4800A3614A /* StringAndMoleculeStack.swift */, - ); - path = StringAndMoleculeStack; - sourceTree = ""; - }; - D29E28DE23D740FC00ACEA85 /* Container */ = { - isa = PBXGroup; - children = ( - 014AA72223C501E2006F3E93 /* ContainerModel.swift */, - D260105823D0A92900764D80 /* ContainerProtocol.swift */, - D243859823A16B1800332775 /* Container.swift */, - D29E28DC23D7404C00ACEA85 /* ContainerHelper.swift */, - ); - path = Container; - sourceTree = ""; - }; - D2B18B7D236090D500A9AEDC /* BaseClasses */ = { - isa = PBXGroup; - children = ( - D2E2A9A023E095AB000B42E6 /* ButtonModelProtocol.swift */, - C003506023AA94CD00B6AC29 /* Button.swift */, - D2B18B7E2360913400A9AEDC /* Control.swift */, - D2B18B802360945C00A9AEDC /* View.swift */, - 0AE14F63238315D2005417F8 /* TextField.swift */, - D2755D7A23689C7500485468 /* TableViewCell.swift */, - 0A5D59C323AD488600EFD9E9 /* Protocols */, - 0A14F6A423E4803A00EDF7F7 /* StackView.swift */, - 0A7918F423F5E7EA00772FF4 /* ImageView.swift */, - ); - path = BaseClasses; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - D29DF0C721E404D4003B2FB9 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - D260D7B622D68514007E7233 /* MVMCoreUIPagingProtocol.h in Headers */, - D29DF18021E69E49003B2FB9 /* MFView.h in Headers */, - D29DF27921E7A533003B2FB9 /* MVMCoreUISession.h in Headers */, - D29DF29D21E7AE38003B2FB9 /* MFStyler.h in Headers */, - D29DF2B021E7B3A4003B2FB9 /* MFTextView.h in Headers */, - D29DF2A921E7B2F9003B2FB9 /* MVMCoreUIConstants.h in Headers */, - 0198F7A62256A80B0066C936 /* MFRadioButton.h in Headers */, - D22D1F1A220341F60077CEC0 /* MVMCoreUICheckBox.h in Headers */, - D29DF29921E7ADB8003B2FB9 /* MFProgrammaticScrollViewController.h in Headers */, - D29DF11C21E684A9003B2FB9 /* MVMCoreUISplitViewController.h in Headers */, - D29DF29B21E7ADB9003B2FB9 /* StackableViewController.h in Headers */, - D29770F421F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsViewController.h in Headers */, - D29DF15421E69760003B2FB9 /* MVMCoreUIPanelButtonProtocol.h in Headers */, - D2A514582211C53C00345BFB /* MVMCoreUIMoleculeMappingObject.h in Headers */, - 9458C3172406C8FD00930963 /* UIFont+FontWrapping.h in Headers */, - D29DF0D121E404D4003B2FB9 /* MVMCoreUI.h in Headers */, - D29DF29A21E7ADB8003B2FB9 /* MFProgrammaticTableViewController.h in Headers */, - D29DF11521E6805F003B2FB9 /* UIColor+MFConvenience.h in Headers */, - D29DF2BC21E7BEA4003B2FB9 /* TopTabbar.h in Headers */, - D29DF25921E6A22D003B2FB9 /* MFButtonProtocol.h in Headers */, - D22D1F46220496A30077CEC0 /* MVMCoreUISwitch.h in Headers */, - D22D1F1E220343560077CEC0 /* MVMCoreUICheckMarkView.h in Headers */, - D29DF28421E7AB24003B2FB9 /* MVMCoreUICommonViewsUtility.h in Headers */, - 0A21DB87235E06EF00C160A2 /* MFTextFieldSubclassExtension.h in Headers */, - D22D1F562204CE5D0077CEC0 /* MVMCoreUIStackableViewController.h in Headers */, - D29DF2CE21E7C104003B2FB9 /* MFLoadingViewController.h in Headers */, - 0A21DB84235E06EF00C160A2 /* MFTextField.h in Headers */, - D29DF12A21E6851E003B2FB9 /* MVMCoreUITopAlertView.h in Headers */, - 94FB966223D797DA003D482B /* MFTextButton.h in Headers */, - D29DF27521E79E81003B2FB9 /* MVMCoreUILoggingHandler.h in Headers */, - D29DF28B21E7AC2B003B2FB9 /* ViewConstrainingView.h in Headers */, - D29DF2B321E7B76D003B2FB9 /* MFLoadingSpinner.h in Headers */, - 94AF4A3E23E9D13900676048 /* MFCaretButton.h in Headers */, - 0A21DB8A235E06EF00C160A2 /* MFDigitTextBox.h in Headers */, - D29DF32521ED0DA2003B2FB9 /* TextButtonView.h in Headers */, - 0A21DB8C235E06EF00C160A2 /* MFDigitTextField.h in Headers */, - D296E14722A5984C0051EBE7 /* MVMCoreUIViewConstrainingProtocol.h in Headers */, - D29DF2C621E7BF57003B2FB9 /* MFTabBarInteractor.h in Headers */, - D29DF17521E69E1F003B2FB9 /* ButtonDelegateProtocol.h in Headers */, - D29DF18221E69E54003B2FB9 /* SeparatorView.h in Headers */, - D29DF26E21E6AA0B003B2FB9 /* FLAnimatedImage.h in Headers */, - D29DF11621E6805F003B2FB9 /* NSLayoutConstraint+MFConvenience.h in Headers */, - 01E569D3223FFFA500327251 /* ThreeLayerViewController.swift in Headers */, - D29DF16221E69996003B2FB9 /* MFViewController.h in Headers */, - 0A21DB88235E06EF00C160A2 /* MFMdnTextField.h in Headers */, - D29DF13121E6851E003B2FB9 /* MVMCoreUITopAlertExpandableView.h in Headers */, - D29DF2C421E7BF57003B2FB9 /* MFTabBarSwipeAnimator.h in Headers */, - D2A5145D2211D22A00345BFB /* MVMCoreUIMoleculeViewProtocol.h in Headers */, - D29DF2CA21E7BFC8003B2FB9 /* MFSizeThreshold.h in Headers */, - D29DF28021E7AA51003B2FB9 /* MVMCoreUIDetailViewProtocol.h in Headers */, - D29DF2BD21E7BEA4003B2FB9 /* MVMCoreUITabBarPageControlViewController.h in Headers */, - 94AF4A4223E9D19E00676048 /* MFCaretView.h in Headers */, - D29DF2EE21ECEADF003B2FB9 /* MFFonts.h in Headers */, - D29DF12D21E6851E003B2FB9 /* MVMCoreUITopAlertBaseView.h in Headers */, - D29770F321F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsTableViewController.h in Headers */, - D2C5001821F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.h in Headers */, - D29770FD21F7C77400B2F0D0 /* MVMCoreUITextFieldView.h in Headers */, - D29DF17421E69E1F003B2FB9 /* MFCustomButton.h in Headers */, - D29DF29721E7ADB8003B2FB9 /* MFScrollingViewController.h in Headers */, - D260D7B122D65BDD007E7233 /* MVMCoreUIPageControl.h in Headers */, - D29DF26F21E6AA0B003B2FB9 /* FLAnimatedImageView.h in Headers */, - D29DF2A121E7AF4E003B2FB9 /* MVMCoreUIUtility.h in Headers */, - D29DF17621E69E1F003B2FB9 /* PrimaryButton.h in Headers */, - D29DF2C821E7BFC1003B2FB9 /* MFSizeObject.h in Headers */, - 94F217B623E0BF6100A47C06 /* PrimaryButtonView.h in Headers */, - D29DF32021ED0CBA003B2FB9 /* LabelView.h in Headers */, - D29770C921F7C4AE00B2F0D0 /* TopLabelsView.h in Headers */, - D29DF2E121E9240B003B2FB9 /* MVMCoreUIPanelProtocol.h in Headers */, - D29DF12921E6851E003B2FB9 /* MVMCoreUITopAlertMainView.h in Headers */, - D29DF12C21E6851E003B2FB9 /* MVMCoreUITopAlertShortView.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - D29DF0CB21E404D4003B2FB9 /* MVMCoreUI */ = { - isa = PBXNativeTarget; - buildConfigurationList = D29DF0D421E404D4003B2FB9 /* Build configuration list for PBXNativeTarget "MVMCoreUI" */; - buildPhases = ( - D29DF0C721E404D4003B2FB9 /* Headers */, - D29DF0C821E404D4003B2FB9 /* Sources */, - D29DF0C921E404D4003B2FB9 /* Frameworks */, - D29DF0CA21E404D4003B2FB9 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = MVMCoreUI; - productName = MVMCoreUI; - productReference = D29DF0CC21E404D4003B2FB9 /* MVMCoreUI.framework */; - productType = "com.apple.product-type.framework"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - D29DF0C321E404D4003B2FB9 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 1010; - ORGANIZATIONNAME = "Verizon Wireless"; - TargetAttributes = { - D29DF0CB21E404D4003B2FB9 = { - CreatedOnToolsVersion = 10.1; - LastSwiftMigration = 1010; - ProvisioningStyle = Automatic; - }; - }; - }; - buildConfigurationList = D29DF0C621E404D4003B2FB9 /* Build configuration list for PBXProject "MVMCoreUI" */; - compatibilityVersion = "Xcode 8.0"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - es, - "es-MX", - ); - mainGroup = D29DF0C221E404D4003B2FB9; - productRefGroup = D29DF0CD21E404D4003B2FB9 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - D29DF0CB21E404D4003B2FB9 /* MVMCoreUI */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - D29DF0CA21E404D4003B2FB9 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 94CA227F24058534002D6750 /* VerizonNHGeTX-Regular.otf in Resources */, - D29DF2AF21E7B3A4003B2FB9 /* MFTextView.xib in Resources */, - 0A21DB8E235E06EF00C160A2 /* MFDigitTextField.xib in Resources */, - 94CA227C24058534002D6750 /* VerizonNHGeTX-Bold.otf in Resources */, - D29DF32C21EE8736003B2FB9 /* Localizable.strings in Resources */, - 0A21DB86235E06EF00C160A2 /* MFTextField.xib in Resources */, - 94CA227D24058534002D6750 /* VerizonNHGeDS-Regular.otf in Resources */, - D29DF32E21EE8C3D003B2FB9 /* Media.xcassets in Resources */, - 942C372E241149170066E45E /* NHaasGroteskDSStd-75Bd.otf in Resources */, - 942C372F241149170066E45E /* NHaasGroteskDSStd-55Rg.otf in Resources */, - 94CA227E24058534002D6750 /* VerizonNHGeDS-Bold.otf in Resources */, - D29DF31B21ECECC0003B2FB9 /* OCRAExtended.ttf in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - D29DF0C821E404D4003B2FB9 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5248BFED23F12E350059236A /* ListThreeColumnPlanDataDividerModel.swift in Sources */, - 0A5D59C223AD2F5700EFD9E9 /* AppleGuidelinesProtocol.swift in Sources */, - 8D070BB0241B56530099AC56 /* ListRightVariableTotalDataModel.swift in Sources */, - 943784F5236B77BB006A1E82 /* GraphView.swift in Sources */, - 31BE15CC23D8924D00452370 /* CheckboxModel.swift in Sources */, - 94C661DA23CCF4FB00D9FE5B /* UIColor+Extension.swift in Sources */, - D29DF32121ED0CBA003B2FB9 /* LabelView.m in Sources */, - D28A838123CCB0D800DFE4FC /* AccordionListItemModel.swift in Sources */, - DBC4391822442197001AB423 /* CaretView.swift in Sources */, - C07065C42395677300FBF997 /* Link.swift in Sources */, - 0A69F611241BDEA700F7231B /* RuleAnyRequiredModel.swift in Sources */, - D29770F221F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsTableViewController.m in Sources */, - D29B771022C281F400D6ACE0 /* ModuleMolecule.swift in Sources */, - D28A838923CCCFCB00DFE4FC /* LinkModel.swift in Sources */, - 94C2D9A923872E5E0006CF46 /* LabelAttributeImageModel.swift in Sources */, - DBC4391922442197001AB423 /* DashLine.swift in Sources */, - 0A7BAD74232A8DC700FB8E22 /* HeadlineBodyButton.swift in Sources */, - D2FB151D23A40F1500C20E10 /* MoleculeStackItem.swift in Sources */, - AA11A41F23F15D3100D7962F /* ListRightVariablePayments.swift in Sources */, - D29DF29621E7ADB8003B2FB9 /* StackableViewController.m in Sources */, - 0116A4E5228B19640094F3ED /* RadioButtonSelectionHelper.swift in Sources */, - 017BEB48236230DB0024EF95 /* MoleculeViewProtocol.swift in Sources */, - D2E1FADB2260D3D200AEFD8C /* MVMCoreUIDelegateObject.swift in Sources */, - D27CD40E2322EEAF00C1DC07 /* TabsTableViewCell.swift in Sources */, - D224799B231965AD003FCCF9 /* AccordionMoleculeTableViewCell.swift in Sources */, - D22D1F1F220343560077CEC0 /* MVMCoreUICheckMarkView.m in Sources */, - D2E2A99423D8CCBC000B42E6 /* HeadlineBodyLinkModel.swift in Sources */, - 01004F3022721C3800991ECC /* RadioButton.swift in Sources */, - D268C70E238C22D7007F2C1C /* DropDownFilterTableViewCell.swift in Sources */, - 017BEB3C2361EA1D0024EF95 /* MFViewController+Model.swift in Sources */, - D236E5B7242007C500C38625 /* MVMControllerModelProtocol.swift in Sources */, - D282AAB4223FDDAE00C46919 /* MFLoadImageView.swift in Sources */, - D29DF11721E6805F003B2FB9 /* UIColor+MFConvenience.m in Sources */, - D2B18B7F2360913400A9AEDC /* Control.swift in Sources */, - 011D95A924057AC7000E3791 /* FormActionFieldProtocol.swift in Sources */, - D236E5B4241FEB1000C38625 /* ListTwoColumnPriceDescription.swift in Sources */, - 0AA33B3A2398524F0067DD0F /* Toggle.swift in Sources */, - D29DF12F21E6851E003B2FB9 /* MVMCoreUITopAlertMainView.m in Sources */, - 942C378C2412F4FA0066E45E /* ModalMoleculeListTemplate.swift in Sources */, - BB47A588241615FA002BB23C /* ListOneColumnFullWidthTextDividerSubsection.swift in Sources */, - 012A88C8238DB02000FE3DA1 /* ModelMoleculeDelegateProtocol.swift in Sources */, - 0A7EF86123D8AC2500B2AAD1 /* DigitEntryFieldModel.swift in Sources */, - DBC4392122491730001AB423 /* LabelWithInternalButton.swift in Sources */, - D224798C231450C8003FCCF9 /* HeadlineBodyToggle.swift in Sources */, - 017BEB442362192F0024EF95 /* MVMCoreUIMoleculeMappingObject+ModelExtension.swift in Sources */, - 9458C3182406C8FD00930963 /* UIFont+FontWrapping.m in Sources */, - 522679C123FE886900906CBA /* ListLeftVariableCheckboxAllTextAndLinks.swift in Sources */, - 9445890C2385BCE300DE9FD4 /* ProgressBarModel.swift in Sources */, - 9445891F2385D2E900DE9FD4 /* CaretViewModel.swift in Sources */, - 01C851D323CF9E740021F976 /* LabelToggleModel.swift in Sources */, - D29DF2C521E7BF57003B2FB9 /* MFTabBarSwipeAnimator.m in Sources */, - 011D95A3240453F8000E3791 /* RuleRegexModel.swift in Sources */, - D2E2A98323D8B32D000B42E6 /* EyebrowHeadlineBodyLinkModel.swift in Sources */, - 012A88AD238C418100FE3DA1 /* TemplateProtocol.swift in Sources */, - BB6C6AC1242232DF005F7224 /* ListOneColumnTextWithWhitespaceDividerTall.swift in Sources */, - D29DF2B421E7B76D003B2FB9 /* MFLoadingSpinner.m in Sources */, - 011D9602240DA20A000E3791 /* ValidProtocol.swift in Sources */, - D260106323D0C05000764D80 /* StackItemModel.swift in Sources */, - D2E2A99823D8D63C000B42E6 /* ActionDetailWithImageModel.swift in Sources */, - D2E2A99D23DA3217000B42E6 /* UIStackViewAlignment+Extension.swift in Sources */, - 01EB369423609801006832FA /* HeadlineBodyModel.swift in Sources */, - D2A92884241ACB25004E01C6 /* ProgrammaticScrollViewController.swift in Sources */, - 0A21DB7F235DECC500C160A2 /* EntryField.swift in Sources */, - D2E2A99F23E07F8A000B42E6 /* PillButton.swift in Sources */, - 0A4253AF23F5C2C100554656 /* BarsIndicatorView.swift in Sources */, - D2C5001921F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.m in Sources */, - D29DF12E21E6851E003B2FB9 /* MVMCoreUITopAlertView.m in Sources */, - D29DF2CF21E7C104003B2FB9 /* MFLoadingViewController.m in Sources */, - D28A837B23C928DA00DFE4FC /* MoleculeListCellProtocol.swift in Sources */, - 014AA72F23C5059B006F3E93 /* ThreeLayerPageTemplateModel.swift in Sources */, - 0A21DB91235E0EDB00C160A2 /* DigitBox.swift in Sources */, - D22D1F572204CE5D0077CEC0 /* MVMCoreUIStackableViewController.m in Sources */, - D28A838B23CCDA6B00DFE4FC /* ButtonModel.swift in Sources */, - D28A838D23CCDCC200DFE4FC /* PrimaryButton+MoleculeProtocolExtension.swift in Sources */, - D2A5145F2211DDC100345BFB /* MoleculeStackView.swift in Sources */, - C7F8012323E846C300396FBD /* ListRVWheelModel.swift in Sources */, - D29DF27621E79E81003B2FB9 /* MVMCoreUILoggingHandler.m in Sources */, - C695A69623C990BC00BFB94E /* DoughnutChart.swift in Sources */, - 014AA72D23C5059B006F3E93 /* StackPageTemplateModel.swift in Sources */, - D260106123D0C02A00764D80 /* StackItemModelProtocol.swift in Sources */, - 0AE98BAF23FEF956004C5109 /* ExternalLink.swift in Sources */, - 012A88C4238D86E600FE3DA1 /* CarouselItemModelProtocol.swift in Sources */, - D2E2A9A123E095AB000B42E6 /* ButtonModelProtocol.swift in Sources */, - 94C2D9AB23872EB50006CF46 /* LabelAttributeActionModel.swift in Sources */, - D22D8395241FB41200D3DF69 /* UIStackView+Extension.swift in Sources */, - 52B201D324081CFB00D2011E /* ListLeftVariableRadioButtonAndPaymentMethodModel.swift in Sources */, - 525239C02407BCFF00454969 /* ListTwoColumnPriceDetailsModel.swift in Sources */, - D2E2A99A23D8D6B4000B42E6 /* HeadlineBodyButtonModel.swift in Sources */, - 8D084AD22410BF7600951227 /* ListOneColumnFullWidthTextBodyText.swift in Sources */, - 94C0150C2421564A005811A9 /* ActionCollapseNotificationModel.swift in Sources */, - 014AA73123C5059B006F3E93 /* ListPageTemplateModel.swift in Sources */, - 017BEB4023620A230024EF95 /* TextFieldModel.swift in Sources */, - D29DF2A221E7AF4E003B2FB9 /* MVMCoreUIUtility.m in Sources */, - D29DF12B21E6851E003B2FB9 /* MVMCoreUITopAlertExpandableView.m in Sources */, - 94C2D9A723872DA90006CF46 /* LabelAttributeColorModel.swift in Sources */, - 0103B84E23D7E33A009C315C /* HeadlineBodyToggleModel.swift in Sources */, - D2755D7B23689C7500485468 /* TableViewCell.swift in Sources */, - 0A21DB85235E06EF00C160A2 /* MFTextField.m in Sources */, - 0AAF8E2C240EA594008DD263 /* NumericCarouselIndicatorModel.swift in Sources */, - 014AA72623C501E2006F3E93 /* ContainerModelProtocol.swift in Sources */, - AA11A42123F15D7000D7962F /* ListRightVariablePaymentsModel.swift in Sources */, - 01EB369223609801006832FA /* MoleculeStackModel.swift in Sources */, - 012CA99E2385A2D3003F810F /* MFView+ModelExtension.swift in Sources */, - 011D9626240EBB16000E3791 /* RadioButtonLabelModel.swift in Sources */, - AAA74A192410C05800080241 /* HeadersH2NoButtonsBodyTextModel.swift in Sources */, - D282AABA224131D100C46919 /* MFTransparentGIFView.swift in Sources */, - 944589232385DA9600DE9FD4 /* ImageViewModel.swift in Sources */, - D213347723843825008E41B3 /* Line.swift in Sources */, - D28A837723C79FC600DFE4FC /* MFCustomButton+ActionModel.swift in Sources */, - D2E2A99C23D8D975000B42E6 /* ImageHeadlineBodyModel.swift in Sources */, - 525019DE2406430800EED91C /* ListProgressBarData.swift in Sources */, - D28A837F23CCA96400DFE4FC /* TabsModel.swift in Sources */, - 012A88EC238F084D00FE3DA1 /* FooterModel.swift in Sources */, - D2A514672213885800345BFB /* MoleculeHeaderView.swift in Sources */, - D29E28D823D21AB800ACEA85 /* StringAndMoleculeView.swift in Sources */, - 01EB369023609801006832FA /* MoleculeListItemModel.swift in Sources */, - D28A838323CCBD3F00DFE4FC /* CircleProgressModel.swift in Sources */, - D268C70C2386DFFD007F2C1C /* MoleculeStackItemModel.swift in Sources */, - DBEFFA04225A829700230692 /* Label.swift in Sources */, - D2D6CD4022E78C1A00D701B8 /* Scroller.swift in Sources */, - 0A7EF85F23D8ABC500B2AAD1 /* MdnEntryFieldModel.swift in Sources */, - 011D959B240451E3000E3791 /* RuleRequiredModel.swift in Sources */, - 526A265C240D1FF700B0D828 /* ListTwoColumnCompareChangesModel.swift in Sources */, - D2A92886241ACD99004E01C6 /* ProgrammaticTableViewController.swift in Sources */, - 01509D952327ED1900EF99AA /* HeadlineBodyLinkToggle.swift in Sources */, - 31BE15CB23D8924D00452370 /* CheckboxLabelModel.swift in Sources */, - D260105523CEA7DC00764D80 /* MVMCoreUISwitch+Model.swift in Sources */, - D29DF13021E6851E003B2FB9 /* MVMCoreUITopAlertShortView.m in Sources */, - 5248BFEC23F12E350059236A /* ListThreeColumnPlanDataDivider.swift in Sources */, - 0ABD136D237CAD1E0081388D /* DateDropdownEntryField.swift in Sources */, - 0A7EF85B23D8A52800B2AAD1 /* EntryFieldModel.swift in Sources */, - 94F217B723E0BF6100A47C06 /* PrimaryButtonView.m in Sources */, - 0A1B4A96233BB18F005B3FB4 /* CheckboxLabel.swift in Sources */, - 0A21DB8B235E06EF00C160A2 /* MFDigitTextBox.m in Sources */, - D260D7B222D65BDD007E7233 /* MVMCoreUIPageControl.m in Sources */, - BB47A586241615EF002BB23C /* ListOneColumnFullWidthTextDividerSubsectionModel.swift in Sources */, - D2B18B812360945C00A9AEDC /* View.swift in Sources */, - C6FA7D5423C77A4A00A3614A /* NumberedList.swift in Sources */, - D29DF26D21E6AA0B003B2FB9 /* FLAnimatedImageView.m in Sources */, - 525019E52406852100EED91C /* ListFourColumnDataUsageDividerModel.swift in Sources */, - 0A7EF86723D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift in Sources */, - 94FB966323D797DA003D482B /* MFTextButton.m in Sources */, - D29C94D5242901C9003813BA /* MVMCoreUICommonViewsUtility+Extension.swift in Sources */, - D260105323CEA61600764D80 /* ToggleModel.swift in Sources */, - 014AA72523C501E2006F3E93 /* ContainerModel.swift in Sources */, - 0A7EF86523D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift in Sources */, - D29DF2EF21ECEAE1003B2FB9 /* MFFonts.m in Sources */, - D22479942316AE5E003FCCF9 /* NSLayoutConstraintExtension.swift in Sources */, - D2B18B94236214AD00A9AEDC /* NavigationController.swift in Sources */, - D29E28DA23D21AFA00ACEA85 /* StringAndMoleculeModel.swift in Sources */, - D282AACB2243C61700C46919 /* ButtonView.swift in Sources */, - D260105D23D0BCD400764D80 /* Stack.swift in Sources */, - 0A7EF85D23D8A95600B2AAD1 /* TextEntryFieldModel.swift in Sources */, - D2D6CD4222E78FAB00D701B8 /* ThreeLayerTemplate.swift in Sources */, - 01EB368F23609801006832FA /* LabelModel.swift in Sources */, - 942C378E2412F5B60066E45E /* ModalMoleculeStackTemplate.swift in Sources */, - 01F2A03223A4498200D954D8 /* CaretLinkModel.swift in Sources */, - 0A7BAFA1232BE61800FB8E22 /* Checkbox.swift in Sources */, - 011B58F023A2AA980085F53C /* ListItemModelProtocol.swift in Sources */, - 0A14F6A923E8750300EDF7F7 /* CarouselIndicatorModel.swift in Sources */, - D22479962316AF6E003FCCF9 /* HeadlineBodyLink.swift in Sources */, - D29DF2AE21E7B3A4003B2FB9 /* MFTextView.m in Sources */, - 0A41BA7F23453A6400D4C0BC /* TextEntryField.swift in Sources */, - 017BEB382360C6AC0024EF95 /* RadioButtonLabel.swift in Sources */, - D29DF18121E69E50003B2FB9 /* MFView.m in Sources */, - D28A837923C7D5BC00DFE4FC /* PageModelProtocol.swift in Sources */, - D29DF18321E69E54003B2FB9 /* SeparatorView.m in Sources */, - D29DF17A21E69E1F003B2FB9 /* MFCustomButton.m in Sources */, - 017BEB7B236763000024EF95 /* LineModel.swift in Sources */, - D256E9932412880000360572 /* Header.swift in Sources */, - 94C2D9A523872C350006CF46 /* LabelAttributeFontModel.swift in Sources */, - 011D958724042492000E3791 /* FormFieldProtocol.swift in Sources */, - 011D95AF2407266E000E3791 /* RadioButtonModel.swift in Sources */, - 017BEB7F23676E870024EF95 /* MoleculeObjectMapping.swift in Sources */, - D274CA332236A78900B01B62 /* FooterView.swift in Sources */, - D29DF2BF21E7BEA4003B2FB9 /* MVMCoreUITabBarPageControlViewController.m in Sources */, - 0A14F69323E349EF00EDF7F7 /* CarouselIndicator.swift in Sources */, - 014AA72423C501E2006F3E93 /* MoleculeContainerModel.swift in Sources */, - D29DF28321E7AB24003B2FB9 /* MVMCoreUICommonViewsUtility.m in Sources */, - 011B58F223A2AE2C0085F53C /* DropDownListItemModel.swift in Sources */, - 8D448E5524050A46006211BB /* ListOneColumnFullWidthTextAllTextAndLinksModel.swift in Sources */, - 94C2D9842386F3F80006CF46 /* LabelAttributeModel.swift in Sources */, - 944589212385D6E900DE9FD4 /* DashLineModel.swift in Sources */, - D2E2A99623D8CF85000B42E6 /* HeadlineBodyLinkToggleModel.swift in Sources */, - C6FA7D5323C77A4A00A3614A /* StringAndMoleculeStack.swift in Sources */, - 011D958524042432000E3791 /* RulesProtocol.swift in Sources */, - 94AF4A3F23E9D13900676048 /* MFCaretButton.m in Sources */, - D29DF27A21E7A533003B2FB9 /* MVMCoreUISession.m in Sources */, - D2A5146B2214905000345BFB /* ThreeLayerViewController.swift in Sources */, - 526A265E240D200500B0D828 /* ListTwoColumnCompareChanges.swift in Sources */, - 8D24041523E7FC0B009E23BE /* ListLeftVariableIconWithRightCaretModel.swift in Sources */, - D28A838F23CCDEDE00DFE4FC /* TwoButtonViewModel.swift in Sources */, - D2D90B42240463E100DD6EC9 /* MoleculeHeaderModel.swift in Sources */, - 012A88B1238C880100FE3DA1 /* CarouselPagingModelProtocol.swift in Sources */, - D29DF2C921E7BFC6003B2FB9 /* MFSizeObject.m in Sources */, - 9445890E2385C3F800DE9FD4 /* MultiProgressModel.swift in Sources */, - 011D95A5240455DC000E3791 /* FormGroupRule.swift in Sources */, - D2A6390522CBCE160052ED1F /* MoleculeCollectionViewCell.swift in Sources */, - D2A6390122CBB1820052ED1F /* Carousel.swift in Sources */, - 0A14F6B423E8C29700EDF7F7 /* NumericIndicatorView.swift in Sources */, - D29DF2C721E7BF57003B2FB9 /* MFTabBarInteractor.m in Sources */, - C7F8012123E8303200396FBD /* ListRVWheel.swift in Sources */, - D29DF29521E7ADB8003B2FB9 /* MFProgrammaticScrollViewController.m in Sources */, - D2FB151B23A2B65B00C20E10 /* MoleculeContainer.swift in Sources */, - BB6C6AC0242232DF005F7224 /* ListOneColumnTextWithWhitespaceDividerTallModel.swift in Sources */, - D2A638FD22CA98280052ED1F /* HeadlineBody.swift in Sources */, - D29DF16121E69996003B2FB9 /* MFViewController.m in Sources */, - AAA74A172410C04600080241 /* HeadersH2NoButtonsBodyText.swift in Sources */, - 522679C223FE886900906CBA /* ListLeftVariableCheckboxAllTextAndLinksModel.swift in Sources */, - 8D084AD02410BF4800951227 /* ListOneColumnFullWidthTextBodyTextModel.swift in Sources */, - 0ABD1371237DB0450081388D /* ItemDropdownEntryField.swift in Sources */, - 8D24041123E7FB9E009E23BE /* ListLeftVariableIconWithRightCaret.swift in Sources */, - D2E1FAE12268E81D00AEFD8C /* MoleculeListTemplate.swift in Sources */, - 525019E72406853600EED91C /* ListFourColumnDataUsageDivider.swift in Sources */, - 0AE98BB323FF0934004C5109 /* ExternalLinkModel.swift in Sources */, - D20FB165241A5D75004AFC3A /* NavigationItemModelProtocol.swift in Sources */, - DB06250B2293456500B72DD3 /* LeftRightLabelView.swift in Sources */, - 0A21DB89235E06EF00C160A2 /* MFMdnTextField.m in Sources */, - D224798A2314445E003FCCF9 /* LabelToggle.swift in Sources */, - D2A92882241AAB67004E01C6 /* ScrollingViewController.swift in Sources */, - D22D1F47220496A30077CEC0 /* MVMCoreUISwitch.m in Sources */, - C695A67F23C9830600BFB94E /* UnOrderedListModel.swift in Sources */, - 0AE98BB523FF18D2004C5109 /* Arrow.swift in Sources */, - D2D90B442404789000DD6EC9 /* MoleculeContainerProtocol.swift in Sources */, - 94C0150A24215643005811A9 /* ActionTopAlertModel.swift in Sources */, - 012A88DB238ED45900FE3DA1 /* CarouselModel.swift in Sources */, - D29DF28C21E7AC2B003B2FB9 /* ViewConstrainingView.m in Sources */, - 0AE14F64238315D2005417F8 /* TextField.swift in Sources */, - D29DF17B21E69E1F003B2FB9 /* PrimaryButton.m in Sources */, - D2C78CD224228BBD00B69FDE /* ActionOpenPanelModel.swift in Sources */, - 017BEB4A236235BA0024EF95 /* ModelMoleculeViewProtocol.swift in Sources */, - C695A68123C9830D00BFB94E /* NumberedListModel.swift in Sources */, - 01EB3684236097C0006832FA /* MoleculeModelProtocol.swift in Sources */, - D27CD4102339057800C1DC07 /* EyebrowHeadlineBodyLink.swift in Sources */, - 8D070BB2241B56AD0099AC56 /* ListRightVariableTotalData.swift in Sources */, - D29DF11D21E684A9003B2FB9 /* MVMCoreUISplitViewController.m in Sources */, -<<<<<<< HEAD - 0A7918F523F5E7EA00772FF4 /* ImageView.swift in Sources */, - 0198F79F225679880066C936 /* FormValidationProtocol.swift in Sources */, -======= ->>>>>>> develop - D243859923A16B1800332775 /* Container.swift in Sources */, - D2C521A923EDE79E00CA2634 /* ViewController.swift in Sources */, - D260105B23D0BB7100764D80 /* StackModelProtocol.swift in Sources */, - D29DF29821E7ADB8003B2FB9 /* MFScrollingViewController.m in Sources */, - D28A839323CE828900DFE4FC /* HeadlineBodyCaretLinkImageModel.swift in Sources */, - D29770C821F7C4AE00B2F0D0 /* TopLabelsView.m in Sources */, - D260105F23D0BFFC00764D80 /* StackItem.swift in Sources */, - 9432A79F23DB47BA00719041 /* EntryFieldContainer.swift in Sources */, - 01EB369323609801006832FA /* HeaderModel.swift in Sources */, - D2E1FADF2268B8E700AEFD8C /* ThreeLayerTableViewController.swift in Sources */, - 0A21DB83235DFBC500C160A2 /* MdnEntryField.swift in Sources */, - 0AE98BB723FF18E9004C5109 /* ArrowModel.swift in Sources */, - D28A837D23CCA86A00DFE4FC /* TabsListItemModel.swift in Sources */, - 012A88C6238DA34000FE3DA1 /* ModuleMoleculeModel.swift in Sources */, - 94C2D9A123872BCC0006CF46 /* LabelAttributeUnderlineModel.swift in Sources */, - D20A9A5E2243D3E300ADE781 /* TwoButtonView.swift in Sources */, - D2B1E3E522F37D6A0065F95C /* ImageHeadlineBody.swift in Sources */, - 011D9628240EFA1E000E3791 /* MFViewController+Form.swift in Sources */, - 0A21DB94235E24ED00C160A2 /* DigitEntryField.swift in Sources */, - 52B201D224081CFB00D2011E /* ListLeftVariableRadioButtonAndPaymentMethod.swift in Sources */, - D26C5A6B23F4A40D007AEECE /* ListItemModel.swift in Sources */, - 0A21DB8D235E06EF00C160A2 /* MFDigitTextField.m in Sources */, - 94AF4A4323E9D19E00676048 /* MFCaretView.m in Sources */, - 943784F6236B77BB006A1E82 /* GraphViewAnimationHandler.swift in Sources */, - 011D95A1240453D0000E3791 /* RuleEqualsModel.swift in Sources */, - D29DF2AA21E7B2F9003B2FB9 /* MVMCoreUIConstants.m in Sources */, - 011D95892404249B000E3791 /* FormHolderModelProtocol.swift in Sources */, - 948DB67E2326DCD90011F916 /* MultiProgress.swift in Sources */, - 013F801923FB4A8E00AD8013 /* UIContentMode+Extension.swift in Sources */, - 525239C22407BD1000454969 /* ListTwoColumnPriceDetails.swift in Sources */, - D2A5146122121FBF00345BFB /* MoleculeStackTemplate.swift in Sources */, - D2E2A9A323E096B1000B42E6 /* DisableableModelProtocol.swift in Sources */, - D29DF11821E6805F003B2FB9 /* NSLayoutConstraint+MFConvenience.m in Sources */, - 94C2D9A323872C110006CF46 /* LabelAttributeStrikeThroughModel.swift in Sources */, - D28A838523CCCA8900DFE4FC /* ScrollerModel.swift in Sources */, - D29DF26C21E6AA0B003B2FB9 /* FLAnimatedImage.m in Sources */, - D28A839123CD4FD400DFE4FC /* CornerLabelsModel.swift in Sources */, - 012A88F123985E0100FE3DA1 /* Color.swift in Sources */, - D22D8393241C27B100D3DF69 /* TemplateModel.swift in Sources */, - 012A889C23889E8400FE3DA1 /* TemplateModelProtocol.swift in Sources */, - D29770FC21F7C77400B2F0D0 /* MVMCoreUITextFieldView.m in Sources */, - 52267A0723FFE25000906CBA /* ListOneColumnFullWidthTextAllTextAndLinks.swift in Sources */, - C003506123AA94CD00B6AC29 /* Button.swift in Sources */, - 0A14F6A523E4803A00EDF7F7 /* StackView.swift in Sources */, - DBC4391B224421A0001AB423 /* CaretLink.swift in Sources */, - 0198F7A82256A80B0066C936 /* MFRadioButton.m in Sources */, - 0A6BF4722360C56C0028F841 /* BaseDropdownEntryField.swift in Sources */, - BB6C6AC824225290005F7224 /* ListOneColumnTextWithWhitespaceDividerShort.swift in Sources */, - 0A41BA6E2344FCD400D4C0BC /* CATransaction+Extension.swift in Sources */, - C7192E7D23C301750050C2A0 /* HeadLineBodyCaretLinkImage.swift in Sources */, - D29DF13221E6851E003B2FB9 /* MVMCoreUITopAlertBaseView.m in Sources */, - D29DF29C21E7ADB9003B2FB9 /* MFProgrammaticTableViewController.m in Sources */, - 0A7EF86323D8AFA000B2AAD1 /* BaseDropdownEntryFieldModel.swift in Sources */, - 0A1214A022C11A18007C7030 /* ActionDetailWithImage.swift in Sources */, - D236E5B5241FEB1000C38625 /* ListTwoColumnPriceDescriptionModel.swift in Sources */, - D2B18B922361E65A00A9AEDC /* CoreUIObject.swift in Sources */, - D29DF2BE21E7BEA4003B2FB9 /* TopTabbar.m in Sources */, - 014AA72E23C5059B006F3E93 /* StackCenteredPageTemplateModel.swift in Sources */, - D2A514632213643100345BFB /* MoleculeStackCenteredTemplate.swift in Sources */, - 011D959D2404536F000E3791 /* RuleAnyValueChangedModel.swift in Sources */, - D260105923D0A92900764D80 /* ContainerProtocol.swift in Sources */, - BB6C6AC924225290005F7224 /* ListOneColumnTextWithWhitespaceDividerShortModel.swift in Sources */, - C695A69423C9909000BFB94E /* DoughnutChartModel.swift in Sources */, - D29DF32421ED0DA2003B2FB9 /* TextButtonView.m in Sources */, - D29E28DD23D7404C00ACEA85 /* ContainerHelper.swift in Sources */, - 012A88C2238D7BCA00FE3DA1 /* CarouselItemModel.swift in Sources */, - D29DF29E21E7AE3B003B2FB9 /* MFStyler.m in Sources */, - D2A514592211C53C00345BFB /* MVMCoreUIMoleculeMappingObject.m in Sources */, - 94C661D923CCF4B400D9FE5B /* LeftRightLabelModel.swift in Sources */, - 011D95AB2405C553000E3791 /* FormItemProtocol.swift in Sources */, - D21EE53C23AD3AD4003D1A30 /* NSLayoutConstraintAxis+Extension.swift in Sources */, - 525019DD2406430800EED91C /* ListProgressBarDataModel.swift in Sources */, - C6FA7D5223C77A4A00A3614A /* UnOrderedList.swift in Sources */, - 01509D8F2327EC6F00EF99AA /* MoleculeTableViewCell.swift in Sources */, - 0105618D224BBE7700E1557D /* FormValidator.swift in Sources */, - 0AAF8E2A240EA57D008DD263 /* BarsCarouselIndicatorModel.swift in Sources */, - 01509D912327ECE600EF99AA /* CornerLabels.swift in Sources */, - D22D1F1B220341F60077CEC0 /* MVMCoreUICheckBox.m in Sources */, - C695A69823C990C200BFB94E /* DoughnutChartView.swift in Sources */, - D29DF2CB21E7BFCC003B2FB9 /* MFSizeThreshold.m in Sources */, - 011D959F240453A1000E3791 /* RuleAllValueChangedModel.swift in Sources */, - 011D95AD2406BB57000E3791 /* FormHolderProtocol.swift in Sources */, - 01509D932327ECFB00EF99AA /* ProgressBar.swift in Sources */, - D260106523D0CEA700764D80 /* StackModel.swift in Sources */, - D29770F521F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsViewController.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - D29DF32821EE8736003B2FB9 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - D29DF32921EE8736003B2FB9 /* en */, - D29DF32A21EE8736003B2FB9 /* es */, - D29DF32B21EE8736003B2FB9 /* es-MX */, - ); - name = Localizable.strings; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - D29DF0D221E404D4003B2FB9 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - D29DF0D321E404D4003B2FB9 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - D29DF0D521E404D4003B2FB9 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BITCODE_GENERATION_MODE = bitcode; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_IDENTITY = ""; - CODE_SIGN_STYLE = Automatic; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = FCMA4QKS77; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../SharedFrameworks"; - INFOPLIST_FILE = MVMCoreUI/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.vzw.MVMCoreUI; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - D29DF0D621E404D4003B2FB9 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BITCODE_GENERATION_MODE = bitcode; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_IDENTITY = ""; - CODE_SIGN_STYLE = Automatic; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = FCMA4QKS77; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../SharedFrameworks"; - INFOPLIST_FILE = MVMCoreUI/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.vzw.MVMCoreUI; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - D29DF0C621E404D4003B2FB9 /* Build configuration list for PBXProject "MVMCoreUI" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - D29DF0D221E404D4003B2FB9 /* Debug */, - D29DF0D321E404D4003B2FB9 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - D29DF0D421E404D4003B2FB9 /* Build configuration list for PBXNativeTarget "MVMCoreUI" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - D29DF0D521E404D4003B2FB9 /* Debug */, - D29DF0D621E404D4003B2FB9 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = D29DF0C321E404D4003B2FB9 /* Project object */; -} From d039a0a64ab1aaab8084b148b4c2d4dd11d2835e Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Thu, 2 Apr 2020 10:09:32 -0400 Subject: [PATCH 33/78] matching --- .../Atoms/Views/CarouselIndicator/BarsIndicatorView.swift | 2 -- .../Atoms/Views/CarouselIndicator/CarouselIndicator.swift | 5 +++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift index 8625bfb1..0435e84d 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift @@ -22,7 +22,6 @@ open class BarsIndicatorView: CarouselIndicator { stackView.alignment = .bottom stackView.distribution = .equalSpacing stackView.spacing = 6 - stackView.heightAnchor.constraint(lessThanOrEqualToConstant: BarsIndicatorView.indicatorBarHeight.selected).isActive = true return stackView }() @@ -89,7 +88,6 @@ open class BarsIndicatorView: CarouselIndicator { NSLayoutConstraint.activate([ stackView.heightAnchor.constraint(equalToConstant: 4), heightAnchor.constraint(equalTo: stackView.heightAnchor), - stackView.centerXAnchor.constraint(equalTo: centerXAnchor), stackView.leadingAnchor.constraint(equalTo: leadingAnchor), stackView.topAnchor.constraint(equalTo: topAnchor), bottomAnchor.constraint(equalTo: stackView.bottomAnchor), diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift index df00c998..ccce0266 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift @@ -49,13 +49,14 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { carouselIndicatorModel?.currentIndex = newIndex previousIndex = _currentIndex _currentIndex = newIndex - performAction() + if previousIndex != newIndex { updateUI(previousIndex: previousIndex, newIndex: newIndex, totalCount: numberOfPages, isAnimated: carouselIndicatorModel?.isAnimated ?? true) + performAction() } } } @@ -72,7 +73,7 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { carouselIndicatorModel?.numberOfPages = newTotal _numberOfPages = newTotal - isHidden = carouselIndicatorModel?.hidesForSinglePage ?? false && newTotal <= 1 + isHidden = (carouselIndicatorModel?.hidesForSinglePage ?? false) && newTotal <= 1 updateUI(previousIndex: previousIndex, newIndex: currentIndex, totalCount: newTotal, From 65cd734a403512a7770b2521520d64a4a0fec400 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Thu, 2 Apr 2020 10:45:42 -0400 Subject: [PATCH 34/78] removed duplicate file --- .../BarsCarouselIndicatorModel.swift | 49 ---- .../CarouselIndicator/BarsIndicatorView.swift | 172 ------------- .../CarouselIndicator/CarouselIndicator.swift | 235 ------------------ .../CarouselIndicatorModel.swift | 126 ---------- .../NumericCarouselIndicatorModel.swift | 19 -- .../NumericIndicatorView.swift | 131 ---------- 6 files changed, 732 deletions(-) delete mode 100644 MVMCoreUI/Atomic/Atoms/Buttons/CarouselIndicator/BarsCarouselIndicatorModel.swift delete mode 100644 MVMCoreUI/Atomic/Atoms/Buttons/CarouselIndicator/BarsIndicatorView.swift delete mode 100644 MVMCoreUI/Atomic/Atoms/Buttons/CarouselIndicator/CarouselIndicator.swift delete mode 100644 MVMCoreUI/Atomic/Atoms/Buttons/CarouselIndicator/CarouselIndicatorModel.swift delete mode 100644 MVMCoreUI/Atomic/Atoms/Buttons/CarouselIndicator/NumericCarouselIndicatorModel.swift delete mode 100644 MVMCoreUI/Atomic/Atoms/Buttons/CarouselIndicator/NumericIndicatorView.swift diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/CarouselIndicator/BarsCarouselIndicatorModel.swift b/MVMCoreUI/Atomic/Atoms/Buttons/CarouselIndicator/BarsCarouselIndicatorModel.swift deleted file mode 100644 index 89369987..00000000 --- a/MVMCoreUI/Atomic/Atoms/Buttons/CarouselIndicator/BarsCarouselIndicatorModel.swift +++ /dev/null @@ -1,49 +0,0 @@ -// -// BarsCarouselIndicatorModel.swift -// MVMCoreUI -// -// Created by Kevin Christiano on 3/3/20. -// Copyright © 2020 Verizon Wireless. All rights reserved. -// - -import UIKit - - -open class BarsCarouselIndicatorModel: CarouselIndicatorModel { - //-------------------------------------------------- - // MARK: - Properties - //-------------------------------------------------- - - public class override var identifier: String { - return "barsCarouselIndicator" - } - - public var currentIndicatorColor: Color = Color(uiColor: .mvmBlack) - - //-------------------------------------------------- - // MARK: - Keys - //-------------------------------------------------- - - private enum CodingKeys: String, CodingKey { - case currentIndicatorColor - } - - //-------------------------------------------------- - // MARK: - Codec - //-------------------------------------------------- - - public required init(from decoder: Decoder) throws { - let typeContainer = try decoder.container(keyedBy: CodingKeys.self) - - if let currentIndicatorColor = try typeContainer.decodeIfPresent(Color.self, forKey: .currentIndicatorColor) { - self.currentIndicatorColor = currentIndicatorColor - } - - try super.init(from: decoder) - } - - public override func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(currentIndicatorColor, forKey: .currentIndicatorColor) - } -} diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/CarouselIndicator/BarsIndicatorView.swift b/MVMCoreUI/Atomic/Atoms/Buttons/CarouselIndicator/BarsIndicatorView.swift deleted file mode 100644 index 5724a76e..00000000 --- a/MVMCoreUI/Atomic/Atoms/Buttons/CarouselIndicator/BarsIndicatorView.swift +++ /dev/null @@ -1,172 +0,0 @@ -// -// BarIndicatorView.swift -// MVMCoreUI -// -// Created by Kevin Christiano on 2/3/20. -// Copyright © 2020 Verizon Wireless. All rights reserved. -// - -import UIKit - - -open class BarsIndicatorView: CarouselIndicator { - //-------------------------------------------------- - // MARK: - Stored Properties - //-------------------------------------------------- - - public let stackView: StackView = { - let stackView = StackView() - stackView.axis = .horizontal - stackView.alignment = .bottom - stackView.distribution = .equalSpacing - stackView.spacing = 6 - stackView.heightAnchor.constraint(lessThanOrEqualToConstant: BarsIndicatorView.indicatorBarHeight.selected).isActive = true - return stackView - }() - - public var barReferences: [(view: View, constraint: NSLayoutConstraint)] = [] - - // Dimensions are based on InVision Design Guidelines. - public static let indicatorBarWidth: CGFloat = 24 - public static let indicatorBarHeight: (selected: CGFloat, unselected: CGFloat) = (selected: 4, unselected: 1) - - /// Convenience to access the model. - public var barsCarouselIndicatorModel: BarsCarouselIndicatorModel? { - return model as? BarsCarouselIndicatorModel - } - - //-------------------------------------------------- - // MARK: - Computed Properties - //-------------------------------------------------- - - open override var isEnabled: Bool { - didSet { - barReferences.forEach { view, _ in - view.backgroundColor = isEnabled ? indicatorColor : disabledIndicatorColor - } - } - } - - private(set) var _currentIndicatorColor: UIColor = .black - - /// Colors the currently selected index, unique from other indicators - public var currentIndicatorColor: UIColor { - get { return _currentIndicatorColor } - set (newColor) { - _currentIndicatorColor = newColor - barsCarouselIndicatorModel?.currentIndicatorColor = Color(uiColor: newColor) - - if !barReferences.isEmpty { - barReferences[currentIndex].view.backgroundColor = newColor - } - } - } - - public override var indicatorColor: UIColor { - get { return _indicatorColor } - set (newColor) { - super.indicatorColor = newColor - - for (i, barTuple) in barReferences.enumerated() where i != currentIndex { - barTuple.view.backgroundColor = newColor - } - } - } - - //-------------------------------------------------- - // MARK: - Initializers - //-------------------------------------------------- - - public init() { - super.init(frame: .zero) - } - - public required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - //-------------------------------------------------- - // MARK: - Setup - //-------------------------------------------------- - - open override func setupView() { - super.setupView() - - addSubview(stackView) - isUserInteractionEnabled = false - - NSLayoutConstraint.activate([ - stackView.heightAnchor.constraint(equalToConstant: 4), - heightAnchor.constraint(equalTo: stackView.heightAnchor), - stackView.centerXAnchor.constraint(equalTo: centerXAnchor), - stackView.leadingAnchor.constraint(equalTo: leadingAnchor), - stackView.topAnchor.constraint(equalTo: topAnchor), - bottomAnchor.constraint(equalTo: stackView.bottomAnchor), - trailingAnchor.constraint(equalTo: stackView.trailingAnchor) - ]) - } - - //-------------------------------------------------- - // MARK: - Methods - //-------------------------------------------------- - - func generateBars() { - - var bars = [(View, NSLayoutConstraint)]() - - for i in 0..= touchPoint_X && $0.0.frame.minX <= touchPoint_X } ?? 0 - } - - open override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { - super.set(with: model, delegateObject, additionalData) - - guard let model = model as? BarsCarouselIndicatorModel else { return } - - currentIndicatorColor = model.currentIndicatorColor.uiColor - } - - //-------------------------------------------------- - // MARK: - IndicatorViewProtocol - //-------------------------------------------------- - - public override func reset() { - super.reset() - barReferences.forEach { $0.view.removeFromSuperview() } - barReferences = [] - } - - public override func updateUI(previousIndex: Int, newIndex: Int, totalCount: Int, isAnimated: Bool) { - - guard !barReferences.isEmpty else { - generateBars() - return - } - - let expression = { - self.barReferences[previousIndex].view.backgroundColor = self.indicatorColor - self.barReferences[newIndex].view.backgroundColor = self.currentIndicatorColor - self.barReferences[previousIndex].constraint.constant = BarsIndicatorView.indicatorBarHeight.unselected - self.barReferences[newIndex].constraint.constant = BarsIndicatorView.indicatorBarHeight.selected - self.layoutIfNeeded() - } - - isAnimated ? UIView.animate(withDuration: 0.3) { expression() } : expression() - } -} diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/CarouselIndicator/CarouselIndicator.swift b/MVMCoreUI/Atomic/Atoms/Buttons/CarouselIndicator/CarouselIndicator.swift deleted file mode 100644 index 1e4db496..00000000 --- a/MVMCoreUI/Atomic/Atoms/Buttons/CarouselIndicator/CarouselIndicator.swift +++ /dev/null @@ -1,235 +0,0 @@ -// -// CarouselIndicator.swift -// MVMCoreUI -// -// Created by Kevin Christiano on 1/30/20. -// Copyright © 2020 Verizon Wireless. All rights reserved. -// - -import Foundation - - -open class CarouselIndicator: Control, CarouselPageControlProtocol { - //-------------------------------------------------- - // MARK: - Constraints - //-------------------------------------------------- - - public var topConstraint: NSLayoutConstraint? - public var bottomConstraint: NSLayoutConstraint? - - //-------------------------------------------------- - // MARK: - Properties - //-------------------------------------------------- - - public var uiGestures: Set = [] - - /// Convenience to access the model. - public var carouselIndicatorModel: CarouselIndicatorModel? { - return model as? CarouselIndicatorModel - } - - /// Set this closure to perform an action when a different indicator was selected. - /// Passes through oldInde and newIndex, respectively. - public var indicatorTouchAction: ((CarouselPageControlProtocol) -> ())? - - open override var isEnabled: Bool { - didSet { - isUserInteractionEnabled = isEnabled - } - } - - //-------------------------------------------------- - // MARK: - Computed Properties - //-------------------------------------------------- - - private(set) var previousIndex = 0 - private var _currentIndex = 0 - - public var currentIndex: Int { - get { return _currentIndex } - set (newIndex) { - carouselIndicatorModel?.currentIndex = newIndex - previousIndex = _currentIndex - _currentIndex = newIndex - performAction() - if previousIndex != newIndex { - updateUI(previousIndex: previousIndex, newIndex: newIndex, totalCount: numberOfPages, isAnimated: carouselIndicatorModel?.isAnimated ?? true) - } - } - } - - private var _numberOfPages = 0 - - /// Holds the total number of pages displayed by the carousel. - /// Updating this property will potentially update the UI. - public var numberOfPages: Int { - get { return _numberOfPages } - set (newTotal) { - guard _numberOfPages != newTotal else { return } - carouselIndicatorModel?.numberOfPages = newTotal - _numberOfPages = newTotal - - isHidden = carouselIndicatorModel?.hidesForSinglePage ?? false && newTotal <= 1 - updateUI(previousIndex: previousIndex, newIndex: currentIndex, totalCount: newTotal, isAnimated: carouselIndicatorModel?.isAnimated ?? true) - } - } - - public var disabledIndicatorColor: UIColor { - return carouselIndicatorModel?.disabledIndicatorColor.uiColor ?? .mvmCoolGray3 - } - - private(set) var _indicatorColor: UIColor = .black - - public var indicatorColor: UIColor { - get { return _indicatorColor } - set (newColor) { - carouselIndicatorModel?.indicatorColor = Color(uiColor: newColor) - } - } - - //-------------------------------------------------- - // MARK: - Initializers - //-------------------------------------------------- - - override init(frame: CGRect) { - super.init(frame: frame) - } - - convenience override init() { - self.init(frame: .zero) - } - - required public init?(coder: NSCoder) { - super.init(coder: coder) - } - - //-------------------------------------------------- - // MARK: - Lifecycle - //-------------------------------------------------- - - public override func initialSetup() { - super.initialSetup() - - isAccessibilityElement = true - accessibilityTraits = .adjustable - } - - open override func setupView() { - super.setupView() - - setupGestures() - } - - //-------------------------------------------------- - // MARK: - UITouch - //-------------------------------------------------- - - private func setupGestures() { - - let tap = UITapGestureRecognizer(target: self, action: #selector(indicatorTapped)) - let leftSwipe = UISwipeGestureRecognizer(target: self, action: #selector(swipeLeft)) - let rightSwipe = UISwipeGestureRecognizer(target: self, action: #selector(swipeRight)) - - leftSwipe.direction = .left - rightSwipe.direction = .right - - addGestureRecognizer(tap) - addGestureRecognizer(leftSwipe) - addGestureRecognizer(rightSwipe) - - uiGestures.insert(tap) - uiGestures.insert(leftSwipe) - uiGestures.insert(rightSwipe) - } - - func incrementCurrentIndex() { - currentIndex = min(currentIndex + 1, numberOfPages - 1) - } - - func decrementCurrentIndex() { - currentIndex = max(0, currentIndex - 1) - } - - /// Increments the currentIndex value. - @objc func swipeLeft() { - incrementCurrentIndex() - } - - /// Decrement the currentIndex value - @objc func swipeRight() { - decrementCurrentIndex() - } - - /// Handles tap logic for Indicator - @objc func indicatorTapped(_ tapGesture: UITapGestureRecognizer?) { - - let touchPoint = tapGesture?.location(in: self) - let touchPoint_X = touchPoint?.x ?? 0.0 - - assessTouchOf(touchPoint_X) - } - - func assessTouchOf(_ touchPoint_X: CGFloat) { } - - //-------------------------------------------------- - // MARK: - Methods - //-------------------------------------------------- - - open func updateUI(previousIndex: Int, newIndex: Int, totalCount: Int, isAnimated: Bool) { } - - public func performAction() { - - sendActions(for: .valueChanged) - indicatorTouchAction?(self) - } - - public func scrollViewDidScroll(_ collectionView: UICollectionView) { } - - //-------------------------------------------------- - // MARK: - MoleculeViewProtocol - //-------------------------------------------------- - - open override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { - super.set(with: model, delegateObject, additionalData) - - guard let model = model as? CarouselIndicatorModel else { return } - - indicatorColor = model.indicatorColor.uiColor - currentIndex = model.currentIndex - isEnabled = model.isEnabled - - if let accessibleValue = MVMCoreUIUtility.hardcodedString(withKey: model.accessibilityHasSlidesInsteadOfPage ? "MVMCoreUIPageControlslides_currentpage_index" : "MVMCoreUIPageControl_currentpage_index") { - accessibilityValue = String(format: accessibleValue, currentIndex + 1, numberOfPages) - } - } - - //-------------------------------------------------- - // MARK: - Accessibility - //-------------------------------------------------- - - open override func accessibilityIncrement() { - - accessibilityAdjust(toPage: currentIndex + 1) - } - - open override func accessibilityDecrement() { - - accessibilityAdjust(toPage: currentIndex - 1) - } - - func accessibilityAdjust(toPage index: Int) { - - if (index < numberOfPages && index >= 0) || carouselIndicatorModel?.alwaysSendAction ?? false { - carouselIndicatorModel?.isAnimated = false - previousIndex = currentIndex - currentIndex = index - performAction() - } - } - - func setTopBottomSpace(constant: CGFloat) { - - bottomConstraint?.constant = constant - topConstraint?.constant = constant - } -} diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/CarouselIndicator/CarouselIndicatorModel.swift b/MVMCoreUI/Atomic/Atoms/Buttons/CarouselIndicator/CarouselIndicatorModel.swift deleted file mode 100644 index 75e5ed58..00000000 --- a/MVMCoreUI/Atomic/Atoms/Buttons/CarouselIndicator/CarouselIndicatorModel.swift +++ /dev/null @@ -1,126 +0,0 @@ -// -// CarouselIndicatorModel.swift -// MVMCoreUI -// -// Created by Kevin Christiano on 2/3/20. -// Copyright © 2020 Verizon Wireless. All rights reserved. -// - -import Foundation - - -open class CarouselIndicatorModel: CarouselPagingModelProtocol { - //-------------------------------------------------- - // MARK: - Properties - //-------------------------------------------------- - - public class var identifier: String { - return "" - } - - public var backgroundColor: Color? - public var moleculeName: String? - - /// The maxmum count of pages before the indicatorView forces a Numeric Indicator in place of Bar. - public var numberOfPages: Int = 0 - - // Sets the current Index to focus on. - public var currentIndex: Int = 0 - public var isAnimated: Bool = true - public var hidesForSinglePage: Bool = false - /// Set true to make the accessibility value as "Slide #currentPage of #totalPage", otherwise will be "Page #currentPage of #totalPage", default is false - public var accessibilityHasSlidesInsteadOfPage: Bool = false - public var isEnabled: Bool = true - public var disabledIndicatorColor: Color = Color(uiColor: .mvmCoolGray3) - public var indicatorColor: Color = Color(uiColor: .mvmBlack) - public var position: Float? - - /// Allows sendActions() to trigger even if index is already at min/max index. - public var alwaysSendAction = false - - //-------------------------------------------------- - // MARK: - Keys - //-------------------------------------------------- - - private enum CodingKeys: String, CodingKey { - case moleculeName - case backgroundColor - case currentIndex - case numberOfPages - case alwaysSendAction - case isAnimated - case hidesForSinglePage - case accessibilityHasSlidesInsteadOfPage - case isEnabled - case disabledIndicatorColor - case indicatorColor - case currentIndicatorColor - case position - } - - //-------------------------------------------------- - // MARK: - Codec - //-------------------------------------------------- - - required public init(from decoder: Decoder) throws { - let typeContainer = try decoder.container(keyedBy: CodingKeys.self) - moleculeName = try typeContainer.decodeIfPresent(String.self, forKey: .moleculeName) - backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) - - if let numberOfPages = try typeContainer.decodeIfPresent(Int.self, forKey: .numberOfPages) { - self.numberOfPages = numberOfPages - } - - if let currentIndex = try typeContainer.decodeIfPresent(Int.self, forKey: .currentIndex) { - self.currentIndex = currentIndex - } - - if let alwaysSendAction = try typeContainer.decodeIfPresent(Bool.self, forKey: .alwaysSendAction) { - self.alwaysSendAction = alwaysSendAction - } - - if let position = try typeContainer.decodeIfPresent(Float.self, forKey: .position) { - self.position = position - } - - if let isAnimated = try typeContainer.decodeIfPresent(Bool.self, forKey: .isAnimated) { - self.isAnimated = isAnimated - } - - if let hidesForSinglePage = try typeContainer.decodeIfPresent(Bool.self, forKey: .hidesForSinglePage) { - self.hidesForSinglePage = hidesForSinglePage - } - - if let accessibilityHasSlidesInsteadOfPage = try typeContainer.decodeIfPresent(Bool.self, forKey: .accessibilityHasSlidesInsteadOfPage) { - self.accessibilityHasSlidesInsteadOfPage = accessibilityHasSlidesInsteadOfPage - } - - if let isEnabled = try typeContainer.decodeIfPresent(Bool.self, forKey: .isEnabled) { - self.isEnabled = isEnabled - } - - if let disabledIndicatorColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledIndicatorColor) { - self.disabledIndicatorColor = disabledIndicatorColor - } - - if let indicatorColor = try typeContainer.decodeIfPresent(Color.self, forKey: .indicatorColor) { - self.indicatorColor = indicatorColor - } - } - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encodeIfPresent(moleculeName, forKey: .moleculeName) - try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) - try container.encode(numberOfPages, forKey: .numberOfPages) - try container.encode(currentIndex, forKey: .currentIndex) - try container.encode(alwaysSendAction, forKey: .alwaysSendAction) - try container.encode(isAnimated, forKey: .isAnimated) - try container.encodeIfPresent(hidesForSinglePage, forKey: .hidesForSinglePage) - try container.encodeIfPresent(accessibilityHasSlidesInsteadOfPage, forKey: .accessibilityHasSlidesInsteadOfPage) - try container.encode(isEnabled, forKey: .isEnabled) - try container.encode(disabledIndicatorColor, forKey: .disabledIndicatorColor) - try container.encode(indicatorColor, forKey: .indicatorColor) - try container.encodeIfPresent(position, forKey: .position) - } -} diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/CarouselIndicator/NumericCarouselIndicatorModel.swift b/MVMCoreUI/Atomic/Atoms/Buttons/CarouselIndicator/NumericCarouselIndicatorModel.swift deleted file mode 100644 index 2b454fc8..00000000 --- a/MVMCoreUI/Atomic/Atoms/Buttons/CarouselIndicator/NumericCarouselIndicatorModel.swift +++ /dev/null @@ -1,19 +0,0 @@ -// -// NumericCarouselIndicatorModel.swift -// MVMCoreUI -// -// Created by Kevin Christiano on 3/3/20. -// Copyright © 2020 Verizon Wireless. All rights reserved. -// - -import UIKit - -open class NumericCarouselIndicatorModel: CarouselIndicatorModel { - //-------------------------------------------------- - // MARK: - Properties - //-------------------------------------------------- - - public class override var identifier: String { - return "numericCarouselIndicator" - } -} diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/CarouselIndicator/NumericIndicatorView.swift b/MVMCoreUI/Atomic/Atoms/Buttons/CarouselIndicator/NumericIndicatorView.swift deleted file mode 100644 index 8cd9e05c..00000000 --- a/MVMCoreUI/Atomic/Atoms/Buttons/CarouselIndicator/NumericIndicatorView.swift +++ /dev/null @@ -1,131 +0,0 @@ -// -// NumericIndicatorView.swift -// MVMCoreUI -// -// Created by Kevin Christiano on 2/3/20. -// Copyright © 2020 Verizon Wireless. All rights reserved. -// - -import UIKit - - -open class NumericIndicatorView: CarouselIndicator { - //-------------------------------------------------- - // MARK: - Outlets - //-------------------------------------------------- - - /// Text to display the current count of total pages for viewing. - open var pageCount: Label = { - let label = Label.commonLabelB2(true) - label.setContentCompressionResistancePriority(.required, for: .vertical) - label.textAlignment = .center - return label - }() - - let leftArrow: Arrow = { - let arrow = Arrow(model: ArrowModel(), degrees: 180) - arrow.pinHeightAndWidth() - return arrow - }() - - let rightArrow: Arrow = { - let arrow = Arrow(model: ArrowModel()) - arrow.pinHeightAndWidth() - return arrow - }() - - //-------------------------------------------------- - // MARK: - Computed Properties - //-------------------------------------------------- - - open override var isEnabled: Bool { - didSet { - pageCount.textColor = isEnabled ? indicatorColor : disabledIndicatorColor - leftArrow.tintColor = isEnabled ? indicatorColor : disabledIndicatorColor - rightArrow.tintColor = isEnabled ? indicatorColor : disabledIndicatorColor - } - } - - /// Sets the color for pageCount text, left arrow and right arrow. - public override var indicatorColor: UIColor { - get { return _indicatorColor } - set (newColor) { - super.indicatorColor = newColor - - if isEnabled { - pageCount.textColor = newColor - leftArrow.tintColor = newColor - rightArrow.tintColor = newColor - } - } - } - - //-------------------------------------------------- - // MARK: - Initializers - //-------------------------------------------------- - - public override init(frame: CGRect) { - super.init(frame: .zero) - } - - public convenience init() { - self.init(frame: .zero) - } - - public required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - //-------------------------------------------------- - // MARK: - Lifecycle - //-------------------------------------------------- - - open override func updateView(_ size: CGFloat) { - super.updateView(size) - pageCount.updateView(size) - } - - //-------------------------------------------------- - // MARK: - Setup - //-------------------------------------------------- - - open override func setupView() { - super.setupView() - - isUserInteractionEnabled = false - addSubview(pageCount) - addSubview(leftArrow) - addSubview(rightArrow) - - NSLayoutConstraint.activate([ - pageCount.centerXAnchor.constraint(equalTo: centerXAnchor), - pageCount.topAnchor.constraint(equalTo: topAnchor), - bottomAnchor.constraint(equalTo: pageCount.bottomAnchor), - leftArrow.centerYAnchor.constraint(equalTo: centerYAnchor), - rightArrow.centerYAnchor.constraint(equalTo: centerYAnchor), - leftArrow.leadingAnchor.constraint(equalTo: leadingAnchor), - pageCount.leadingAnchor.constraint(equalTo: leftArrow.trailingAnchor, constant: PaddingOne), - rightArrow.leadingAnchor.constraint(equalTo: pageCount.trailingAnchor, constant: PaddingOne), - trailingAnchor.constraint(equalTo: rightArrow.trailingAnchor) - ]) - } - - public override func assessTouchOf(_ touchPoint_X: CGFloat) { - - if touchPoint_X > bounds.width / 2 { - incrementCurrentIndex() - } else { - decrementCurrentIndex() - } - } - - //-------------------------------------------------- - // MARK: - IndicatorViewProtocol - //-------------------------------------------------- - - open override func updateUI(previousIndex oldIndex: Int, newIndex: Int, totalCount: Int, isAnimated: Bool) { - - pageCount.text = "\(newIndex + 1)/\(totalCount)" - layoutIfNeeded() - } -} From 60ab87764b80361877a327a3a71022aad900289a Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Thu, 2 Apr 2020 11:02:21 -0400 Subject: [PATCH 35/78] f --- MVMCoreUI/Atomic/Atoms/Views/ArrowModel.swift | 5 ----- .../CarouselIndicator/BarsIndicatorView.swift | 2 +- .../CarouselIndicatorModel.swift | 2 +- MVMCoreUI/Atomic/Organisms/CarouselModel.swift | 16 ++++++++-------- 4 files changed, 10 insertions(+), 15 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Views/ArrowModel.swift b/MVMCoreUI/Atomic/Atoms/Views/ArrowModel.swift index 69a6dd1f..61afd465 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/ArrowModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/ArrowModel.swift @@ -60,11 +60,6 @@ open class ArrowModel: MoleculeModelProtocol { required public init(from decoder: Decoder) throws { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) - // if let state = try typeContainer.decodeIfPresent(Bool.self, forKey: .state) { - // self.state = state - // } - // action = try typeContainer.decodeModelIfPresent(codingKey: .action, typeCodingKey: ActionCodingKey.actionType) - // alternateAction = try typeContainer.decodeModelIfPresent(codingKey: .alternateAction, typeCodingKey: ActionCodingKey.actionType) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) disabledColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledColor) enabledColor = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledColor) diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift index 0435e84d..d9cfaf50 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift @@ -150,7 +150,7 @@ open class BarsIndicatorView: CarouselIndicator { public override func updateUI(previousIndex: Int, newIndex: Int, totalCount: Int, isAnimated: Bool) { - guard !barReferences.isEmpty else { + guard !barReferences.isEmpty || totalCount != barReferences.count else { generateBars() return } diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift index 9eac6fd6..38747771 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift @@ -15,7 +15,7 @@ open class CarouselIndicatorModel: CarouselPagingModelProtocol, MoleculeModelPro //-------------------------------------------------- public class var identifier: String { - return "barsCarouselIndicator" + return "" } public var backgroundColor: Color? diff --git a/MVMCoreUI/Atomic/Organisms/CarouselModel.swift b/MVMCoreUI/Atomic/Organisms/CarouselModel.swift index 09ab708b..82aee3df 100644 --- a/MVMCoreUI/Atomic/Organisms/CarouselModel.swift +++ b/MVMCoreUI/Atomic/Organisms/CarouselModel.swift @@ -93,14 +93,14 @@ import UIKit public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(moleculeName, forKey: .moleculeName) - try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) - try container.encodeIfPresent(molecules, forKey: .molecules) - try container.encodeIfPresent(spacing, forKey: .spacing) - try container.encodeIfPresent(border, forKey: .border) - try container.encodeIfPresent(loop, forKey: .loop) - try container.encodeIfPresent(height, forKey: .height) - try container.encodeIfPresent(itemWidthPercent, forKey: .itemWidthPercent) - try container.encodeIfPresent(itemAlignment, forKey: .itemAlignment) + try container.encode(backgroundColor, forKey: .backgroundColor) + try container.encode(molecules, forKey: .molecules) + try container.encode(spacing, forKey: .spacing) + try container.encode(border, forKey: .border) + try container.encode(loop, forKey: .loop) + try container.encode(height, forKey: .height) + try container.encode(itemWidthPercent, forKey: .itemWidthPercent) + try container.encode(itemAlignment, forKey: .itemAlignment) try container.encodeModelIfPresent(pagingMolecule, forKey: .pagingMolecule) } } From ed34ae3c192de2d4ec5b7eb70e184b814a0ad2de Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Thu, 2 Apr 2020 11:12:15 -0400 Subject: [PATCH 36/78] removed code that was breaking --- .../Atoms/Views/CarouselIndicator/BarsIndicatorView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift index d9cfaf50..0435e84d 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift @@ -150,7 +150,7 @@ open class BarsIndicatorView: CarouselIndicator { public override func updateUI(previousIndex: Int, newIndex: Int, totalCount: Int, isAnimated: Bool) { - guard !barReferences.isEmpty || totalCount != barReferences.count else { + guard !barReferences.isEmpty else { generateBars() return } From bdda06629f253c451326be363637215181655d19 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Thu, 2 Apr 2020 11:47:47 -0400 Subject: [PATCH 37/78] arrow updates. --- MVMCoreUI/Atomic/Atoms/Views/Arrow.swift | 29 ++++++++++++++- MVMCoreUI/Atomic/Atoms/Views/ArrowModel.swift | 36 +++++++++---------- 2 files changed, 45 insertions(+), 20 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Views/Arrow.swift b/MVMCoreUI/Atomic/Atoms/Views/Arrow.swift index c37e4c02..23bd259d 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/Arrow.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/Arrow.swift @@ -20,6 +20,33 @@ open class Arrow: View { return model as? ArrowModel } + open var isEnabled: Bool = true { + didSet { + isUserInteractionEnabled = isEnabled + setNeedsDisplay() + } + } + + open var disabledColor: UIColor { + get { return arrowModel?.disabledColor.uiColor ?? .mvmCoolGray3 } + set { arrowModel?.disabledColor = Color(uiColor: newValue) } + } + + open var color: UIColor { + get { return arrowModel?.color.uiColor ?? .mvmBlack } + set { arrowModel?.color = Color(uiColor: newValue) } + } + + open var degrees: Float { + get { return arrowModel?.degrees ?? 0 } + set { arrowModel?.degrees = newValue } + } + + open var lineWidth: CGFloat { + get { return arrowModel?.lineWidth ?? 1 } + set { arrowModel?.lineWidth = newValue } + } + //-------------------------------------------------- // MARK: - Constraints //-------------------------------------------------- @@ -88,7 +115,7 @@ open class Arrow: View { private func drawShapeLayer() { arrowLayer.frame = bounds - arrowLayer.strokeColor = arrowModel?.color.cgColor + arrowLayer.strokeColor = isEnabled ? arrowModel?.color.cgColor : arrowModel?.disabledColor.cgColor arrowLayer.fillColor = UIColor.clear.cgColor arrowLayer.path = arrowPath() arrowLayer.lineJoin = .miter diff --git a/MVMCoreUI/Atomic/Atoms/Views/ArrowModel.swift b/MVMCoreUI/Atomic/Atoms/Views/ArrowModel.swift index 61afd465..eea37df8 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/ArrowModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/ArrowModel.swift @@ -20,22 +20,20 @@ open class ArrowModel: MoleculeModelProtocol { public var moleculeName: String? public var backgroundColor: Color? - - public var enabledColor: Color? - public var disabledColor: Color? + public var disabledColor: Color = Color(uiColor: .mvmCoolGray3) public var color: Color = Color(uiColor: .mvmBlack) public var degrees: Float = 0 public var lineWidth: CGFloat = 1 - public var height: CGFloat = 12 public var width: CGFloat = 12 + public var isEnabled: Bool = true //-------------------------------------------------- // MARK: - Initializer //-------------------------------------------------- public init() { } - + //-------------------------------------------------- // MARK: - Keys //-------------------------------------------------- @@ -43,14 +41,13 @@ open class ArrowModel: MoleculeModelProtocol { private enum CodingKeys: String, CodingKey { case moleculeName case backgroundColor - case enabledColor case disabledColor case color case degrees - case size case lineWidth case height case width + case isEnabled } //-------------------------------------------------- @@ -59,17 +56,21 @@ open class ArrowModel: MoleculeModelProtocol { required public init(from decoder: Decoder) throws { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) - - backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) - disabledColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledColor) - enabledColor = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledColor) - + backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) + if let disabledColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledColor) { + self.disabledColor = disabledColor + } + if let color = try typeContainer.decodeIfPresent(Color.self, forKey: .color) { self.color = color } + if let isEnabled = try typeContainer.decodeIfPresent(Bool.self, forKey: .isEnabled) { + self.isEnabled = isEnabled + } + if let degrees = try typeContainer.decodeIfPresent(Float.self, forKey: .degrees) { self.degrees = degrees } @@ -79,7 +80,7 @@ open class ArrowModel: MoleculeModelProtocol { } if let height = try typeContainer.decodeIfPresent(CGFloat.self, forKey: .height) { - self.lineWidth = height + self.height = height } if let width = try typeContainer.decodeIfPresent(CGFloat.self, forKey: .width) { @@ -89,17 +90,14 @@ open class ArrowModel: MoleculeModelProtocol { public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) - try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) - try container.encodeIfPresent(enabledColor, forKey: .enabledColor) try container.encode(moleculeName, forKey: .moleculeName) - try container.encodeIfPresent(disabledColor, forKey: .disabledColor) - try container.encode(moleculeName, forKey: .moleculeName) - try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) + try container.encode(disabledColor, forKey: .disabledColor) try container.encode(color, forKey: .color) try container.encode(degrees, forKey: .degrees) - try container.encodeIfPresent(backgroundColor, forKey: .lineWidth) + try container.encode(lineWidth, forKey: .lineWidth) try container.encode(width, forKey: .width) try container.encode(height, forKey: .height) + try container.encode(isEnabled, forKey: .isEnabled) } } From 3210f25cd58ef3f512762a6f9ff6bfc16ebca01d Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Thu, 2 Apr 2020 12:40:28 -0400 Subject: [PATCH 38/78] more arrow --- MVMCoreUI/Atomic/Atoms/Views/Arrow.swift | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Views/Arrow.swift b/MVMCoreUI/Atomic/Atoms/Views/Arrow.swift index 23bd259d..cbd80839 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/Arrow.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/Arrow.swift @@ -106,27 +106,25 @@ open class Arrow: View { arrowLayer.transform = CATransform3DIdentity drawShapeLayer() - if let degrees = arrowModel?.degrees { - let radians = CGFloat(degrees * Float.pi / 180) - arrowLayer.transform = CATransform3DMakeRotation(-radians, 0.0, 0.0, 1.0) - } + let radians = CGFloat(degrees * Float.pi / 180) + arrowLayer.transform = CATransform3DMakeRotation(-radians, 0.0, 0.0, 1.0) } private func drawShapeLayer() { arrowLayer.frame = bounds - arrowLayer.strokeColor = isEnabled ? arrowModel?.color.cgColor : arrowModel?.disabledColor.cgColor + arrowLayer.strokeColor = isEnabled ? color.cgColor : disabledColor.cgColor arrowLayer.fillColor = UIColor.clear.cgColor arrowLayer.path = arrowPath() arrowLayer.lineJoin = .miter arrowLayer.lineCap = .butt - arrowLayer.lineWidth = arrowModel?.lineWidth ?? 1 + arrowLayer.lineWidth = lineWidth } private func arrowPath() -> CGPath { let length = max(bounds.size.height, bounds.size.width) - let inset = (arrowModel?.lineWidth ?? 1) / 2 + let inset = lineWidth / 2 let midLength = length / 2 var startPoint = CGPoint(x: midLength, y: inset) From 1a8324c90b755b29a788b941cb67bb0e98014134 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Thu, 2 Apr 2020 13:35:08 -0400 Subject: [PATCH 39/78] more improvements --- MVMCoreUI/Atomic/Atoms/Views/Arrow.swift | 20 ++++++++++ .../CarouselIndicator/BarsIndicatorView.swift | 15 +++---- .../CarouselIndicator/CarouselIndicator.swift | 39 ++++++------------- .../CarouselIndicatorModel.swift | 4 +- .../NumericIndicatorView.swift | 2 +- MVMCoreUI/Atomic/Organisms/Carousel.swift | 4 +- .../Atomic/Organisms/CarouselModel.swift | 2 +- 7 files changed, 44 insertions(+), 42 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Views/Arrow.swift b/MVMCoreUI/Atomic/Atoms/Views/Arrow.swift index cbd80839..bd499dc8 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/Arrow.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/Arrow.swift @@ -20,6 +20,11 @@ open class Arrow: View { return model as? ArrowModel } + public var direction: Direction { + get { return Direction(rawValue: degrees) ?? .right} + set { degrees = newValue.rawValue } + } + open var isEnabled: Bool = true { didSet { isUserInteractionEnabled = isEnabled @@ -47,6 +52,21 @@ open class Arrow: View { set { arrowModel?.lineWidth = newValue } } + //-------------------------------------------------- + // MARK: - Enum + //-------------------------------------------------- + + public enum Direction: Float { + case right = 0 + case upperRight = 45 + case up = 90 + case upperLeft = 135 + case left = 180 + case bottomLeft = 225 + case down = 270 + case bottomRight = 315 + } + //-------------------------------------------------- // MARK: - Constraints //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift index 0435e84d..3bfe8585 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift @@ -31,15 +31,15 @@ open class BarsIndicatorView: CarouselIndicator { public static let indicatorBarWidth: CGFloat = 24 public static let indicatorBarHeight: (selected: CGFloat, unselected: CGFloat) = (selected: 4, unselected: 1) + //-------------------------------------------------- + // MARK: - Computed Properties + //-------------------------------------------------- + /// Convenience to access the model. public var barsCarouselIndicatorModel: BarsCarouselIndicatorModel? { return model as? BarsCarouselIndicatorModel } - //-------------------------------------------------- - // MARK: - Computed Properties - //-------------------------------------------------- - open override var isEnabled: Bool { didSet { barReferences.forEach { view, _ in @@ -48,13 +48,10 @@ open class BarsIndicatorView: CarouselIndicator { } } - private(set) var _currentIndicatorColor: UIColor = .black - /// Colors the currently selected index, unique from other indicators public var currentIndicatorColor: UIColor { - get { return _currentIndicatorColor } + get { return barsCarouselIndicatorModel?.currentIndicatorColor.uiColor ?? .mvmBlack } set (newColor) { - _currentIndicatorColor = newColor barsCarouselIndicatorModel?.currentIndicatorColor = Color(uiColor: newColor) if !barReferences.isEmpty { @@ -64,7 +61,7 @@ open class BarsIndicatorView: CarouselIndicator { } public override var indicatorColor: UIColor { - get { return _indicatorColor } + get { return carouselIndicatorModel?.indicatorColor.uiColor ?? .mvmBlack } set (newColor) { super.indicatorColor = newColor diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift index ccce0266..a2a31bd6 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift @@ -31,7 +31,7 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { /// Set this closure to perform an action when a different indicator was selected. /// Passes through oldInde and newIndex, respectively. public var indicatorTouchAction: ((CarouselPageControlProtocol) -> ())? - + open override var isEnabled: Bool { didSet { isUserInteractionEnabled = isEnabled } } @@ -41,15 +41,12 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { //-------------------------------------------------- private(set) var previousIndex = 0 - private var _currentIndex = 0 public var currentIndex: Int { - get { return _currentIndex } + get { return carouselIndicatorModel?.currentIndex ?? 0 } set (newIndex) { + previousIndex = currentIndex carouselIndicatorModel?.currentIndex = newIndex - previousIndex = _currentIndex - _currentIndex = newIndex - if previousIndex != newIndex { updateUI(previousIndex: previousIndex, @@ -61,18 +58,16 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { } } - /// The maxmum count of pages before the indicatorView forces a Numeric Indicator in place of Bar. - private var _numberOfPages = 0 - /// Holds the total number of pages displayed by the carousel. /// Updating this property will potentially update the UI. + /// The maxmum count of pages before the indicatorView forces a Numeric Indicator in place of Bar. public var numberOfPages: Int { - get { return _numberOfPages } + get { return carouselIndicatorModel?.numberOfPages ?? 0 } set (newTotal) { - guard _numberOfPages != newTotal else { return } - carouselIndicatorModel?.numberOfPages = newTotal - _numberOfPages = newTotal + guard numberOfPages != newTotal else { return } + carouselIndicatorModel?.numberOfPages = newTotal + reset() isHidden = (carouselIndicatorModel?.hidesForSinglePage ?? false) && newTotal <= 1 updateUI(previousIndex: previousIndex, newIndex: currentIndex, @@ -81,24 +76,14 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { } } - private(set) var _disabledIndicatorColor: UIColor = .mvmCoolGray3 - public var disabledIndicatorColor: UIColor { - get { return _disabledIndicatorColor } - set (newDisabledColor) { - _disabledIndicatorColor = newDisabledColor - carouselIndicatorModel?.disabledIndicatorColor = Color(uiColor: newDisabledColor) - } + get { return carouselIndicatorModel?.disabledIndicatorColor.uiColor ?? .mvmCoolGray3 } + set { carouselIndicatorModel?.disabledIndicatorColor = Color(uiColor: newValue) } } - private(set) var _indicatorColor: UIColor = .black - public var indicatorColor: UIColor { - get { return _indicatorColor } - set (newColor) { - _indicatorColor = newColor - carouselIndicatorModel?.indicatorColor = Color(uiColor: newColor) - } + get { return carouselIndicatorModel?.indicatorColor.uiColor ?? .mvmBlack } + set { carouselIndicatorModel?.indicatorColor = Color(uiColor: newValue) } } //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift index 38747771..e2683f70 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift @@ -109,8 +109,8 @@ open class CarouselIndicatorModel: CarouselPagingModelProtocol, MoleculeModelPro try container.encode(currentIndex, forKey: .currentIndex) try container.encode(alwaysSendAction, forKey: .alwaysSendAction) try container.encode(isAnimated, forKey: .isAnimated) - try container.encodeIfPresent(hidesForSinglePage, forKey: .hidesForSinglePage) - try container.encodeIfPresent(accessibilityHasSlidesInsteadOfPage, forKey: .accessibilityHasSlidesInsteadOfPage) + try container.encode(hidesForSinglePage, forKey: .hidesForSinglePage) + try container.encode(accessibilityHasSlidesInsteadOfPage, forKey: .accessibilityHasSlidesInsteadOfPage) try container.encode(isEnabled, forKey: .isEnabled) try container.encode(disabledIndicatorColor, forKey: .disabledIndicatorColor) try container.encode(indicatorColor, forKey: .indicatorColor) diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift index 8d00786c..bf090066 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift @@ -55,7 +55,7 @@ open class NumericIndicatorView: CarouselIndicator { /// Sets the color for pageCount text, left arrow and right arrow. public override var indicatorColor: UIColor { - get { return _indicatorColor } + get { return carouselIndicatorModel?.indicatorColor.uiColor ?? .mvmBlack } set (newColor) { super.indicatorColor = newColor diff --git a/MVMCoreUI/Atomic/Organisms/Carousel.swift b/MVMCoreUI/Atomic/Organisms/Carousel.swift index 699a036d..c6c9f05c 100644 --- a/MVMCoreUI/Atomic/Organisms/Carousel.swift +++ b/MVMCoreUI/Atomic/Organisms/Carousel.swift @@ -21,7 +21,7 @@ open class Carousel: View { //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- - + public let collectionView = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout()) /// The current index of the collection view. Includes dummy cells when looping. @@ -215,7 +215,7 @@ open class Carousel: View { bottomPin?.isActive = true return } - + addSubview(pagingView) pagingView.centerXAnchor.constraint(equalTo: collectionView.centerXAnchor).isActive = true collectionView.bottomAnchor.constraint(equalTo: pagingView.centerYAnchor, constant: position).isActive = true diff --git a/MVMCoreUI/Atomic/Organisms/CarouselModel.swift b/MVMCoreUI/Atomic/Organisms/CarouselModel.swift index 82aee3df..6f1c28b3 100644 --- a/MVMCoreUI/Atomic/Organisms/CarouselModel.swift +++ b/MVMCoreUI/Atomic/Organisms/CarouselModel.swift @@ -93,7 +93,7 @@ import UIKit public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(moleculeName, forKey: .moleculeName) - try container.encode(backgroundColor, forKey: .backgroundColor) + try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) try container.encode(molecules, forKey: .molecules) try container.encode(spacing, forKey: .spacing) try container.encode(border, forKey: .border) From 6386694ea52160ecb7e8af0fb0c227cafcc5a24c Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Fri, 3 Apr 2020 11:40:57 -0400 Subject: [PATCH 40/78] enabled change + comments --- MVMCoreUI/Atomic/Atoms/Views/Arrow.swift | 14 +++++++++++++- MVMCoreUI/Atomic/Atoms/Views/ArrowModel.swift | 10 +++++----- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Views/Arrow.swift b/MVMCoreUI/Atomic/Atoms/Views/Arrow.swift index bd499dc8..81b244e1 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/Arrow.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/Arrow.swift @@ -27,8 +27,11 @@ open class Arrow: View { open var isEnabled: Bool = true { didSet { + arrowModel?.enabled = isEnabled isUserInteractionEnabled = isEnabled - setNeedsDisplay() + if isEnabled != oldValue { + setNeedsDisplay() + } } } @@ -56,6 +59,7 @@ open class Arrow: View { // MARK: - Enum //-------------------------------------------------- + /// Conveniece for readability of arrow pointing direction. public enum Direction: Float { case right = 0 case upperRight = 45 @@ -164,4 +168,12 @@ open class Arrow: View { return bezierPath.cgPath } + + public override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { + super.set(with: model, delegateObject, additionalData) + + guard let model = model as? ArrowModel else { return } + + isEnabled = model.enabled + } } diff --git a/MVMCoreUI/Atomic/Atoms/Views/ArrowModel.swift b/MVMCoreUI/Atomic/Atoms/Views/ArrowModel.swift index eea37df8..14d98ee3 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/ArrowModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/ArrowModel.swift @@ -26,7 +26,7 @@ open class ArrowModel: MoleculeModelProtocol { public var lineWidth: CGFloat = 1 public var height: CGFloat = 12 public var width: CGFloat = 12 - public var isEnabled: Bool = true + public var enabled: Bool = true //-------------------------------------------------- // MARK: - Initializer @@ -47,7 +47,7 @@ open class ArrowModel: MoleculeModelProtocol { case lineWidth case height case width - case isEnabled + case enabled } //-------------------------------------------------- @@ -67,8 +67,8 @@ open class ArrowModel: MoleculeModelProtocol { self.color = color } - if let isEnabled = try typeContainer.decodeIfPresent(Bool.self, forKey: .isEnabled) { - self.isEnabled = isEnabled + if let enabled = try typeContainer.decodeIfPresent(Bool.self, forKey: .enabled) { + self.enabled = enabled } if let degrees = try typeContainer.decodeIfPresent(Float.self, forKey: .degrees) { @@ -98,6 +98,6 @@ open class ArrowModel: MoleculeModelProtocol { try container.encode(lineWidth, forKey: .lineWidth) try container.encode(width, forKey: .width) try container.encode(height, forKey: .height) - try container.encode(isEnabled, forKey: .isEnabled) + try container.encode(enabled, forKey: .enabled) } } From 9299d7d381895141d1712e8da4f2634974fc35eb Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Thu, 16 Apr 2020 13:09:27 -0400 Subject: [PATCH 41/78] changes to align with android --- .../CarouselIndicator/CarouselIndicator.swift | 8 ++++---- .../CarouselIndicatorModel.swift | 20 +++++++++---------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift index a2a31bd6..589bf794 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift @@ -52,7 +52,7 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { updateUI(previousIndex: previousIndex, newIndex: newIndex, totalCount: numberOfPages, - isAnimated: carouselIndicatorModel?.isAnimated ?? true) + isAnimated: carouselIndicatorModel?.animated ?? true) performAction() } } @@ -72,7 +72,7 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { updateUI(previousIndex: previousIndex, newIndex: currentIndex, totalCount: newTotal, - isAnimated: carouselIndicatorModel?.isAnimated ?? true) + isAnimated: carouselIndicatorModel?.animated ?? true) } } @@ -196,7 +196,7 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { indicatorColor = model.indicatorColor.uiColor disabledIndicatorColor = model.disabledIndicatorColor.uiColor currentIndex = model.currentIndex - isEnabled = model.isEnabled + isEnabled = model.enabled if let accessibleValue = MVMCoreUIUtility.hardcodedString(withKey: model.accessibilityHasSlidesInsteadOfPage ? "MVMCoreUIPageControlslides_currentpage_index" : "MVMCoreUIPageControl_currentpage_index") { accessibilityValue = String(format: accessibleValue, currentIndex + 1, numberOfPages) @@ -220,7 +220,7 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { func accessibilityAdjust(toPage index: Int) { if (index < numberOfPages && index >= 0) || carouselIndicatorModel?.alwaysSendAction ?? false { - carouselIndicatorModel?.isAnimated = false + carouselIndicatorModel?.animated = false previousIndex = currentIndex currentIndex = index performAction() diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift index e2683f70..a0ac2273 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift @@ -24,11 +24,11 @@ open class CarouselIndicatorModel: CarouselPagingModelProtocol, MoleculeModelPro /// Sets the current Index to focus on. public var currentIndex: Int = 0 - public var isAnimated: Bool = true + public var animated: Bool = true public var hidesForSinglePage: Bool = false /// Set true to make the accessibility value as "Slide #currentPage of #totalPage", otherwise will be "Page #currentPage of #totalPage", default is false public var accessibilityHasSlidesInsteadOfPage: Bool = false - public var isEnabled: Bool = true + public var enabled: Bool = true public var disabledIndicatorColor: Color = Color(uiColor: .mvmCoolGray3) public var indicatorColor: Color = Color(uiColor: .mvmBlack) public var position: Float? @@ -46,10 +46,10 @@ open class CarouselIndicatorModel: CarouselPagingModelProtocol, MoleculeModelPro case currentIndex case numberOfPages case alwaysSendAction - case isAnimated + case animated case hidesForSinglePage case accessibilityHasSlidesInsteadOfPage - case isEnabled + case enabled case disabledIndicatorColor case indicatorColor case position @@ -76,8 +76,8 @@ open class CarouselIndicatorModel: CarouselPagingModelProtocol, MoleculeModelPro self.position = position } - if let isAnimated = try typeContainer.decodeIfPresent(Bool.self, forKey: .isAnimated) { - self.isAnimated = isAnimated + if let animated = try typeContainer.decodeIfPresent(Bool.self, forKey: .animated) { + self.animated = animated } if let hidesForSinglePage = try typeContainer.decodeIfPresent(Bool.self, forKey: .hidesForSinglePage) { @@ -88,8 +88,8 @@ open class CarouselIndicatorModel: CarouselPagingModelProtocol, MoleculeModelPro self.accessibilityHasSlidesInsteadOfPage = accessibilityHasSlidesInsteadOfPage } - if let isEnabled = try typeContainer.decodeIfPresent(Bool.self, forKey: .isEnabled) { - self.isEnabled = isEnabled + if let enabled = try typeContainer.decodeIfPresent(Bool.self, forKey: .enabled) { + self.enabled = enabled } if let disabledIndicatorColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledIndicatorColor) { @@ -108,10 +108,10 @@ open class CarouselIndicatorModel: CarouselPagingModelProtocol, MoleculeModelPro try container.encode(numberOfPages, forKey: .numberOfPages) try container.encode(currentIndex, forKey: .currentIndex) try container.encode(alwaysSendAction, forKey: .alwaysSendAction) - try container.encode(isAnimated, forKey: .isAnimated) + try container.encode(animated, forKey: .animated) try container.encode(hidesForSinglePage, forKey: .hidesForSinglePage) try container.encode(accessibilityHasSlidesInsteadOfPage, forKey: .accessibilityHasSlidesInsteadOfPage) - try container.encode(isEnabled, forKey: .isEnabled) + try container.encode(enabled, forKey: .enabled) try container.encode(disabledIndicatorColor, forKey: .disabledIndicatorColor) try container.encode(indicatorColor, forKey: .indicatorColor) try container.encodeIfPresent(position, forKey: .position) From 33ffbf91295bdf7a87b75b9b6ad17090dd66e83d Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 28 Apr 2020 13:51:03 -0400 Subject: [PATCH 42/78] adding comments and structure. code alignment. --- .../Atomic/Atoms/Buttons/ButtonModel.swift | 35 ++++++++++++++++++- .../MoleculeModelProtocol.swift | 6 ++++ .../BaseControllers/ViewController.swift | 10 +++--- .../Views/Container/Container.swift | 2 ++ 4 files changed, 47 insertions(+), 6 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift index abdc1242..22969196 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift @@ -8,6 +8,7 @@ import UIKit + public enum ButtonStyle: String, Codable { case primary case secondary @@ -19,8 +20,13 @@ public enum ButtonSize: String, Codable { } public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupWatcherFieldProtocol { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + public static var identifier: String = "button" public var backgroundColor: Color? + public var isInverted: Bool = false public var title: String public var action: ActionModelProtocol public var enabled: Bool = true @@ -34,14 +40,22 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW public var disabledBorderColor: Color? public var groupName: String = "" + //-------------------------------------------------- + // MARK: - Methods + //-------------------------------------------------- + public func setValidity(_ valid: Bool, group: FormGroupRule) { enabled = valid updateUI?() } /// Temporary binding mechanism for the view to update on enable changes. - public var updateUI: (() -> Void)? + public var updateUI: (() -> ())? + //-------------------------------------------------- + // MARK: - Initializers + //-------------------------------------------------- + public init(with title: String, action: ActionModelProtocol) { self.title = title self.action = action @@ -59,9 +73,14 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW style = .primary } + //-------------------------------------------------- + // MARK: - Keys + //-------------------------------------------------- + private enum CodingKeys: String, CodingKey { case moleculeName case backgroundColor + case isInverted = "inverted" case title case action case enabled @@ -76,24 +95,37 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW case groupName } + //-------------------------------------------------- + // MARK: - Codec + //-------------------------------------------------- + required public init(from decoder: Decoder) throws { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) + + if let isInverted = try typeContainer.decodeIfPresent(Bool.self, forKey: .enabled) { + self.isInverted = isInverted + } backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) title = try typeContainer.decode(String.self, forKey: .title) action = try typeContainer.decodeModel(codingKey: .action) + if let groupName = try typeContainer.decodeIfPresent(String.self, forKey: .groupName) { self.groupName = groupName } + if let style = try typeContainer.decodeIfPresent(ButtonStyle.self, forKey: .style) { self.style = style } + if let size = try typeContainer.decodeIfPresent(ButtonSize.self, forKey: .size) { self.size = size } + if let enabled = try typeContainer.decodeIfPresent(Bool.self, forKey: .enabled) { self.enabled = enabled } + fillColor = try typeContainer.decodeIfPresent(Color.self, forKey: .fillColor) textColor = try typeContainer.decodeIfPresent(Color.self, forKey: .textColor) borderColor = try typeContainer.decodeIfPresent(Color.self, forKey: .borderColor) @@ -106,6 +138,7 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(moleculeName, forKey: .moleculeName) try container.encode(title, forKey: .title) + try container.encode(isInverted, forKey: .isInverted) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) try container.encodeModel(action, forKey: .action) try container.encode(enabled, forKey: .enabled) diff --git a/MVMCoreUI/Atomic/Protocols/ModelProtocols/MoleculeModelProtocol.swift b/MVMCoreUI/Atomic/Protocols/ModelProtocols/MoleculeModelProtocol.swift index dda19b35..f4d528f5 100644 --- a/MVMCoreUI/Atomic/Protocols/ModelProtocols/MoleculeModelProtocol.swift +++ b/MVMCoreUI/Atomic/Protocols/ModelProtocols/MoleculeModelProtocol.swift @@ -9,6 +9,7 @@ public enum MolecularError: Swift.Error { public protocol MoleculeModelProtocol: ModelProtocol { var moleculeName: String { get } + var isInverted: Bool { get set } var backgroundColor: Color? { get set } } @@ -25,4 +26,9 @@ public extension MoleculeModelProtocol { static var categoryCodingKey: String { return "moleculeName" } + + var isInverted: Bool { + get { return false } + set { } + } } diff --git a/MVMCoreUI/BaseControllers/ViewController.swift b/MVMCoreUI/BaseControllers/ViewController.swift index b12440a6..ade66d03 100644 --- a/MVMCoreUI/BaseControllers/ViewController.swift +++ b/MVMCoreUI/BaseControllers/ViewController.swift @@ -338,18 +338,18 @@ import UIKit } // MARK: - MVMCoreActionDelegateProtocol - open func handleOpenPage(for requestParameters: MVMCoreRequestParameters, actionInformation: [AnyHashable : Any]?, additionalData: [AnyHashable : Any]?) { + open func handleOpenPage(for requestParameters: MVMCoreRequestParameters, actionInformation: [AnyHashable: Any]?, additionalData: [AnyHashable: Any]?) { formValidator?.addFormParams(requestParameters: requestParameters) requestParameters.parentPageType = loadObject?.pageJSON?.optionalStringForKey("parentPageType") MVMCoreActionHandler.defaultHandleOpenPage(for: requestParameters, additionalData: additionalData, delegateObject: delegateObject()) } - open func logAction(withActionInformation actionInformation: [AnyHashable : Any]?, additionalData: [AnyHashable : Any]?) { + open func logAction(withActionInformation actionInformation: [AnyHashable: Any]?, additionalData: [AnyHashable: Any]?) { MVMCoreUILoggingHandler.shared()?.defaultLogAction(forController: self, actionInformation: actionInformation, additionalData: additionalData) } // MARK: - MoleculeDelegateProtocol - open func getModuleWithName(_ name: String?) -> [AnyHashable : Any]? { + open func getModuleWithName(_ name: String?) -> [AnyHashable: Any]? { guard let name = name else { return nil } return loadObject?.modulesJSON?.optionalDictionaryForKey(name) } @@ -390,7 +390,7 @@ import UIKit view.accessibilityElements = [pickerView, toolBar] } DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { - UIAccessibility.post(notification: UIAccessibility.Notification.layoutChanged, argument: textField.inputView) + UIAccessibility.post(notification: .layoutChanged, argument: textField.inputView) } } } @@ -399,7 +399,7 @@ import UIKit if textField === selectedField { if UIAccessibility.isVoiceOverRunning { view.accessibilityElements = nil - UIAccessibility.post(notification: UIAccessibility.Notification.layoutChanged, argument: textField) + UIAccessibility.post(notification: .layoutChanged, argument: textField) } selectedField = nil } diff --git a/MVMCoreUI/Containers/Views/Container/Container.swift b/MVMCoreUI/Containers/Views/Container/Container.swift index eb05cd21..8c95f110 100644 --- a/MVMCoreUI/Containers/Views/Container/Container.swift +++ b/MVMCoreUI/Containers/Views/Container/Container.swift @@ -9,8 +9,10 @@ import UIKit open class Container: View, ContainerProtocol { + public var view: UIView? let containerHelper = ContainerHelper() + var containerModel: ContainerModelProtocol? { get { return model as? ContainerModelProtocol } } From 52e54c185c9545862fc873aa5c013f8a8a7cb1b6 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 28 Apr 2020 14:21:00 -0400 Subject: [PATCH 43/78] commenting --- MVMCoreUI/Atomic/Molecules/Items/CarouselItemModel.swift | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/MVMCoreUI/Atomic/Molecules/Items/CarouselItemModel.swift b/MVMCoreUI/Atomic/Molecules/Items/CarouselItemModel.swift index 5258ccac..15a83552 100644 --- a/MVMCoreUI/Atomic/Molecules/Items/CarouselItemModel.swift +++ b/MVMCoreUI/Atomic/Molecules/Items/CarouselItemModel.swift @@ -10,9 +10,14 @@ import Foundation @objcMembers public class CarouselItemModel: MoleculeCollectionItemModel, CarouselItemModelProtocol { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + public override class var identifier: String { return "carouselItem" } + public var peakingUI: Bool? public var peakingArrowColor: Color? From 80b9f985b178a172c178d2c2341c90be47a77ccc Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Thu, 30 Apr 2020 14:26:25 -0400 Subject: [PATCH 44/78] latest updated for color inversion --- MVMCoreUI.xcodeproj/project.pbxproj | 4 + .../Atomic/Atoms/Buttons/ButtonModel.swift | 108 +++++++---- .../Atomic/Atoms/Buttons/PillButton.swift | 118 +++++++----- .../TwoButtonView.swift | 52 ++++- .../TwoButtonViewModel.swift | 22 ++- .../Templates/MoleculeListTemplate.swift | 1 + .../Atomic/Templates/TemplateModel.swift | 19 ++ .../Atomic/Templates/ThreeLayerTemplate.swift | 18 +- .../BaseControllers/ViewController.swift | 2 +- MVMCoreUI/Styles/Facade.swift | 177 ++++++++++++++++++ 10 files changed, 414 insertions(+), 107 deletions(-) create mode 100644 MVMCoreUI/Styles/Facade.swift diff --git a/MVMCoreUI.xcodeproj/project.pbxproj b/MVMCoreUI.xcodeproj/project.pbxproj index 58eea2d8..de055ff7 100644 --- a/MVMCoreUI.xcodeproj/project.pbxproj +++ b/MVMCoreUI.xcodeproj/project.pbxproj @@ -102,6 +102,7 @@ 0A7EF86323D8AFA000B2AAD1 /* BaseDropdownEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF86223D8AFA000B2AAD1 /* BaseDropdownEntryFieldModel.swift */; }; 0A7EF86523D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF86423D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift */; }; 0A7EF86723D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF86623D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift */; }; + 0A96140B245B06F0006FA18B /* Facade.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A96140A245B06F0006FA18B /* Facade.swift */; }; 0AA33B3A2398524F0067DD0F /* Toggle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AA33B392398524F0067DD0F /* Toggle.swift */; }; 0AB764D124460F6300E7FE72 /* UIDatePicker+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AB764D024460F6300E7FE72 /* UIDatePicker+Extension.swift */; }; 0AB764D324460FA400E7FE72 /* UIPickerView+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AB764D224460FA400E7FE72 /* UIPickerView+Extension.swift */; }; @@ -558,6 +559,7 @@ 0A7EF86423D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemDropdownEntryFieldModel.swift; sourceTree = ""; }; 0A7EF86623D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateDropdownEntryFieldModel.swift; sourceTree = ""; }; 0A8321AE2355FE9500CB7F00 /* DigitBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DigitBox.swift; sourceTree = ""; }; + 0A96140A245B06F0006FA18B /* Facade.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Facade.swift; sourceTree = ""; }; 0AA33B33239813C50067DD0F /* UIColor+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+Extension.swift"; sourceTree = ""; }; 0AA33B392398524F0067DD0F /* Toggle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Toggle.swift; sourceTree = ""; }; 0AB764D024460F6300E7FE72 /* UIDatePicker+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIDatePicker+Extension.swift"; sourceTree = ""; }; @@ -1715,6 +1717,7 @@ D29DF13921E68637003B2FB9 /* MFStyler.m */, 0A6682A92435125F00AD3CA1 /* Styler.swift */, 0A6682AB243531C300AD3CA1 /* Padding.swift */, + 0A96140A245B06F0006FA18B /* Facade.swift */, ); path = Styles; sourceTree = ""; @@ -2239,6 +2242,7 @@ 012A88C4238D86E600FE3DA1 /* CarouselItemModelProtocol.swift in Sources */, D2E2A9A123E095AB000B42E6 /* ButtonModelProtocol.swift in Sources */, 94C2D9AB23872EB50006CF46 /* LabelAttributeActionModel.swift in Sources */, + 0A96140B245B06F0006FA18B /* Facade.swift in Sources */, D22D8395241FB41200D3DF69 /* UIStackView+Extension.swift in Sources */, 52B201D324081CFB00D2011E /* ListLeftVariableRadioButtonAndPaymentMethodModel.swift in Sources */, 525239C02407BCFF00454969 /* ListTwoColumnPriceDetailsModel.swift in Sources */, diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift index 22969196..ca90db94 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift @@ -26,20 +26,52 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW public static var identifier: String = "button" public var backgroundColor: Color? - public var isInverted: Bool = false public var title: String public var action: ActionModelProtocol public var enabled: Bool = true - public var style: ButtonStyle? + public var isInverted: Bool = false { + didSet { facade?.isInverted = isInverted } + } + public var facade: Facade? + public var style: ButtonStyle = .primary { + didSet { + switch style { + case .primary: + facade = primaryFacade + case .secondary: + facade = secondaryFacade + } + } + } public var size: ButtonSize? = .standard - public var fillColor: Color? - public var textColor: Color? - public var borderColor: Color? - public var disabledFillColor: Color? - public var disabledTextColor: Color? - public var disabledBorderColor: Color? public var groupName: String = "" - + + //-------------------------------------------------- + // MARK: - Default Button Facades + //-------------------------------------------------- + + private var primaryFacade = Facade(enabledFillColor: Color(uiColor: .mvmBlack), + enabledTextColor: Color(uiColor: .mvmWhite), + disabledFillColor: Color(uiColor: .mvmCoolGray6), + disabledTextColor: Color(uiColor: .mvmWhite), + enabledFillColor_inverted: Color(uiColor: .mvmWhite), + enabledTextColor_inverted: Color(uiColor: .mvmBlack), + disabledFillColor_inverted: Color(uiColor: .mvmCoolGray6), + disabledTextColor_inverted: Color(uiColor: .mvmBlack)) + + private var secondaryFacade = Facade(enabledFillColor: Color(uiColor: .mvmWhite), + enabledTextColor: Color(uiColor: .mvmBlack), + enabledBorderColor: Color(uiColor: .mvmBlack), + disabledFillColor: Color(uiColor: .mvmWhite), + disabledTextColor: Color(uiColor: .mvmCoolGray6), + disabledBorderColor: Color(uiColor: .mvmCoolGray6), + enabledFillColor_inverted: Color(uiColor: .mvmBlack), + enabledTextColor_inverted: Color(uiColor: .mvmWhite), + enabledBorderColor_inverted: Color(uiColor: .mvmWhite), + disabledFillColor_inverted: Color(uiColor: .mvmWhite), + disabledTextColor_inverted: Color(uiColor: .mvmCoolGray6), + disabledBorderColor_inverted: Color(uiColor: .mvmCoolGray6)) + //-------------------------------------------------- // MARK: - Methods //-------------------------------------------------- @@ -48,10 +80,10 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW enabled = valid updateUI?() } - + /// Temporary binding mechanism for the view to update on enable changes. - public var updateUI: (() -> ())? - + public var updateUI: ActionBlock? + //-------------------------------------------------- // MARK: - Initializers //-------------------------------------------------- @@ -66,7 +98,7 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW self.action = action style = .secondary } - + public init(primaryButtonWith title: String, action: ActionModelProtocol) { self.title = title self.action = action @@ -80,21 +112,16 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW private enum CodingKeys: String, CodingKey { case moleculeName case backgroundColor - case isInverted = "inverted" case title + case inverted case action case enabled case style case size - case fillColor - case textColor - case borderColor - case disabledFillColor - case disabledTextColor - case disabledBorderColor + case facade case groupName } - + //-------------------------------------------------- // MARK: - Codec //-------------------------------------------------- @@ -102,10 +129,6 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW required public init(from decoder: Decoder) throws { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) - if let isInverted = try typeContainer.decodeIfPresent(Bool.self, forKey: .enabled) { - self.isInverted = isInverted - } - backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) title = try typeContainer.decode(String.self, forKey: .title) action = try typeContainer.decodeModel(codingKey: .action) @@ -126,30 +149,33 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW self.enabled = enabled } - fillColor = try typeContainer.decodeIfPresent(Color.self, forKey: .fillColor) - textColor = try typeContainer.decodeIfPresent(Color.self, forKey: .textColor) - borderColor = try typeContainer.decodeIfPresent(Color.self, forKey: .borderColor) - disabledFillColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledFillColor) - disabledTextColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledTextColor) - disabledBorderColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledBorderColor) - } + if let facade = try typeContainer.decodeIfPresent(Facade.self, forKey: .facade) { + self.facade = facade + switch style { + case .primary: + primaryFacade = facade + case .secondary: + secondaryFacade = facade + } + } + + if let isInverted = try typeContainer.decodeIfPresent(Bool.self, forKey: .inverted) { + self.isInverted = isInverted + } + } + public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(moleculeName, forKey: .moleculeName) try container.encode(title, forKey: .title) - try container.encode(isInverted, forKey: .isInverted) - try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) - try container.encodeModel(action, forKey: .action) + try container.encode(isInverted, forKey: .inverted) try container.encode(enabled, forKey: .enabled) + try container.encodeModel(action, forKey: .action) + try container.encodeIfPresent(facade, forKey: .facade) + try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) try container.encodeIfPresent(style, forKey: .style) try container.encodeIfPresent(size, forKey: .size) - try container.encodeIfPresent(fillColor, forKey: .fillColor) - try container.encodeIfPresent(textColor, forKey: .textColor) - try container.encodeIfPresent(borderColor, forKey: .borderColor) - try container.encodeIfPresent(disabledFillColor, forKey: .disabledFillColor) - try container.encodeIfPresent(disabledTextColor, forKey: .disabledTextColor) - try container.encodeIfPresent(disabledBorderColor, forKey: .disabledBorderColor) try container.encodeIfPresent(groupName, forKey: .groupName) } } diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift index 19f032fc..3cea7765 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift @@ -8,78 +8,93 @@ import UIKit + open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { - // Used to size the button. + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + + /// Used to size the button. var size = MVMCoreUIUtility.getWidth() var buttonModel: ButtonModel? { get { return model as? ButtonModel } } - // Need to re-style on set. + /// Need to re-style on set. open override var isEnabled: Bool { - didSet { - style() - } + didSet { style() } } - private enum ButtonHeight: CGFloat { + private enum Height: CGFloat { case tiny = 20 case standard = 42 } + //-------------------------------------------------- + // MARK: - Methods + //-------------------------------------------------- + /// The primary styling for a button. Should be used for main buttons public func stylePrimary() { - setTitleColor(.white, for: .normal) - setTitleColor(.white, for: .disabled) + + buttonModel?.style = .primary + setTitleColor(buttonModel?.facade?.enabled.text ?? .mvmWhite, for: .normal) + setTitleColor(buttonModel?.facade?.disabled.text ?? .mvmWhite, for: .disabled) layer.borderWidth = 0 - if isEnabled { - backgroundColor = .black - } else { - backgroundColor = .mvmCoolGray6 - } + backgroundColor = isEnabled ? buttonModel?.facade?.enabled.fill ?? .mvmBlack : buttonModel?.facade?.enabled.fill ?? .mvmCoolGray6 } /// The secondary styling for a button. Should be used for secondary buttons public func styleSecondary() { - setTitleColor(.black, for: .normal) - setTitleColor(.mvmCoolGray6, for: .disabled) + + buttonModel?.style = .secondary + setTitleColor(buttonModel?.facade?.enabled.text ?? .mvmBlack, for: .normal) + setTitleColor(buttonModel?.facade?.disabled.text ?? .mvmCoolGray6, for: .disabled) backgroundColor = .clear layer.borderWidth = 1 + if isEnabled { - layer.borderColor = UIColor.black.cgColor + layer.borderColor = buttonModel?.facade?.enabled.border?.cgColor ?? UIColor.mvmBlack.cgColor } else { - layer.borderColor = UIColor.mvmCoolGray6.cgColor + layer.borderColor = buttonModel?.facade?.enabled.border?.cgColor ?? UIColor.mvmCoolGray6.cgColor } } /// Styles the button based on the model style private func style() { + switch buttonModel?.style { case .secondary: styleSecondary() + default: stylePrimary() } - if let titleColor = buttonModel?.textColor { - setTitleColor(titleColor.uiColor, for: .normal) + + if let titleColor = buttonModel?.facade?.enabled.text { + setTitleColor(titleColor, for: .normal) } - if let disabledTitleColor = buttonModel?.disabledTextColor { - setTitleColor(disabledTitleColor.uiColor, for: .disabled) + + if let disabledTitleColor = buttonModel?.facade?.disabled.text { + setTitleColor(disabledTitleColor, for: .disabled) } + if isEnabled { - if let fillColor = buttonModel?.fillColor { - backgroundColor = fillColor.uiColor + if let fillColor = buttonModel?.facade?.enabled.fill { + backgroundColor = fillColor } - if let borderColor = buttonModel?.borderColor { + + if let borderColor = buttonModel?.facade?.enabled.border { layer.borderWidth = 1 layer.borderColor = borderColor.cgColor } } else { - if let fillColor = buttonModel?.disabledFillColor { - backgroundColor = fillColor.uiColor + if let fillColor = buttonModel?.facade?.disabled.fill { + backgroundColor = fillColor } - if let borderColor = buttonModel?.disabledBorderColor { + + if let borderColor = buttonModel?.facade?.disabledBorderColor { layer.borderWidth = 1 layer.borderColor = borderColor.cgColor } @@ -87,7 +102,7 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { } private func getInnerPadding() -> CGFloat { - return getHeight() / 2.0 + return getHeight() / 2 } private func getHeight() -> CGFloat { @@ -95,78 +110,95 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { } public static func getHeight(for buttonSize: ButtonSize?, size: CGFloat) -> CGFloat { + switch buttonSize { case .tiny: - return MFSizeObject(standardSize: ButtonHeight.tiny.rawValue, standardiPadPortraitSize: 34, iPadProLandscapeSize: 38)?.getValueBased(onSize: size) ?? ButtonHeight.tiny.rawValue + return MFSizeObject(standardSize: Height.tiny.rawValue, standardiPadPortraitSize: 34, iPadProLandscapeSize: 38)?.getValueBased(onSize: size) ?? Height.tiny.rawValue + default: - return MFSizeObject(standardSize: ButtonHeight.standard.rawValue, standardiPadPortraitSize: 46, iPadProLandscapeSize: 50)?.getValueBased(onSize: size) ?? ButtonHeight.standard.rawValue + return MFSizeObject(standardSize: Height.standard.rawValue, standardiPadPortraitSize: 46, iPadProLandscapeSize: 50)?.getValueBased(onSize: size) ?? Height.standard.rawValue } } - + private func getMinimumWidth() -> CGFloat { + switch buttonModel?.size { case .tiny: - return MFSizeObject(standardSize: 49.0, standardiPadPortraitSize: 90.0, iPadProLandscapeSize: 135.0)?.getValueBased(onSize: size) ?? 49.0 + return MFSizeObject(standardSize: 49, standardiPadPortraitSize: 90, iPadProLandscapeSize: 135)?.getValueBased(onSize: size) ?? 49 + default: - return 151.0 + return 151 } } open override var intrinsicContentSize: CGSize { + let size = super.intrinsicContentSize let width = size.width + (2 * getInnerPadding()) return CGSize(width: max(width, getMinimumWidth()), height: getHeight()) } - // MARK: - MoleculeViewProtocol + //-------------------------------------------------- + // MARK: - MVMCoreViewProtocol + //-------------------------------------------------- + open override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { // The button will get styled in the enable check in super. super.set(with: model, delegateObject, additionalData) - + guard let model = model as? ButtonModel else { return } setTitle(model.title, for: .normal) - + model.updateUI = { [weak self] in MVMCoreDispatchUtility.performBlock(onMainThread: { self?.enableField(model.enabled) }) } + style() + FormValidator.setupValidation(for: model, delegate: delegateObject?.formHolderDelegate) } - + open override class func estimatedHeight(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?) -> CGFloat? { PillButton.getHeight(for: (model as? ButtonModel)?.size, size: MVMCoreUIUtility.getWidth()) } - // MARK: - MVMCoreViewProtocol open override func updateView(_ size: CGFloat) { super.updateView(size) self.size = size + invalidateIntrinsicContentSize() + switch buttonModel?.size { case .tiny: - titleLabel?.font = MFFonts.mfFont75Bd(11 * (intrinsicContentSize.height / ButtonHeight.tiny.rawValue)) + titleLabel?.font = MFFonts.mfFont75Bd(11 * (intrinsicContentSize.height / Height.tiny.rawValue)) + default: - titleLabel?.font = MFFonts.mfFont75Bd(13 * (intrinsicContentSize.height / ButtonHeight.standard.rawValue)) + titleLabel?.font = MFFonts.mfFont75Bd(13 * (intrinsicContentSize.height / Height.standard.rawValue)) } + layer.cornerRadius = getInnerPadding() } - + open override func setupView() { super.setupView() + titleLabel?.numberOfLines = 1 titleLabel?.lineBreakMode = .byTruncatingTail titleLabel?.textAlignment = .center contentHorizontalAlignment = .center stylePrimary() } - + + //-------------------------------------------------- // MARK: - MVMCoreUIViewConstrainingProtocol + //-------------------------------------------------- + open func horizontalAlignment() -> UIStackView.Alignment { return .center } - + public func enableField(_ enable: Bool) { isEnabled = enable } diff --git a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonView.swift b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonView.swift index 285c429c..a789eebb 100644 --- a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonView.swift +++ b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonView.swift @@ -9,11 +9,24 @@ import UIKit @objcMembers open class TwoButtonView: View, MVMCoreUIViewConstrainingProtocol { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + open var primaryButton: PillButton = PillButton() open var secondaryButton: PillButton = PillButton() private var stack = UIStackView() + + //-------------------------------------------------- + // MARK: - Constraints + //-------------------------------------------------- + private var equalWidthConstraint: NSLayoutConstraint? - + + //-------------------------------------------------- + // MARK: - Initializers + //-------------------------------------------------- + public init() { super.init(frame: .zero) } @@ -26,12 +39,15 @@ import UIKit super.init(frame: frame) } + //-------------------------------------------------- + // MARK: - Lifecycle + //-------------------------------------------------- + public func setDefault() { primaryButton.stylePrimary() secondaryButton.styleSecondary() } - // MARK: - MVMCoreViewProtocol open override func updateView(_ size: CGFloat) { super.updateView(size) self.primaryButton.updateView(size) @@ -52,58 +68,68 @@ import UIKit equalWidthConstraint?.isActive = true } + //-------------------------------------------------- // MARK: - Stack Manipulation + //-------------------------------------------------- + public func showPrimaryButton() { + if !stack.arrangedSubviews.contains(primaryButton) { stack.addArrangedSubview(primaryButton) primaryButton.isHidden = false } + if secondaryButton.superview != nil { equalWidthConstraint?.isActive = true } } public func showSecondaryButton() { + if !stack.arrangedSubviews.contains(secondaryButton) { stack.insertArrangedSubview(secondaryButton, at: 0) secondaryButton.isHidden = false } + if primaryButton.superview != nil { equalWidthConstraint?.isActive = true } } public func hidePrimaryButton() { + if primaryButton.superview != nil { stack.removeArrangedSubview(primaryButton) primaryButton.isHidden = true } + equalWidthConstraint?.isActive = false } public func hideSecondaryButton() { + if secondaryButton.superview != nil { stack.removeArrangedSubview(secondaryButton) secondaryButton.isHidden = true } + equalWidthConstraint?.isActive = false } + //-------------------------------------------------- // MARK: - MoleculeViewProtocol + //-------------------------------------------------- + open override func reset() { super.reset() setDefault() } - - // MARK: - MVMCoreUIViewConstrainingProtocol - open func horizontalAlignment() -> UIStackView.Alignment { - return .center - } - // MARK: - MoleculeViewProtocol public override class func estimatedHeight(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?) -> CGFloat? { guard let model = model as? TwoButtonViewModel, - let buttonModel = model.primaryButton ?? model.secondaryButton else { return 0 } + let buttonModel = model.primaryButton ?? model.secondaryButton + else { return 0 } + return PillButton.estimatedHeight(with: buttonModel, delegateObject) } @@ -118,6 +144,7 @@ import UIKit } else { hideSecondaryButton() } + if let primaryModel = model.primaryButton { showPrimaryButton() primaryButton.set(with: primaryModel, delegateObject, additionalData) @@ -125,4 +152,11 @@ import UIKit hidePrimaryButton() } } + //-------------------------------------------------- + // MARK: - MVMCoreUIViewConstrainingProtocol + //-------------------------------------------------- + + open func horizontalAlignment() -> UIStackView.Alignment { + return .center + } } diff --git a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonViewModel.swift b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonViewModel.swift index 057203e9..4e0c8363 100644 --- a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonViewModel.swift +++ b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonViewModel.swift @@ -8,12 +8,21 @@ import UIKit + public class TwoButtonViewModel: MoleculeModelProtocol { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + public static var identifier: String = "twoButtonView" public var backgroundColor: Color? public var primaryButton: ButtonModel? public var secondaryButton: ButtonModel? + //-------------------------------------------------- + // MARK: - Keys + //-------------------------------------------------- + private enum CodingKeys: String, CodingKey { case moleculeName case backgroundColor @@ -21,20 +30,25 @@ public class TwoButtonViewModel: MoleculeModelProtocol { case secondaryButton } + //-------------------------------------------------- + // MARK: - Initialzer + //-------------------------------------------------- + public init(_ primaryButton: ButtonModel?, _ secondaryButton: ButtonModel?) { self.primaryButton = primaryButton self.secondaryButton = secondaryButton } + //-------------------------------------------------- + // MARK: - Codec + //-------------------------------------------------- + required public init(from decoder: Decoder) throws { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) primaryButton = try typeContainer.decodeIfPresent(ButtonModel.self, forKey: .primaryButton) secondaryButton = try typeContainer.decodeIfPresent(ButtonModel.self, forKey: .secondaryButton) - // Default value - if secondaryButton?.style == nil { - secondaryButton?.style = .secondary - } + secondaryButton?.style = .secondary } public func encode(to encoder: Encoder) throws { diff --git a/MVMCoreUI/Atomic/Templates/MoleculeListTemplate.swift b/MVMCoreUI/Atomic/Templates/MoleculeListTemplate.swift index e40fbc33..09ca1b41 100644 --- a/MVMCoreUI/Atomic/Templates/MoleculeListTemplate.swift +++ b/MVMCoreUI/Atomic/Templates/MoleculeListTemplate.swift @@ -12,6 +12,7 @@ open class MoleculeListTemplate: ThreeLayerTableViewController, TemplateProtocol //-------------------------------------------------- // MARK: - Stored Properties //-------------------------------------------------- + public var moleculesInfo: [(identifier: String, class: AnyClass, molecule: (ListItemModelProtocol & MoleculeModelProtocol))]? var observer: NSKeyValueObservation? diff --git a/MVMCoreUI/Atomic/Templates/TemplateModel.swift b/MVMCoreUI/Atomic/Templates/TemplateModel.swift index 86da1981..3dcf3964 100644 --- a/MVMCoreUI/Atomic/Templates/TemplateModel.swift +++ b/MVMCoreUI/Atomic/Templates/TemplateModel.swift @@ -8,24 +8,39 @@ import Foundation + @objcMembers public class TemplateModel: MVMControllerModelProtocol { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + public class var identifier: String { return "" } + public var pageType: String public var template: String { // Although this is done in the extension, it is needed for the encoding. return Self.identifier } + public var backgroundColor: Color? public var screenHeading: String? public var navigationItem: (NavigationItemModelProtocol & MoleculeModelProtocol)? public var formRules: [FormGroupRule]? + //-------------------------------------------------- + // MARK: - Initializer + //-------------------------------------------------- + public init(pageType: String) { self.pageType = pageType } + //-------------------------------------------------- + // MARK: - Keys + //-------------------------------------------------- + private enum CodingKeys: String, CodingKey { case pageType case template @@ -34,6 +49,10 @@ import Foundation case formRules case navigationItem } + + //-------------------------------------------------- + // MARK: - Codec + //-------------------------------------------------- required public init(from decoder: Decoder) throws { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) diff --git a/MVMCoreUI/Atomic/Templates/ThreeLayerTemplate.swift b/MVMCoreUI/Atomic/Templates/ThreeLayerTemplate.swift index 4884d5b1..cc305ee5 100644 --- a/MVMCoreUI/Atomic/Templates/ThreeLayerTemplate.swift +++ b/MVMCoreUI/Atomic/Templates/ThreeLayerTemplate.swift @@ -24,25 +24,25 @@ import UIKit open override func viewForTop() -> UIView? { guard let headerModel = templateModel?.header, - let molecule = MoleculeObjectMapping.shared()?.createMolecule(headerModel, delegateObject: delegateObjectIVar) else { - return nil - } + let molecule = MoleculeObjectMapping.shared()?.createMolecule(headerModel, delegateObject: delegateObjectIVar) + else { return nil } + return molecule } open override func viewForMiddle() -> UIView? { guard let middleModel = templateModel?.middle, - let molecule = MoleculeObjectMapping.shared()?.createMolecule(middleModel, delegateObject: delegateObjectIVar) else { - return nil - } + let molecule = MoleculeObjectMapping.shared()?.createMolecule(middleModel, delegateObject: delegateObjectIVar) + else { return nil } + return molecule } override open func viewForBottom() -> UIView? { guard let footerModel = templateModel?.footer, - let molecule = MoleculeObjectMapping.shared()?.createMolecule(footerModel, delegateObject: delegateObjectIVar) else { - return nil - } + let molecule = MoleculeObjectMapping.shared()?.createMolecule(footerModel, delegateObject: delegateObjectIVar) + else { return nil } + return molecule } diff --git a/MVMCoreUI/BaseControllers/ViewController.swift b/MVMCoreUI/BaseControllers/ViewController.swift index ade66d03..6dede18f 100644 --- a/MVMCoreUI/BaseControllers/ViewController.swift +++ b/MVMCoreUI/BaseControllers/ViewController.swift @@ -257,7 +257,7 @@ import UIKit viewRespectsSystemMinimumLayoutMargins = false // Presents from the bottom. - modalPresentationStyle = MVMCoreGetterUtility.isOnIPad() ? UIModalPresentationStyle.formSheet : UIModalPresentationStyle.overCurrentContext + modalPresentationStyle = MVMCoreGetterUtility.isOnIPad() ? .formSheet : .overCurrentContext // Create the default delegate object. delegateObjectIVar = MVMCoreUIDelegateObject.create(withDelegateForAll: self) diff --git a/MVMCoreUI/Styles/Facade.swift b/MVMCoreUI/Styles/Facade.swift new file mode 100644 index 00000000..6940b92f --- /dev/null +++ b/MVMCoreUI/Styles/Facade.swift @@ -0,0 +1,177 @@ +// +// Facade.swift +// MVMCoreUI +// +// Created by Kevin Christiano on 4/30/20. +// Copyright © 2020 Verizon Wireless. All rights reserved. +// + +import Foundation + +public typealias FacadeElements = (fill: UIColor?, text: UIColor?, border: UIColor?) + + +public class Facade: Codable { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + + public var isInverted: Bool = false + + public lazy var enabled: FacadeElements = (fill: enabled_fillColor(), + text: enabled_textColor(), + border: enabled_borderColor()) + + public lazy var disabled: FacadeElements = (fill: disabled_fillColor(), + text: disabled_textColor(), + border: disabled_borderColor()) + + public var backgroundColor_standard: Color? + public var backgroundColor_inverted: Color? + + public var enabledFillColor: Color? + public var enabledTextColor: Color? + public var enabledBorderColor: Color? + + public var enabledFillColor_inverted: Color? + public var enabledTextColor_inverted: Color? + public var enabledBorderColor_inverted: Color? + + public var disabledFillColor: Color? + public var disabledTextColor: Color? + public var disabledBorderColor: Color? + + public var disabledFillColor_inverted: Color? + public var disabledTextColor_inverted: Color? + public var disabledBorderColor_inverted: Color? + + //-------------------------------------------------- + // MARK: - Initializer + //-------------------------------------------------- + + public init(isInverted: Bool = false, + backgroundColor_standard: Color? = nil, + backgroundColor_inverted: Color? = nil, + enabledFillColor: Color? = nil, + enabledTextColor: Color? = nil, + enabledBorderColor: Color? = nil, + disabledFillColor: Color? = nil, + disabledTextColor: Color? = nil, + disabledBorderColor: Color? = nil, + enabledFillColor_inverted: Color? = nil, + enabledTextColor_inverted: Color? = nil, + enabledBorderColor_inverted: Color? = nil, + disabledFillColor_inverted: Color? = nil, + disabledTextColor_inverted: Color? = nil, + disabledBorderColor_inverted: Color? = nil) { + + self.isInverted = isInverted + self.backgroundColor_standard = backgroundColor_standard + self.backgroundColor_inverted = backgroundColor_inverted + self.enabledFillColor = enabledFillColor + self.enabledTextColor = enabledTextColor + self.enabledBorderColor = enabledBorderColor + self.disabledFillColor = disabledFillColor + self.disabledTextColor = disabledTextColor + self.disabledBorderColor = disabledBorderColor + self.enabledFillColor_inverted = enabledFillColor_inverted + self.enabledTextColor_inverted = enabledTextColor_inverted + self.enabledBorderColor_inverted = enabledBorderColor_inverted + self.disabledFillColor_inverted = disabledFillColor_inverted + self.disabledTextColor_inverted = disabledTextColor_inverted + self.disabledBorderColor_inverted = disabledBorderColor_inverted + } + + //-------------------------------------------------- + // MARK: - Methods + //-------------------------------------------------- + + public func backgroundColor() -> UIColor? { + return (isInverted ? backgroundColor_inverted : backgroundColor_standard)?.uiColor + } + + public func enabled_fillColor() -> UIColor? { + return (isInverted ? enabledFillColor_inverted : enabledFillColor)?.uiColor + } + + public func enabled_textColor() -> UIColor? { + return (isInverted ? enabledTextColor_inverted : enabledTextColor)?.uiColor + } + + public func enabled_borderColor() -> UIColor? { + return (isInverted ? enabledBorderColor_inverted : enabledBorderColor)?.uiColor + } + + public func disabled_fillColor() -> UIColor? { + return (isInverted ? disabledFillColor_inverted : disabledFillColor)?.uiColor + } + + public func disabled_textColor() -> UIColor? { + return (isInverted ? disabledTextColor_inverted : disabledTextColor)?.uiColor + } + + public func disabled_borderColor() -> UIColor? { + return (isInverted ? disabledBorderColor_inverted : disabledBorderColor)?.uiColor + } + + //-------------------------------------------------- + // MARK: - Keys + //-------------------------------------------------- + + private enum CodingKeys: String, CodingKey { + case backgroundColor_standard + case backgroundColor_inverted + case enabledFillColor + case enabledTextColor + case enabledBorderColor + case enabledFillColor_inverted + case enabledTextColor_inverted + case enabledBorderColor_inverted + case disabledFillColor + case disabledTextColor + case disabledBorderColor + case disabledFillColor_inverted + case disabledTextColor_inverted + case disabledBorderColor_inverted + } + + //-------------------------------------------------- + // MARK: - Codec + //-------------------------------------------------- + + required public init(from decoder: Decoder) throws { + let typeContainer = try decoder.container(keyedBy: CodingKeys.self) + backgroundColor_standard = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor_standard) + backgroundColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor_inverted) + enabledFillColor = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledFillColor) + enabledTextColor = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledTextColor) + enabledBorderColor = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledBorderColor) + enabledFillColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledFillColor_inverted) + enabledTextColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledTextColor_inverted) + enabledBorderColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledBorderColor_inverted) + disabledFillColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledFillColor) + disabledTextColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledTextColor) + disabledBorderColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledBorderColor) + disabledFillColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledFillColor_inverted) + disabledTextColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledTextColor_inverted) + disabledBorderColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledBorderColor_inverted) + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encodeIfPresent(backgroundColor_standard, forKey: .backgroundColor_standard) + try container.encodeIfPresent(backgroundColor_inverted, forKey: .backgroundColor_inverted) + try container.encodeIfPresent(enabledFillColor, forKey: .enabledFillColor) + try container.encodeIfPresent(enabledTextColor, forKey: .enabledTextColor) + try container.encodeIfPresent(enabledBorderColor, forKey: .enabledBorderColor) + try container.encodeIfPresent(enabledFillColor_inverted, forKey: .enabledFillColor_inverted) + try container.encodeIfPresent(enabledTextColor_inverted, forKey: .enabledTextColor_inverted) + try container.encodeIfPresent(enabledBorderColor_inverted, forKey: .enabledBorderColor_inverted) + try container.encodeIfPresent(disabledFillColor, forKey: .disabledFillColor) + try container.encodeIfPresent(disabledTextColor, forKey: .disabledTextColor) + try container.encodeIfPresent(disabledBorderColor, forKey: .disabledBorderColor) + try container.encodeIfPresent(disabledFillColor_inverted, forKey: .disabledFillColor_inverted) + try container.encodeIfPresent(disabledTextColor_inverted, forKey: .disabledTextColor_inverted) + try container.encodeIfPresent(disabledBorderColor_inverted, forKey: .disabledBorderColor_inverted) + } +} From 2f6fa19233196ba60f900c4795c526c8ffd2d801 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Thu, 30 Apr 2020 14:40:33 -0400 Subject: [PATCH 45/78] adding border width --- MVMCoreUI/Styles/Facade.swift | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/MVMCoreUI/Styles/Facade.swift b/MVMCoreUI/Styles/Facade.swift index 6940b92f..7b8fb8c9 100644 --- a/MVMCoreUI/Styles/Facade.swift +++ b/MVMCoreUI/Styles/Facade.swift @@ -45,6 +45,9 @@ public class Facade: Codable { public var disabledTextColor_inverted: Color? public var disabledBorderColor_inverted: Color? + public var borderWidth: CGFloat? + public var borderWidth_inverted: CGFloat? + //-------------------------------------------------- // MARK: - Initializer //-------------------------------------------------- @@ -63,7 +66,9 @@ public class Facade: Codable { enabledBorderColor_inverted: Color? = nil, disabledFillColor_inverted: Color? = nil, disabledTextColor_inverted: Color? = nil, - disabledBorderColor_inverted: Color? = nil) { + disabledBorderColor_inverted: Color? = nil, + borderWidth: CGFloat? = nil, + borderWidth_inverted: CGFloat? = nil) { self.isInverted = isInverted self.backgroundColor_standard = backgroundColor_standard @@ -80,6 +85,8 @@ public class Facade: Codable { self.disabledFillColor_inverted = disabledFillColor_inverted self.disabledTextColor_inverted = disabledTextColor_inverted self.disabledBorderColor_inverted = disabledBorderColor_inverted + self.borderWidth = borderWidth + self.borderWidth_inverted = borderWidth_inverted } //-------------------------------------------------- @@ -90,6 +97,10 @@ public class Facade: Codable { return (isInverted ? backgroundColor_inverted : backgroundColor_standard)?.uiColor } + public func getBorderWidth() -> CGFloat? { + return isInverted ? borderWidth_inverted : borderWidth + } + public func enabled_fillColor() -> UIColor? { return (isInverted ? enabledFillColor_inverted : enabledFillColor)?.uiColor } From cbcb1c37c07ac740a6b7d3feee1cfb4a0a730d95 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Thu, 30 Apr 2020 15:48:30 -0400 Subject: [PATCH 46/78] bringing borderwidth in. --- .../Atomic/Atoms/Buttons/ButtonModel.swift | 6 +- .../Atomic/Atoms/Buttons/PillButton.swift | 55 ++++++++++++------- 2 files changed, 40 insertions(+), 21 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift index ca90db94..816371dd 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift @@ -57,7 +57,8 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW enabledFillColor_inverted: Color(uiColor: .mvmWhite), enabledTextColor_inverted: Color(uiColor: .mvmBlack), disabledFillColor_inverted: Color(uiColor: .mvmCoolGray6), - disabledTextColor_inverted: Color(uiColor: .mvmBlack)) + disabledTextColor_inverted: Color(uiColor: .mvmBlack), + borderWidth: 0) private var secondaryFacade = Facade(enabledFillColor: Color(uiColor: .mvmWhite), enabledTextColor: Color(uiColor: .mvmBlack), @@ -70,7 +71,8 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW enabledBorderColor_inverted: Color(uiColor: .mvmWhite), disabledFillColor_inverted: Color(uiColor: .mvmWhite), disabledTextColor_inverted: Color(uiColor: .mvmCoolGray6), - disabledBorderColor_inverted: Color(uiColor: .mvmCoolGray6)) + disabledBorderColor_inverted: Color(uiColor: .mvmCoolGray6), + borderWidth: 1) //-------------------------------------------------- // MARK: - Methods diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift index 3cea7765..9503168e 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift @@ -31,6 +31,28 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { case standard = 42 } + //-------------------------------------------------- + // MARK: - Computed Properties + //-------------------------------------------------- + + public var enabledTitleColor: UIColor? { + get { return titleColor(for: .normal) } + set { setTitleColor(newValue, for: .normal) } + } + + public var disabledTitleColor: UIColor? { + get { return titleColor(for: .disabled) } + set { setTitleColor(newValue, for: .disabled) } + } + + public var borderColor: UIColor? { + get { + guard let currentColor = layer.borderColor else { return nil } + return UIColor(cgColor: currentColor) + } + set { layer.borderColor = newValue?.cgColor} + } + //-------------------------------------------------- // MARK: - Methods //-------------------------------------------------- @@ -39,9 +61,9 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { public func stylePrimary() { buttonModel?.style = .primary - setTitleColor(buttonModel?.facade?.enabled.text ?? .mvmWhite, for: .normal) - setTitleColor(buttonModel?.facade?.disabled.text ?? .mvmWhite, for: .disabled) - layer.borderWidth = 0 + enabledTitleColor = buttonModel?.facade?.enabled.text ?? .mvmWhite + disabledTitleColor = buttonModel?.facade?.disabled.text ?? .mvmWhite + layer.borderWidth = buttonModel?.facade?.getBorderWidth() ?? 0 backgroundColor = isEnabled ? buttonModel?.facade?.enabled.fill ?? .mvmBlack : buttonModel?.facade?.enabled.fill ?? .mvmCoolGray6 } @@ -49,16 +71,11 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { public func styleSecondary() { buttonModel?.style = .secondary - setTitleColor(buttonModel?.facade?.enabled.text ?? .mvmBlack, for: .normal) - setTitleColor(buttonModel?.facade?.disabled.text ?? .mvmCoolGray6, for: .disabled) + enabledTitleColor = buttonModel?.facade?.enabled.text ?? .mvmBlack + disabledTitleColor = buttonModel?.facade?.disabled.text ?? .mvmCoolGray6 backgroundColor = .clear - layer.borderWidth = 1 - - if isEnabled { - layer.borderColor = buttonModel?.facade?.enabled.border?.cgColor ?? UIColor.mvmBlack.cgColor - } else { - layer.borderColor = buttonModel?.facade?.enabled.border?.cgColor ?? UIColor.mvmCoolGray6.cgColor - } + layer.borderWidth = buttonModel?.facade?.getBorderWidth() ?? 1 + borderColor = isEnabled ? buttonModel?.facade?.enabled.border ?? .mvmBlack : buttonModel?.facade?.enabled.border ?? .mvmCoolGray6 } /// Styles the button based on the model style @@ -73,11 +90,11 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { } if let titleColor = buttonModel?.facade?.enabled.text { - setTitleColor(titleColor, for: .normal) + enabledTitleColor = titleColor } if let disabledTitleColor = buttonModel?.facade?.disabled.text { - setTitleColor(disabledTitleColor, for: .disabled) + self.disabledTitleColor = disabledTitleColor } if isEnabled { @@ -86,17 +103,17 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { } if let borderColor = buttonModel?.facade?.enabled.border { - layer.borderWidth = 1 - layer.borderColor = borderColor.cgColor + layer.borderWidth = buttonModel?.facade?.getBorderWidth() ?? 1 + self.borderColor = borderColor } } else { if let fillColor = buttonModel?.facade?.disabled.fill { backgroundColor = fillColor } - if let borderColor = buttonModel?.facade?.disabledBorderColor { - layer.borderWidth = 1 - layer.borderColor = borderColor.cgColor + if let borderColor = buttonModel?.facade?.disabled.border { + layer.borderWidth = buttonModel?.facade?.getBorderWidth() ?? 1 + self.borderColor = borderColor } } } From 43778c537a4c8a8baa602bc1434d27d1492cfc0f Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Fri, 1 May 2020 14:14:01 -0400 Subject: [PATCH 47/78] current developemnt --- .../Atomic/Atoms/Buttons/ButtonModel.swift | 68 +++++++++---------- .../Atomic/Atoms/Buttons/PillButton.swift | 34 +++++----- ...htVariableButtonAllTextAndLinksModel.swift | 2 +- MVMCoreUI/CustomPrimitives/Color.swift | 7 ++ MVMCoreUI/Styles/Facade.swift | 56 +++++++-------- MVMCoreUI/Styles/Styler.swift | 10 +++ 6 files changed, 94 insertions(+), 83 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift index 816371dd..62c48d4a 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift @@ -9,16 +9,6 @@ import UIKit -public enum ButtonStyle: String, Codable { - case primary - case secondary -} - -public enum ButtonSize: String, Codable { - case standard - case tiny -} - public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupWatcherFieldProtocol { //-------------------------------------------------- // MARK: - Properties @@ -29,11 +19,14 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW public var title: String public var action: ActionModelProtocol public var enabled: Bool = true + public var isInverted: Bool = false { - didSet { facade?.isInverted = isInverted } + didSet { facade.isInverted = isInverted } } - public var facade: Facade? - public var style: ButtonStyle = .primary { + + public lazy var facade: Facade = primaryFacade + + public var style: Styler.Button = .primary { didSet { switch style { case .primary: @@ -43,35 +36,35 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW } } } - public var size: ButtonSize? = .standard + public var size: Styler.Button.Size? = .standard public var groupName: String = "" //-------------------------------------------------- // MARK: - Default Button Facades //-------------------------------------------------- - private var primaryFacade = Facade(enabledFillColor: Color(uiColor: .mvmBlack), - enabledTextColor: Color(uiColor: .mvmWhite), - disabledFillColor: Color(uiColor: .mvmCoolGray6), - disabledTextColor: Color(uiColor: .mvmWhite), - enabledFillColor_inverted: Color(uiColor: .mvmWhite), - enabledTextColor_inverted: Color(uiColor: .mvmBlack), - disabledFillColor_inverted: Color(uiColor: .mvmCoolGray6), - disabledTextColor_inverted: Color(uiColor: .mvmBlack), + private var primaryFacade = Facade(enabledFillColor: .mvmBlack, + enabledTextColor: .mvmWhite, + disabledFillColor: .mvmCoolGray6, + disabledTextColor: .mvmWhite, + enabledFillColor_inverted: .mvmWhite, + enabledTextColor_inverted: .mvmBlack, + disabledFillColor_inverted: .mvmCoolGray6, + disabledTextColor_inverted: .mvmBlack, borderWidth: 0) - private var secondaryFacade = Facade(enabledFillColor: Color(uiColor: .mvmWhite), - enabledTextColor: Color(uiColor: .mvmBlack), - enabledBorderColor: Color(uiColor: .mvmBlack), - disabledFillColor: Color(uiColor: .mvmWhite), - disabledTextColor: Color(uiColor: .mvmCoolGray6), - disabledBorderColor: Color(uiColor: .mvmCoolGray6), - enabledFillColor_inverted: Color(uiColor: .mvmBlack), - enabledTextColor_inverted: Color(uiColor: .mvmWhite), - enabledBorderColor_inverted: Color(uiColor: .mvmWhite), - disabledFillColor_inverted: Color(uiColor: .mvmWhite), - disabledTextColor_inverted: Color(uiColor: .mvmCoolGray6), - disabledBorderColor_inverted: Color(uiColor: .mvmCoolGray6), + private var secondaryFacade = Facade(enabledFillColor: .mvmWhite, + enabledTextColor: .mvmBlack, + enabledBorderColor: .mvmBlack, + disabledFillColor: .mvmWhite, + disabledTextColor: .mvmCoolGray6, + disabledBorderColor: .mvmCoolGray6, + enabledFillColor_inverted: .mvmBlack, + enabledTextColor_inverted: .mvmWhite, + enabledBorderColor_inverted: .mvmWhite, + disabledFillColor_inverted: .mvmWhite, + disabledTextColor_inverted: .mvmCoolGray6, + disabledBorderColor_inverted: .mvmCoolGray6, borderWidth: 1) //-------------------------------------------------- @@ -139,11 +132,11 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW self.groupName = groupName } - if let style = try typeContainer.decodeIfPresent(ButtonStyle.self, forKey: .style) { + if let style = try typeContainer.decodeIfPresent(Styler.Button.self, forKey: .style) { self.style = style } - if let size = try typeContainer.decodeIfPresent(ButtonSize.self, forKey: .size) { + if let size = try typeContainer.decodeIfPresent(Styler.Button.Size.self, forKey: .size) { self.size = size } @@ -153,7 +146,7 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW if let facade = try typeContainer.decodeIfPresent(Facade.self, forKey: .facade) { self.facade = facade - + switch style { case .primary: primaryFacade = facade @@ -164,6 +157,7 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW if let isInverted = try typeContainer.decodeIfPresent(Bool.self, forKey: .inverted) { self.isInverted = isInverted + facade.isInverted = isInverted } } diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift index 9503168e..d98b531b 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift @@ -61,21 +61,21 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { public func stylePrimary() { buttonModel?.style = .primary - enabledTitleColor = buttonModel?.facade?.enabled.text ?? .mvmWhite - disabledTitleColor = buttonModel?.facade?.disabled.text ?? .mvmWhite - layer.borderWidth = buttonModel?.facade?.getBorderWidth() ?? 0 - backgroundColor = isEnabled ? buttonModel?.facade?.enabled.fill ?? .mvmBlack : buttonModel?.facade?.enabled.fill ?? .mvmCoolGray6 + enabledTitleColor = buttonModel?.facade.enabled.text ?? .mvmWhite + disabledTitleColor = buttonModel?.facade.disabled.text ?? .mvmWhite + layer.borderWidth = buttonModel?.facade.getBorderWidth() ?? 0 + backgroundColor = isEnabled ? buttonModel?.facade.enabled.fill ?? .mvmBlack : buttonModel?.facade.enabled.fill ?? .mvmCoolGray6 } /// The secondary styling for a button. Should be used for secondary buttons public func styleSecondary() { buttonModel?.style = .secondary - enabledTitleColor = buttonModel?.facade?.enabled.text ?? .mvmBlack - disabledTitleColor = buttonModel?.facade?.disabled.text ?? .mvmCoolGray6 + enabledTitleColor = buttonModel?.facade.enabled.text ?? .mvmBlack + disabledTitleColor = buttonModel?.facade.disabled.text ?? .mvmCoolGray6 backgroundColor = .clear - layer.borderWidth = buttonModel?.facade?.getBorderWidth() ?? 1 - borderColor = isEnabled ? buttonModel?.facade?.enabled.border ?? .mvmBlack : buttonModel?.facade?.enabled.border ?? .mvmCoolGray6 + layer.borderWidth = buttonModel?.facade.getBorderWidth() ?? 1 + borderColor = isEnabled ? buttonModel?.facade.enabled.border ?? .mvmBlack : buttonModel?.facade.enabled.border ?? .mvmCoolGray6 } /// Styles the button based on the model style @@ -89,30 +89,30 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { stylePrimary() } - if let titleColor = buttonModel?.facade?.enabled.text { + if let titleColor = buttonModel?.facade.enabled.text { enabledTitleColor = titleColor } - if let disabledTitleColor = buttonModel?.facade?.disabled.text { + if let disabledTitleColor = buttonModel?.facade.disabled.text { self.disabledTitleColor = disabledTitleColor } if isEnabled { - if let fillColor = buttonModel?.facade?.enabled.fill { + if let fillColor = buttonModel?.facade.enabled.fill { backgroundColor = fillColor } - if let borderColor = buttonModel?.facade?.enabled.border { - layer.borderWidth = buttonModel?.facade?.getBorderWidth() ?? 1 + if let borderColor = buttonModel?.facade.enabled.border { + layer.borderWidth = buttonModel?.facade.getBorderWidth() ?? 1 self.borderColor = borderColor } } else { - if let fillColor = buttonModel?.facade?.disabled.fill { + if let fillColor = buttonModel?.facade.disabled.fill { backgroundColor = fillColor } - if let borderColor = buttonModel?.facade?.disabled.border { - layer.borderWidth = buttonModel?.facade?.getBorderWidth() ?? 1 + if let borderColor = buttonModel?.facade.disabled.border { + layer.borderWidth = buttonModel?.facade.getBorderWidth() ?? 1 self.borderColor = borderColor } } @@ -126,7 +126,7 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { PillButton.getHeight(for: buttonModel?.size, size: size) } - public static func getHeight(for buttonSize: ButtonSize?, size: CGFloat) -> CGFloat { + public static func getHeight(for buttonSize: Styler.Button.Size?, size: CGFloat) -> CGFloat { switch buttonSize { case .tiny: diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariableButtonAllTextAndLinksModel.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariableButtonAllTextAndLinksModel.swift index 41d4ec72..de9e5d63 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariableButtonAllTextAndLinksModel.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariableButtonAllTextAndLinksModel.swift @@ -22,7 +22,7 @@ public class ListRightVariableButtonAllTextAndLinksModel: ListItemModel, Molecul override public func setDefaults() { super.setDefaults() self.button.size = .tiny - self.button.style = ButtonStyle.secondary + self.button.style = .secondary } private enum CodingKeys: String, CodingKey { diff --git a/MVMCoreUI/CustomPrimitives/Color.swift b/MVMCoreUI/CustomPrimitives/Color.swift index f06b337c..42c7a600 100644 --- a/MVMCoreUI/CustomPrimitives/Color.swift +++ b/MVMCoreUI/CustomPrimitives/Color.swift @@ -55,6 +55,13 @@ public final class Color: Codable { determineRGBA() } + public init?(uiColor: UIColor?) { + guard let uiColor = uiColor else { return nil } + self.uiColor = uiColor + hex = UIColor.hexString(for: uiColor) ?? "" + determineRGBA() + } + init?(name: String) { guard let colorTuple = UIColor.names[name] else { return nil } self.uiColor = colorTuple.uiColor diff --git a/MVMCoreUI/Styles/Facade.swift b/MVMCoreUI/Styles/Facade.swift index 7b8fb8c9..2bd525cd 100644 --- a/MVMCoreUI/Styles/Facade.swift +++ b/MVMCoreUI/Styles/Facade.swift @@ -53,38 +53,38 @@ public class Facade: Codable { //-------------------------------------------------- public init(isInverted: Bool = false, - backgroundColor_standard: Color? = nil, - backgroundColor_inverted: Color? = nil, - enabledFillColor: Color? = nil, - enabledTextColor: Color? = nil, - enabledBorderColor: Color? = nil, - disabledFillColor: Color? = nil, - disabledTextColor: Color? = nil, - disabledBorderColor: Color? = nil, - enabledFillColor_inverted: Color? = nil, - enabledTextColor_inverted: Color? = nil, - enabledBorderColor_inverted: Color? = nil, - disabledFillColor_inverted: Color? = nil, - disabledTextColor_inverted: Color? = nil, - disabledBorderColor_inverted: Color? = nil, + backgroundColor_standard: UIColor? = nil, + backgroundColor_inverted: UIColor? = nil, + enabledFillColor: UIColor? = nil, + enabledTextColor: UIColor? = nil, + enabledBorderColor: UIColor? = nil, + disabledFillColor: UIColor? = nil, + disabledTextColor: UIColor? = nil, + disabledBorderColor: UIColor? = nil, + enabledFillColor_inverted: UIColor? = nil, + enabledTextColor_inverted: UIColor? = nil, + enabledBorderColor_inverted: UIColor? = nil, + disabledFillColor_inverted: UIColor? = nil, + disabledTextColor_inverted: UIColor? = nil, + disabledBorderColor_inverted: UIColor? = nil, borderWidth: CGFloat? = nil, borderWidth_inverted: CGFloat? = nil) { self.isInverted = isInverted - self.backgroundColor_standard = backgroundColor_standard - self.backgroundColor_inverted = backgroundColor_inverted - self.enabledFillColor = enabledFillColor - self.enabledTextColor = enabledTextColor - self.enabledBorderColor = enabledBorderColor - self.disabledFillColor = disabledFillColor - self.disabledTextColor = disabledTextColor - self.disabledBorderColor = disabledBorderColor - self.enabledFillColor_inverted = enabledFillColor_inverted - self.enabledTextColor_inverted = enabledTextColor_inverted - self.enabledBorderColor_inverted = enabledBorderColor_inverted - self.disabledFillColor_inverted = disabledFillColor_inverted - self.disabledTextColor_inverted = disabledTextColor_inverted - self.disabledBorderColor_inverted = disabledBorderColor_inverted + self.backgroundColor_standard = Color(uiColor: backgroundColor_standard) + self.backgroundColor_inverted = Color(uiColor: backgroundColor_inverted) + self.enabledFillColor = Color(uiColor: enabledFillColor) + self.enabledTextColor = Color(uiColor: enabledTextColor) + self.enabledBorderColor = Color(uiColor: enabledBorderColor) + self.disabledFillColor = Color(uiColor: disabledFillColor) + self.disabledTextColor = Color(uiColor: disabledTextColor) + self.disabledBorderColor = Color(uiColor: disabledBorderColor) + self.enabledFillColor_inverted = Color(uiColor: enabledFillColor_inverted) + self.enabledTextColor_inverted = Color(uiColor: enabledTextColor_inverted) + self.enabledBorderColor_inverted = Color(uiColor: enabledBorderColor_inverted) + self.disabledFillColor_inverted = Color(uiColor: disabledFillColor_inverted) + self.disabledTextColor_inverted = Color(uiColor: disabledTextColor_inverted) + self.disabledBorderColor_inverted = Color(uiColor: disabledBorderColor_inverted) self.borderWidth = borderWidth self.borderWidth_inverted = borderWidth_inverted } diff --git a/MVMCoreUI/Styles/Styler.swift b/MVMCoreUI/Styles/Styler.swift index 509ad107..405eb2bb 100644 --- a/MVMCoreUI/Styles/Styler.swift +++ b/MVMCoreUI/Styles/Styler.swift @@ -172,6 +172,16 @@ open class Styler { } } + public enum Button: String, Codable { + case primary + case secondary + + public enum Size: String, Codable { + case standard + case tiny + } + } + //-------------------------------------------------- // MARK: - Functions //-------------------------------------------------- From c8155a57dbc945876cbbe1d3ccedbe74d38bd290 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Fri, 1 May 2020 16:47:45 -0400 Subject: [PATCH 48/78] resolving gitlab --- MVMCoreUI.xcodeproj/project.pbxproj | 1 - MVMCoreUI/Atomic/Atoms/Views/Arrow.swift | 22 +++---------------- MVMCoreUI/Atomic/Atoms/Views/ArrowModel.swift | 16 ++++++++++++++ .../BarsCarouselIndicatorModel.swift | 1 + .../CarouselIndicator/BarsIndicatorView.swift | 2 ++ .../CarouselIndicator/CarouselIndicator.swift | 16 ++++---------- MVMCoreUI/Atomic/Organisms/Carousel.swift | 13 +++-------- MVMCoreUI/BaseClasses/ImageView.swift | 9 -------- 8 files changed, 29 insertions(+), 51 deletions(-) diff --git a/MVMCoreUI.xcodeproj/project.pbxproj b/MVMCoreUI.xcodeproj/project.pbxproj index 7fada32e..3915b055 100644 --- a/MVMCoreUI.xcodeproj/project.pbxproj +++ b/MVMCoreUI.xcodeproj/project.pbxproj @@ -2045,7 +2045,6 @@ D29E28D823D21AB800ACEA85 /* StringAndMoleculeView.swift in Sources */, 01EB369023609801006832FA /* MoleculeListItemModel.swift in Sources */, 0A9D09212433796500D2E6C0 /* CarouselIndicatorModel.swift in Sources */, - D28A838323CCBD3F00DFE4FC /* CircleProgressModel.swift in Sources */, EA5124FF2436018E0051A3A4 /* BGImageHeadlineBodyButtonModel.swift in Sources */, D28A838323CCBD3F00DFE4FC /* WheelModel.swift in Sources */, D268C70C2386DFFD007F2C1C /* MoleculeStackItemModel.swift in Sources */, diff --git a/MVMCoreUI/Atomic/Atoms/Views/Arrow.swift b/MVMCoreUI/Atomic/Atoms/Views/Arrow.swift index 81b244e1..b618d43d 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/Arrow.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/Arrow.swift @@ -20,8 +20,8 @@ open class Arrow: View { return model as? ArrowModel } - public var direction: Direction { - get { return Direction(rawValue: degrees) ?? .right} + public var direction: ArrowModel.Direction { + get { return ArrowModel.Direction(rawValue: degrees) ?? .right} set { degrees = newValue.rawValue } } @@ -54,23 +54,7 @@ open class Arrow: View { get { return arrowModel?.lineWidth ?? 1 } set { arrowModel?.lineWidth = newValue } } - - //-------------------------------------------------- - // MARK: - Enum - //-------------------------------------------------- - - /// Conveniece for readability of arrow pointing direction. - public enum Direction: Float { - case right = 0 - case upperRight = 45 - case up = 90 - case upperLeft = 135 - case left = 180 - case bottomLeft = 225 - case down = 270 - case bottomRight = 315 - } - + //-------------------------------------------------- // MARK: - Constraints //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Atoms/Views/ArrowModel.swift b/MVMCoreUI/Atomic/Atoms/Views/ArrowModel.swift index 14d98ee3..ac2b2d90 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/ArrowModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/ArrowModel.swift @@ -28,6 +28,22 @@ open class ArrowModel: MoleculeModelProtocol { public var width: CGFloat = 12 public var enabled: Bool = true + //-------------------------------------------------- + // MARK: - Enum + //-------------------------------------------------- + + /// Conveniece for readability of arrow pointing direction. + public enum Direction: Float { + case right = 0 + case upperRight = 45 + case up = 90 + case upperLeft = 135 + case left = 180 + case bottomLeft = 225 + case down = 270 + case bottomRight = 315 + } + //-------------------------------------------------- // MARK: - Initializer //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsCarouselIndicatorModel.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsCarouselIndicatorModel.swift index 89369987..1b5cae14 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsCarouselIndicatorModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsCarouselIndicatorModel.swift @@ -45,5 +45,6 @@ open class BarsCarouselIndicatorModel: CarouselIndicatorModel { public override func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(currentIndicatorColor, forKey: .currentIndicatorColor) + try super.encode(to: encoder) } } diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift index 3bfe8585..acd7f5d0 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift @@ -147,6 +147,8 @@ open class BarsIndicatorView: CarouselIndicator { public override func updateUI(previousIndex: Int, newIndex: Int, totalCount: Int, isAnimated: Bool) { + guard newIndex < totalCount else { return } + guard !barReferences.isEmpty else { generateBars() return diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift index 589bf794..4857f9a0 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift @@ -29,7 +29,7 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { } /// Set this closure to perform an action when a different indicator was selected. - /// Passes through oldInde and newIndex, respectively. + /// Passes through oldIndex and newIndex, respectively. public var indicatorTouchAction: ((CarouselPageControlProtocol) -> ())? open override var isEnabled: Bool { @@ -60,7 +60,6 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { /// Holds the total number of pages displayed by the carousel. /// Updating this property will potentially update the UI. - /// The maxmum count of pages before the indicatorView forces a Numeric Indicator in place of Bar. public var numberOfPages: Int { get { return carouselIndicatorModel?.numberOfPages ?? 0 } set (newTotal) { @@ -106,16 +105,11 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { // MARK: - Lifecycle //-------------------------------------------------- - public override func initialSetup() { - super.initialSetup() - - isAccessibilityElement = true - accessibilityTraits = .adjustable - } - open override func setupView() { super.setupView() + isAccessibilityElement = true + accessibilityTraits = .adjustable setupGestures() } @@ -192,9 +186,7 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { super.set(with: model, delegateObject, additionalData) guard let model = model as? CarouselIndicatorModel else { return } - - indicatorColor = model.indicatorColor.uiColor - disabledIndicatorColor = model.disabledIndicatorColor.uiColor + currentIndex = model.currentIndex isEnabled = model.enabled diff --git a/MVMCoreUI/Atomic/Organisms/Carousel.swift b/MVMCoreUI/Atomic/Organisms/Carousel.swift index e6604ffa..5fd0df36 100644 --- a/MVMCoreUI/Atomic/Organisms/Carousel.swift +++ b/MVMCoreUI/Atomic/Organisms/Carousel.swift @@ -127,7 +127,7 @@ open class Carousel: View { collectionView.backgroundColor = backgroundColor collectionView.layer.borderColor = backgroundColor?.cgColor - collectionView.layer.borderWidth = carouselModel.border! ? 1 : 0 + collectionView.layer.borderWidth = (carouselModel.border ?? false) ? 1 : 0 backgroundColor = .white registerCells(with: carouselModel, delegateObject: delegateObject) @@ -178,16 +178,9 @@ open class Carousel: View { // Sets up the row data with buffer cells on each side (for illusion of endless scroll... also has one more buffer cell on each side in case we can peek that cell). loop = true - if let last = newMolecules.last { - molecules?.insert(last, at: 0) - } - + molecules?.insert(newMolecules.last!, at: 0) molecules?.insert(newMolecules[(newMolecules.count - 2)], at: 0) - - if let first = newMolecules.first { - molecules?.append(first) - } - + molecules?.append(newMolecules.first!) molecules?.append(newMolecules[1]) } diff --git a/MVMCoreUI/BaseClasses/ImageView.swift b/MVMCoreUI/BaseClasses/ImageView.swift index 461397a8..2f0d47e1 100644 --- a/MVMCoreUI/BaseClasses/ImageView.swift +++ b/MVMCoreUI/BaseClasses/ImageView.swift @@ -13,7 +13,6 @@ open class ImageView: UIImageView, ModelMoleculeViewProtocol { // MARK: - Properties //-------------------------------------------------- - open var json: [AnyHashable: Any]? open var model: MoleculeModelProtocol? private var initialSetupPerformed = false @@ -96,14 +95,6 @@ extension ImageView: MVMCoreViewProtocol { // MARK:- MVMCoreUIMoleculeViewProtocol extension ImageView: MVMCoreUIMoleculeViewProtocol { - open func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) { - self.json = json - - if let backgroundColorString = json?.optionalStringForKey(KeyBackgroundColor) { - backgroundColor = UIColor.mfGet(forHex: backgroundColorString) - } - } - open func reset() { backgroundColor = .clear } From c7e3fd189a25112aadc1fcf72ff7c7929c1adef1 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Fri, 1 May 2020 16:56:21 -0400 Subject: [PATCH 49/78] accessibility revision for numeric. --- .../CarouselIndicator/NumericIndicatorView.swift | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift index bf090066..bfe247f5 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift @@ -83,8 +83,8 @@ open class NumericIndicatorView: CarouselIndicator { open override func setupView() { super.setupView() - isUserInteractionEnabled = false - isAccessibilityElement = false + isAccessibilityElement = true + accessibilityTraits = .adjustable addSubview(pageCount) addSubview(leftArrow) addSubview(rightArrow) @@ -101,7 +101,7 @@ open class NumericIndicatorView: CarouselIndicator { trailingAnchor.constraint(equalTo: rightArrow.trailingAnchor) ]) - accessibilityElements = [leftArrow, pageCount, rightArrow] + // accessibilityElements = [leftArrow, pageCount, rightArrow] } public override func assessTouchOf(_ touchPoint_X: CGFloat) { @@ -123,4 +123,12 @@ open class NumericIndicatorView: CarouselIndicator { pageCount.accessibilityValue = "Page \(newIndex + 1) of \(totalCount)" layoutIfNeeded() } + + open override func accessibilityIncrement() { + incrementCurrentIndex() + } + + open override func accessibilityDecrement() { + decrementCurrentIndex() + } } From 49f3584a47913467a70bd76fb4fae0bf9fdc631e Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Fri, 1 May 2020 17:12:09 -0400 Subject: [PATCH 50/78] revised --- .../CarouselIndicator/CarouselIndicator.swift | 4 +++- .../NumericIndicatorView.swift | 19 ++++++++++--------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift index 4857f9a0..e5c3e448 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift @@ -186,7 +186,9 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { super.set(with: model, delegateObject, additionalData) guard let model = model as? CarouselIndicatorModel else { return } - + + indicatorColor = model.indicatorColor.uiColor + disabledIndicatorColor = model.disabledIndicatorColor.uiColor currentIndex = model.currentIndex isEnabled = model.enabled diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift index bfe247f5..def7a7e4 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift @@ -18,25 +18,19 @@ open class NumericIndicatorView: CarouselIndicator { open var pageCount: Label = { let label = Label.commonLabelB2(true) label.setContentCompressionResistancePriority(.required, for: .vertical) - label.accessibilityLabel = "Page Count" label.textAlignment = .center return label }() let leftArrow: Arrow = { let arrow = Arrow(model: ArrowModel(), degrees: 180) - arrow.isAccessibilityElement = true - arrow.accessibilityLabel = "Left arrow" - arrow.accessibilityHint = MVMCoreUIUtility.hardcodedString(withKey: "radio_action_hint") + arrow.isAccessibilityElement = false arrow.pinHeightAndWidth() return arrow }() let rightArrow: Arrow = { let arrow = Arrow(model: ArrowModel()) - arrow.isAccessibilityElement = true - arrow.accessibilityLabel = "Right arrow" - arrow.accessibilityHint = MVMCoreUIUtility.hardcodedString(withKey: "radio_action_hint") arrow.pinHeightAndWidth() return arrow }() @@ -85,6 +79,7 @@ open class NumericIndicatorView: CarouselIndicator { isAccessibilityElement = true accessibilityTraits = .adjustable + accessibilityHint = MVMCoreUIUtility.hardcodedString(withKey: "swipe_to_select_with_action_hint") addSubview(pageCount) addSubview(leftArrow) addSubview(rightArrow) @@ -100,8 +95,6 @@ open class NumericIndicatorView: CarouselIndicator { rightArrow.leadingAnchor.constraint(equalTo: pageCount.trailingAnchor, constant: PaddingOne), trailingAnchor.constraint(equalTo: rightArrow.trailingAnchor) ]) - - // accessibilityElements = [leftArrow, pageCount, rightArrow] } public override func assessTouchOf(_ touchPoint_X: CGFloat) { @@ -113,6 +106,14 @@ open class NumericIndicatorView: CarouselIndicator { } } + open override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { + super.set(with: model, delegateObject, additionalData) + + guard let model = model as? CarouselIndicatorModel else { return } + + isEnabled = model.enabled + } + //-------------------------------------------------- // MARK: - IndicatorViewProtocol //-------------------------------------------------- From be31eb37bbeabf437e109141367a09d5c660d4f2 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Mon, 4 May 2020 08:55:10 -0400 Subject: [PATCH 51/78] changes made for ticket --- .../CarouselIndicator/CarouselIndicator.swift | 8 +++++--- .../CarouselIndicator/NumericIndicatorView.swift | 14 +++++++------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift index e5c3e448..bc33b200 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift @@ -192,9 +192,7 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { currentIndex = model.currentIndex isEnabled = model.enabled - if let accessibleValue = MVMCoreUIUtility.hardcodedString(withKey: model.accessibilityHasSlidesInsteadOfPage ? "MVMCoreUIPageControlslides_currentpage_index" : "MVMCoreUIPageControl_currentpage_index") { - accessibilityValue = String(format: accessibleValue, currentIndex + 1, numberOfPages) - } + } //-------------------------------------------------- @@ -213,6 +211,10 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { func accessibilityAdjust(toPage index: Int) { + if let accessibleValue = MVMCoreUIUtility.hardcodedString(withKey: (carouselIndicatorModel?.accessibilityHasSlidesInsteadOfPage ?? false) ? "MVMCoreUIPageControlslides_currentpage_index" : "MVMCoreUIPageControl_currentpage_index") { + accessibilityValue = String(format: accessibleValue, currentIndex + 1, numberOfPages) + } + if (index < numberOfPages && index >= 0) || carouselIndicatorModel?.alwaysSendAction ?? false { carouselIndicatorModel?.animated = false previousIndex = currentIndex diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift index def7a7e4..2a09842d 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift @@ -125,11 +125,11 @@ open class NumericIndicatorView: CarouselIndicator { layoutIfNeeded() } - open override func accessibilityIncrement() { - incrementCurrentIndex() - } - - open override func accessibilityDecrement() { - decrementCurrentIndex() - } +// open override func accessibilityIncrement() { +// incrementCurrentIndex() +// } +// +// open override func accessibilityDecrement() { +// decrementCurrentIndex() +// } } From 3347f4a0af49dc7fc801567c075c47e026fe4675 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Mon, 4 May 2020 15:02:17 -0400 Subject: [PATCH 52/78] accessibility changes --- .../CarouselIndicator/BarsIndicatorView.swift | 7 ++++-- .../CarouselIndicator/CarouselIndicator.swift | 22 +++++++++++++++---- .../NumericIndicatorView.swift | 13 ++--------- .../Strings/en.lproj/Localizable.strings | 4 ++-- .../Strings/es-MX.lproj/Localizable.strings | 4 ++-- .../Strings/es.lproj/Localizable.strings | 4 ++-- 6 files changed, 31 insertions(+), 23 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift index acd7f5d0..42171934 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift @@ -105,9 +105,12 @@ open class BarsIndicatorView: CarouselIndicator { for i in 0..= 0) || carouselIndicatorModel?.alwaysSendAction ?? false { carouselIndicatorModel?.animated = false diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift index 2a09842d..d93d7709 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift @@ -17,6 +17,7 @@ open class NumericIndicatorView: CarouselIndicator { /// Text to display the current count of total pages for viewing. open var pageCount: Label = { let label = Label.commonLabelB2(true) + label.isAccessibilityElement = false label.setContentCompressionResistancePriority(.required, for: .vertical) label.textAlignment = .center return label @@ -77,8 +78,6 @@ open class NumericIndicatorView: CarouselIndicator { open override func setupView() { super.setupView() - isAccessibilityElement = true - accessibilityTraits = .adjustable accessibilityHint = MVMCoreUIUtility.hardcodedString(withKey: "swipe_to_select_with_action_hint") addSubview(pageCount) addSubview(leftArrow) @@ -121,15 +120,7 @@ open class NumericIndicatorView: CarouselIndicator { open override func updateUI(previousIndex oldIndex: Int, newIndex: Int, totalCount: Int, isAnimated: Bool) { pageCount.text = "\(newIndex + 1)/\(totalCount)" - pageCount.accessibilityValue = "Page \(newIndex + 1) of \(totalCount)" + adjustAccessibilityValue(of: newIndex + 1, total: totalCount) layoutIfNeeded() } - -// open override func accessibilityIncrement() { -// incrementCurrentIndex() -// } -// -// open override func accessibilityDecrement() { -// decrementCurrentIndex() -// } } diff --git a/MVMCoreUI/SupportingFiles/Strings/en.lproj/Localizable.strings b/MVMCoreUI/SupportingFiles/Strings/en.lproj/Localizable.strings index 48cbe3ce..25dd849b 100644 --- a/MVMCoreUI/SupportingFiles/Strings/en.lproj/Localizable.strings +++ b/MVMCoreUI/SupportingFiles/Strings/en.lproj/Localizable.strings @@ -68,8 +68,8 @@ // MARK: Carousel -"MVMCoreUIPageControl_currentpage_index" = "page %ld of %ld"; -"MVMCoreUIPageControlslides_currentpage_index" = "slide %ld of %ld"; +"MVMCoreUIPageControl_currentpage_index" = "page %@ of %d"; +"MVMCoreUIPageControlslides_currentpage_index" = "slide %@ of %d"; // MARK: Styler diff --git a/MVMCoreUI/SupportingFiles/Strings/es-MX.lproj/Localizable.strings b/MVMCoreUI/SupportingFiles/Strings/es-MX.lproj/Localizable.strings index 93c5dda5..0a9eadb9 100644 --- a/MVMCoreUI/SupportingFiles/Strings/es-MX.lproj/Localizable.strings +++ b/MVMCoreUI/SupportingFiles/Strings/es-MX.lproj/Localizable.strings @@ -48,8 +48,8 @@ "AccOff" = "apagado"; "AccToggleHint" = "toca dos veces para alternar"; // Carousel -"MVMCoreUIPageControl_currentpage_index" = "página %ld de %ld"; -"MVMCoreUIPageControlslides_currentpage_index" = "diapositiva %ld of %ld"; +"MVMCoreUIPageControl_currentpage_index" = "página %@ de %d"; +"MVMCoreUIPageControlslides_currentpage_index" = "diapositiva %@ of %d"; //Styler "CountDownDay" = " día"; "CountDownHour" = " hora"; diff --git a/MVMCoreUI/SupportingFiles/Strings/es.lproj/Localizable.strings b/MVMCoreUI/SupportingFiles/Strings/es.lproj/Localizable.strings index 053c4b02..bbc45f4a 100644 --- a/MVMCoreUI/SupportingFiles/Strings/es.lproj/Localizable.strings +++ b/MVMCoreUI/SupportingFiles/Strings/es.lproj/Localizable.strings @@ -50,8 +50,8 @@ "AccOff" = "apagado"; "AccToggleHint" = "toca dos veces para alternar"; // Carousel -"MVMCoreUIPageControl_currentpage_index" = "página %ld de %ld"; -"MVMCoreUIPageControlslides_currentpage_index" = "diapositiva %ld of %ld"; +"MVMCoreUIPageControl_currentpage_index" = "página %@ de %d"; +"MVMCoreUIPageControlslides_currentpage_index" = "diapositiva %@ of %d"; //Styler "CountDownDay" = " día"; "CountDownHour" = " hora"; From 8b05b20f515870afe93142d4e69a786b5c4aa255 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 5 May 2020 09:00:47 -0400 Subject: [PATCH 53/78] latest state --- MVMCoreUI/Atomic/Atoms/Views/Arrow.swift | 10 +++---- .../NumericIndicatorView.swift | 4 +-- .../Protocols/MoleculeViewProtocol.swift | 2 +- MVMCoreUI/BaseClasses/View.swift | 26 ++++++++++++------- 4 files changed, 25 insertions(+), 17 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Views/Arrow.swift b/MVMCoreUI/Atomic/Atoms/Views/Arrow.swift index b618d43d..ae5182e5 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/Arrow.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/Arrow.swift @@ -78,11 +78,11 @@ open class Arrow: View { super.init(frame: frame) } - public convenience init(model: ArrowModel, degrees: Float = 0) { - self.init(frame: .zero) - self.model = model - arrowModel?.degrees = degrees - } +// public convenience init(degrees: Float = 0) { +// self.init(frame: .zero) +// self.model = ArrowModel() +// arrowModel?.degrees = degrees +// } public required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift index d93d7709..634038c1 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift @@ -24,14 +24,14 @@ open class NumericIndicatorView: CarouselIndicator { }() let leftArrow: Arrow = { - let arrow = Arrow(model: ArrowModel(), degrees: 180) + let arrow = Arrow(model: ArrowModel(), nil, nil) arrow.isAccessibilityElement = false arrow.pinHeightAndWidth() return arrow }() let rightArrow: Arrow = { - let arrow = Arrow(model: ArrowModel()) + let arrow = Arrow() arrow.pinHeightAndWidth() return arrow }() diff --git a/MVMCoreUI/Atomic/Protocols/MoleculeViewProtocol.swift b/MVMCoreUI/Atomic/Protocols/MoleculeViewProtocol.swift index 1654a34b..db0de647 100644 --- a/MVMCoreUI/Atomic/Protocols/MoleculeViewProtocol.swift +++ b/MVMCoreUI/Atomic/Protocols/MoleculeViewProtocol.swift @@ -45,7 +45,7 @@ extension MoleculeViewProtocol { } // Do nothing, optionals. - public func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable : Any]?) {} + public func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) {} public func reset() {} public static func estimatedHeight(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?) -> CGFloat? { diff --git a/MVMCoreUI/BaseClasses/View.swift b/MVMCoreUI/BaseClasses/View.swift index b5fdc5e7..c0ca8ee1 100644 --- a/MVMCoreUI/BaseClasses/View.swift +++ b/MVMCoreUI/BaseClasses/View.swift @@ -8,11 +8,16 @@ import UIKit + @objcMembers open class View: UIView, MoleculeViewProtocol { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + open var model: MoleculeModelProtocol? - + private var initialSetupPerformed = false - + //-------------------------------------------------- // MARK: - Initialization //-------------------------------------------------- @@ -21,7 +26,7 @@ import UIKit super.init(frame: .zero) initialSetup() } - + public convenience init() { self.init(frame: .zero) } @@ -38,12 +43,15 @@ import UIKit } } - // MARK:- MoleculeViewProtocol + //-------------------------------------------------- + // MARK: - MoleculeViewProtocol + //-------------------------------------------------- + open func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { - self.model = model - if let backgroundColor = model.backgroundColor { + self.model = model + if let backgroundColor = model.backgroundColor { self.backgroundColor = backgroundColor.uiColor - } + } } open class func nameForReuse(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?) -> String? { @@ -66,8 +74,8 @@ import UIKit // MARK:- MVMCoreViewProtocol extension View: MVMCoreViewProtocol { - open func updateView(_ size: CGFloat) {} - + open func updateView(_ size: CGFloat) { } + /// Will be called only once. open func setupView() { translatesAutoresizingMaskIntoConstraints = false From 3de0c4865a4874370bef5c625cd9979f28ee382a Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 5 May 2020 09:01:38 -0400 Subject: [PATCH 54/78] latest state --- .../Atomic/Atoms/Buttons/ButtonModel.swift | 34 +++---------------- .../Atomic/Atoms/Buttons/PillButton.swift | 25 ++++++-------- .../TwoButtonView.swift | 2 ++ MVMCoreUI/Styles/Styler.swift | 5 +++ 4 files changed, 22 insertions(+), 44 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift index 62c48d4a..5f6e2621 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift @@ -19,23 +19,8 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW public var title: String public var action: ActionModelProtocol public var enabled: Bool = true - - public var isInverted: Bool = false { - didSet { facade.isInverted = isInverted } - } - public lazy var facade: Facade = primaryFacade - - public var style: Styler.Button = .primary { - didSet { - switch style { - case .primary: - facade = primaryFacade - case .secondary: - facade = secondaryFacade - } - } - } + public var style: Styler.Button? public var size: Styler.Button.Size? = .standard public var groupName: String = "" @@ -128,10 +113,6 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW title = try typeContainer.decode(String.self, forKey: .title) action = try typeContainer.decodeModel(codingKey: .action) - if let groupName = try typeContainer.decodeIfPresent(String.self, forKey: .groupName) { - self.groupName = groupName - } - if let style = try typeContainer.decodeIfPresent(Styler.Button.self, forKey: .style) { self.style = style } @@ -146,26 +127,21 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW if let facade = try typeContainer.decodeIfPresent(Facade.self, forKey: .facade) { self.facade = facade - - switch style { - case .primary: - primaryFacade = facade - case .secondary: - secondaryFacade = facade - } } if let isInverted = try typeContainer.decodeIfPresent(Bool.self, forKey: .inverted) { - self.isInverted = isInverted facade.isInverted = isInverted } + + if let groupName = try typeContainer.decodeIfPresent(String.self, forKey: .groupName) { + self.groupName = groupName + } } public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(moleculeName, forKey: .moleculeName) try container.encode(title, forKey: .title) - try container.encode(isInverted, forKey: .inverted) try container.encode(enabled, forKey: .enabled) try container.encodeModel(action, forKey: .action) try container.encodeIfPresent(facade, forKey: .facade) diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift index d98b531b..210c6a43 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift @@ -26,11 +26,6 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { didSet { style() } } - private enum Height: CGFloat { - case tiny = 20 - case standard = 42 - } - //-------------------------------------------------- // MARK: - Computed Properties //-------------------------------------------------- @@ -60,22 +55,20 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { /// The primary styling for a button. Should be used for main buttons public func stylePrimary() { - buttonModel?.style = .primary enabledTitleColor = buttonModel?.facade.enabled.text ?? .mvmWhite disabledTitleColor = buttonModel?.facade.disabled.text ?? .mvmWhite layer.borderWidth = buttonModel?.facade.getBorderWidth() ?? 0 - backgroundColor = isEnabled ? buttonModel?.facade.enabled.fill ?? .mvmBlack : buttonModel?.facade.enabled.fill ?? .mvmCoolGray6 + backgroundColor = isEnabled ? buttonModel?.facade.enabled.fill ?? .mvmBlack : buttonModel?.facade.disabled.fill ?? .mvmCoolGray6 } /// The secondary styling for a button. Should be used for secondary buttons public func styleSecondary() { - buttonModel?.style = .secondary enabledTitleColor = buttonModel?.facade.enabled.text ?? .mvmBlack disabledTitleColor = buttonModel?.facade.disabled.text ?? .mvmCoolGray6 backgroundColor = .clear layer.borderWidth = buttonModel?.facade.getBorderWidth() ?? 1 - borderColor = isEnabled ? buttonModel?.facade.enabled.border ?? .mvmBlack : buttonModel?.facade.enabled.border ?? .mvmCoolGray6 + borderColor = isEnabled ? buttonModel?.facade.enabled.border ?? .mvmBlack : buttonModel?.facade.disabled.border ?? .mvmCoolGray6 } /// Styles the button based on the model style @@ -130,10 +123,14 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { switch buttonSize { case .tiny: - return MFSizeObject(standardSize: Height.tiny.rawValue, standardiPadPortraitSize: 34, iPadProLandscapeSize: 38)?.getValueBased(onSize: size) ?? Height.tiny.rawValue + return MFSizeObject(standardSize: Styler.Button.Height.tiny.rawValue, + standardiPadPortraitSize: 34, + iPadProLandscapeSize: 38)?.getValueBased(onSize: size) ?? Styler.Button.Height.tiny.rawValue default: - return MFSizeObject(standardSize: Height.standard.rawValue, standardiPadPortraitSize: 46, iPadProLandscapeSize: 50)?.getValueBased(onSize: size) ?? Height.standard.rawValue + return MFSizeObject(standardSize: Styler.Button.Height.standard.rawValue, + standardiPadPortraitSize: 46, + iPadProLandscapeSize: 50)?.getValueBased(onSize: size) ?? Styler.Button.Height.standard.rawValue } } @@ -172,8 +169,6 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { }) } - style() - FormValidator.setupValidation(for: model, delegate: delegateObject?.formHolderDelegate) } @@ -189,10 +184,10 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { switch buttonModel?.size { case .tiny: - titleLabel?.font = MFFonts.mfFont75Bd(11 * (intrinsicContentSize.height / Height.tiny.rawValue)) + titleLabel?.font = MFFonts.mfFont75Bd(11 * (intrinsicContentSize.height / Styler.Button.Height.tiny.rawValue)) default: - titleLabel?.font = MFFonts.mfFont75Bd(13 * (intrinsicContentSize.height / Height.standard.rawValue)) + titleLabel?.font = MFFonts.mfFont75Bd(13 * (intrinsicContentSize.height / Styler.Button.Height.standard.rawValue)) } layer.cornerRadius = getInnerPadding() diff --git a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonView.swift b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonView.swift index a789eebb..c8a97136 100644 --- a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonView.swift +++ b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonView.swift @@ -140,6 +140,7 @@ import UIKit if let secondaryModel = model.secondaryButton { showSecondaryButton() + secondaryModel.style = .secondary secondaryButton.set(with: secondaryModel, delegateObject, additionalData) } else { hideSecondaryButton() @@ -147,6 +148,7 @@ import UIKit if let primaryModel = model.primaryButton { showPrimaryButton() + primaryModel.style = .primary primaryButton.set(with: primaryModel, delegateObject, additionalData) } else { hidePrimaryButton() diff --git a/MVMCoreUI/Styles/Styler.swift b/MVMCoreUI/Styles/Styler.swift index 1adc8796..c342b5a1 100644 --- a/MVMCoreUI/Styles/Styler.swift +++ b/MVMCoreUI/Styles/Styler.swift @@ -180,6 +180,11 @@ open class Styler { case standard case tiny } + + public enum Height: CGFloat { + case tiny = 20 + case standard = 42 + } } //-------------------------------------------------- From 0aad6f3aa7a0b5eb12a96d88b91efdabedba2b99 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 5 May 2020 10:41:55 -0400 Subject: [PATCH 55/78] requested changes and improvements made --- MVMCoreUI/Atomic/Atoms/Views/Arrow.swift | 18 ++++------ .../CarouselIndicator/BarsIndicatorView.swift | 10 +++--- .../CarouselIndicator/CarouselIndicator.swift | 7 ++-- .../NumericIndicatorView.swift | 36 +++++++++---------- .../Atomic/Organisms/CarouselModel.swift | 2 +- 5 files changed, 35 insertions(+), 38 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Views/Arrow.swift b/MVMCoreUI/Atomic/Atoms/Views/Arrow.swift index ae5182e5..ea5023c8 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/Arrow.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/Arrow.swift @@ -54,7 +54,7 @@ open class Arrow: View { get { return arrowModel?.lineWidth ?? 1 } set { arrowModel?.lineWidth = newValue } } - + //-------------------------------------------------- // MARK: - Constraints //-------------------------------------------------- @@ -78,12 +78,6 @@ open class Arrow: View { super.init(frame: frame) } -// public convenience init(degrees: Float = 0) { -// self.init(frame: .zero) -// self.model = ArrowModel() -// arrowModel?.degrees = degrees -// } - public required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } @@ -105,9 +99,7 @@ open class Arrow: View { // MARK: - Drawing //-------------------------------------------------- - /** - Draws the arrow pointing to the right and then rotates the arrow x degrees counter-clockwise. - */ + /// Draws the arrow pointing to the right and then rotates the arrow x degrees counter-clockwise. open override func draw(_ rect: CGRect) { super.draw(rect) @@ -115,7 +107,7 @@ open class Arrow: View { drawShapeLayer() let radians = CGFloat(degrees * Float.pi / 180) - arrowLayer.transform = CATransform3DMakeRotation(-radians, 0.0, 0.0, 1.0) + arrowLayer.transform = CATransform3DMakeRotation(-radians, 0, 0, 1) } private func drawShapeLayer() { @@ -153,6 +145,10 @@ open class Arrow: View { return bezierPath.cgPath } + //-------------------------------------------------- + // MARK: - MoleculeViewProtocol + //-------------------------------------------------- + public override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { super.set(with: model, delegateObject, additionalData) diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift index 42171934..9b4ea3bc 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift @@ -61,12 +61,12 @@ open class BarsIndicatorView: CarouselIndicator { } public override var indicatorColor: UIColor { - get { return carouselIndicatorModel?.indicatorColor.uiColor ?? .mvmBlack } + get { return super.indicatorColor } set (newColor) { super.indicatorColor = newColor - for (i, barTuple) in barReferences.enumerated() where i != currentIndex { - barTuple.view.backgroundColor = newColor + for (i, barTuple) in barReferences.enumerated() { + barTuple.view.backgroundColor = i == currentIndex ? currentIndicatorColor : newColor } } } @@ -158,8 +158,8 @@ open class BarsIndicatorView: CarouselIndicator { } let expression = { - self.barReferences[previousIndex].view.backgroundColor = self.indicatorColor - self.barReferences[newIndex].view.backgroundColor = self.currentIndicatorColor + self.barReferences[previousIndex].view.backgroundColor = self.isEnabled ? self.indicatorColor : self.disabledIndicatorColor + self.barReferences[newIndex].view.backgroundColor = self.isEnabled ? self.currentIndicatorColor : self.disabledIndicatorColor self.barReferences[previousIndex].constraint.constant = BarsIndicatorView.indicatorBarHeight.unselected self.barReferences[newIndex].constraint.constant = BarsIndicatorView.indicatorBarHeight.selected self.layoutIfNeeded() diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift index ebebd047..be3b3542 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift @@ -140,11 +140,12 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { } func incrementCurrentIndex() { - currentIndex = min(currentIndex + 1, numberOfPages - 1) + currentIndex = (currentIndex + 1) % numberOfPages } func decrementCurrentIndex() { - currentIndex = max(0, currentIndex - 1) + let newIndex = currentIndex - 1 + currentIndex = newIndex < 0 ? numberOfPages - 1 : newIndex } /// Increments the currentIndex value. @@ -222,7 +223,7 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { let accessibleIndex = ordinalFormatter.string(from: NSNumber(value: index)) else { return } - accessibilityValue = String(format: accessibleFormat, accessibleIndex, total) + accessibilityValue = String(format: accessibleFormat, accessibleIndex, total) } func accessibilityAdjust(toPage index: Int) { diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift index 634038c1..8660968d 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift @@ -26,12 +26,13 @@ open class NumericIndicatorView: CarouselIndicator { let leftArrow: Arrow = { let arrow = Arrow(model: ArrowModel(), nil, nil) arrow.isAccessibilityElement = false + arrow.direction = .left arrow.pinHeightAndWidth() return arrow }() let rightArrow: Arrow = { - let arrow = Arrow() + let arrow = Arrow(model: ArrowModel(), nil, nil) arrow.pinHeightAndWidth() return arrow }() @@ -41,23 +42,17 @@ open class NumericIndicatorView: CarouselIndicator { //-------------------------------------------------- open override var isEnabled: Bool { - didSet { - pageCount.textColor = isEnabled ? indicatorColor : disabledIndicatorColor - leftArrow.tintColor = isEnabled ? indicatorColor : disabledIndicatorColor - rightArrow.tintColor = isEnabled ? indicatorColor : disabledIndicatorColor - } + didSet { setViewColor(isEnabled ? indicatorColor : disabledIndicatorColor) } } /// Sets the color for pageCount text, left arrow and right arrow. public override var indicatorColor: UIColor { - get { return carouselIndicatorModel?.indicatorColor.uiColor ?? .mvmBlack } + get { return super.indicatorColor } set (newColor) { super.indicatorColor = newColor if isEnabled { - pageCount.textColor = newColor - leftArrow.arrowModel?.color = Color(uiColor: newColor) - rightArrow.arrowModel?.color = Color(uiColor: newColor) + setViewColor(newColor) } } } @@ -90,12 +85,16 @@ open class NumericIndicatorView: CarouselIndicator { leftArrow.centerYAnchor.constraint(equalTo: centerYAnchor), rightArrow.centerYAnchor.constraint(equalTo: centerYAnchor), leftArrow.leadingAnchor.constraint(equalTo: leadingAnchor), - pageCount.leadingAnchor.constraint(equalTo: leftArrow.trailingAnchor, constant: PaddingOne), - rightArrow.leadingAnchor.constraint(equalTo: pageCount.trailingAnchor, constant: PaddingOne), + pageCount.leadingAnchor.constraint(equalTo: leftArrow.trailingAnchor, constant: Padding.Two), + rightArrow.leadingAnchor.constraint(equalTo: pageCount.trailingAnchor, constant: Padding.Two), trailingAnchor.constraint(equalTo: rightArrow.trailingAnchor) ]) } + //-------------------------------------------------- + // MARK: - Methods + //-------------------------------------------------- + public override func assessTouchOf(_ touchPoint_X: CGFloat) { if touchPoint_X > bounds.width / 2 { @@ -105,14 +104,15 @@ open class NumericIndicatorView: CarouselIndicator { } } - open override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { - super.set(with: model, delegateObject, additionalData) + private func setViewColor(_ newColor: UIColor) { - guard let model = model as? CarouselIndicatorModel else { return } - - isEnabled = model.enabled + pageCount.textColor = newColor + leftArrow.color = newColor + rightArrow.color = newColor + rightArrow.setNeedsDisplay() + leftArrow.setNeedsDisplay() } - + //-------------------------------------------------- // MARK: - IndicatorViewProtocol //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Organisms/CarouselModel.swift b/MVMCoreUI/Atomic/Organisms/CarouselModel.swift index c8406d7b..857901e8 100644 --- a/MVMCoreUI/Atomic/Organisms/CarouselModel.swift +++ b/MVMCoreUI/Atomic/Organisms/CarouselModel.swift @@ -29,7 +29,7 @@ import UIKit public var itemAlignment: UICollectionView.ScrollPosition? public var pagingMolecule: (CarouselPagingModelProtocol & MoleculeModelProtocol)? - public init(molecules: [CarouselItemModel]){ + public init(molecules: [CarouselItemModel]) { self.molecules = molecules } From 4ffd07dd3d58f617e2ed8c89f86133e6b787e069 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 5 May 2020 12:43:54 -0400 Subject: [PATCH 56/78] beginning rework --- MVMCoreUI.xcodeproj/project.pbxproj | 6 +- .../Atomic/Atoms/Buttons/ButtonModel.swift | 125 +++++++++++- MVMCoreUI/Styles/Facade.swift | 188 ------------------ 3 files changed, 119 insertions(+), 200 deletions(-) delete mode 100644 MVMCoreUI/Styles/Facade.swift diff --git a/MVMCoreUI.xcodeproj/project.pbxproj b/MVMCoreUI.xcodeproj/project.pbxproj index b7b6852b..c17abf62 100644 --- a/MVMCoreUI.xcodeproj/project.pbxproj +++ b/MVMCoreUI.xcodeproj/project.pbxproj @@ -91,7 +91,6 @@ 0A7EF86323D8AFA000B2AAD1 /* BaseDropdownEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF86223D8AFA000B2AAD1 /* BaseDropdownEntryFieldModel.swift */; }; 0A7EF86523D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF86423D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift */; }; 0A7EF86723D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF86623D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift */; }; - 0A96140B245B06F0006FA18B /* Facade.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A96140A245B06F0006FA18B /* Facade.swift */; }; 0AA33B3A2398524F0067DD0F /* Toggle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AA33B392398524F0067DD0F /* Toggle.swift */; }; 0AB764D124460F6300E7FE72 /* UIDatePicker+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AB764D024460F6300E7FE72 /* UIDatePicker+Extension.swift */; }; 0AB764D324460FA400E7FE72 /* UIPickerView+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AB764D224460FA400E7FE72 /* UIPickerView+Extension.swift */; }; @@ -495,7 +494,6 @@ 0A7EF86423D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemDropdownEntryFieldModel.swift; sourceTree = ""; }; 0A7EF86623D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateDropdownEntryFieldModel.swift; sourceTree = ""; }; 0A8321AE2355FE9500CB7F00 /* DigitBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DigitBox.swift; sourceTree = ""; }; - 0A96140A245B06F0006FA18B /* Facade.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Facade.swift; sourceTree = ""; }; 0AA33B33239813C50067DD0F /* UIColor+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+Extension.swift"; sourceTree = ""; }; 0AA33B392398524F0067DD0F /* Toggle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Toggle.swift; sourceTree = ""; }; 0AB764D024460F6300E7FE72 /* UIDatePicker+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIDatePicker+Extension.swift"; sourceTree = ""; }; @@ -1522,7 +1520,6 @@ D29DF13921E68637003B2FB9 /* MFStyler.m */, 0A6682A92435125F00AD3CA1 /* Styler.swift */, 0A6682AB243531C300AD3CA1 /* Padding.swift */, - 0A96140A245B06F0006FA18B /* Facade.swift */, ); path = Styles; sourceTree = ""; @@ -1993,7 +1990,6 @@ 012A88C4238D86E600FE3DA1 /* CarouselItemModelProtocol.swift in Sources */, D2E2A9A123E095AB000B42E6 /* ButtonModelProtocol.swift in Sources */, 94C2D9AB23872EB50006CF46 /* LabelAttributeActionModel.swift in Sources */, - 0A96140B245B06F0006FA18B /* Facade.swift in Sources */, D22D8395241FB41200D3DF69 /* UIStackView+Extension.swift in Sources */, 52B201D324081CFB00D2011E /* ListLeftVariableRadioButtonAndPaymentMethodModel.swift in Sources */, 525239C02407BCFF00454969 /* ListTwoColumnPriceDetailsModel.swift in Sources */, @@ -2082,7 +2078,7 @@ 0A7BAFA1232BE61800FB8E22 /* Checkbox.swift in Sources */, 011B58F023A2AA980085F53C /* ListItemModelProtocol.swift in Sources */, D22479962316AF6E003FCCF9 /* HeadlineBodyLink.swift in Sources */, - 8DE5BECD2456F7A200772E76 /* ListTwoColumnDropdownSelectorsModel.swift in Sources */, + 8DE5BECD2456F7A200772E76 /* ListTwoColumnDropdownSelectorsModel.swift in Sources */, 0A41BA7F23453A6400D4C0BC /* TextEntryField.swift in Sources */, BB55B51D244482C1002001AD /* ListRightVariablePriceChangeBodyText.swift in Sources */, 017BEB382360C6AC0024EF95 /* RadioButtonLabel.swift in Sources */, diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift index 5f6e2621..a7f679b5 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift @@ -8,6 +8,8 @@ import UIKit +public typealias FacadeElements = (fill: UIColor?, text: UIColor?, border: UIColor?) + public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupWatcherFieldProtocol { //-------------------------------------------------- @@ -19,15 +21,46 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW public var title: String public var action: ActionModelProtocol public var enabled: Bool = true - public lazy var facade: Facade = primaryFacade public var style: Styler.Button? public var size: Styler.Button.Size? = .standard public var groupName: String = "" + public var isInverted: Bool = false + + public lazy var enabledElements: FacadeElements = (fill: enabled_fillColor(), + text: enabled_textColor(), + border: enabled_borderColor()) + + public lazy var disabledElements: FacadeElements = (fill: disabled_fillColor(), + text: disabled_textColor(), + border: disabled_borderColor()) + + public var backgroundColor_standard: Color? + public var backgroundColor_inverted: Color? + + public var enabledFillColor: Color? + public var enabledTextColor: Color? + public var enabledBorderColor: Color? + + public var enabledFillColor_inverted: Color? + public var enabledTextColor_inverted: Color? + public var enabledBorderColor_inverted: Color? + + public var disabledFillColor: Color? + public var disabledTextColor: Color? + public var disabledBorderColor: Color? + + public var disabledFillColor_inverted: Color? + public var disabledTextColor_inverted: Color? + public var disabledBorderColor_inverted: Color? + + public var borderWidth: CGFloat? + public var borderWidth_inverted: CGFloat? + //-------------------------------------------------- // MARK: - Default Button Facades //-------------------------------------------------- - + /* private var primaryFacade = Facade(enabledFillColor: .mvmBlack, enabledTextColor: .mvmWhite, disabledFillColor: .mvmCoolGray6, @@ -51,7 +84,7 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW disabledTextColor_inverted: .mvmCoolGray6, disabledBorderColor_inverted: .mvmCoolGray6, borderWidth: 1) - + */ //-------------------------------------------------- // MARK: - Methods //-------------------------------------------------- @@ -85,6 +118,43 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW style = .primary } + //-------------------------------------------------- + // MARK: - Methods + //-------------------------------------------------- + + public func backgroundColor() -> UIColor? { + return (isInverted ? backgroundColor_inverted : backgroundColor_standard)?.uiColor + } + + public func getBorderWidth() -> CGFloat? { + return isInverted ? borderWidth_inverted : borderWidth + } + + public func enabled_fillColor() -> UIColor? { + return (isInverted ? enabledFillColor_inverted : enabledFillColor)?.uiColor + } + + public func enabled_textColor() -> UIColor? { + return (isInverted ? enabledTextColor_inverted : enabledTextColor)?.uiColor + } + + public func enabled_borderColor() -> UIColor? { + return (isInverted ? enabledBorderColor_inverted : enabledBorderColor)?.uiColor + } + + public func disabled_fillColor() -> UIColor? { + return (isInverted ? disabledFillColor_inverted : disabledFillColor)?.uiColor + } + + public func disabled_textColor() -> UIColor? { + return (isInverted ? disabledTextColor_inverted : disabledTextColor)?.uiColor + } + + public func disabled_borderColor() -> UIColor? { + return (isInverted ? disabledBorderColor_inverted : disabledBorderColor)?.uiColor + } + + //-------------------------------------------------- // MARK: - Keys //-------------------------------------------------- @@ -100,6 +170,21 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW case size case facade case groupName + + case backgroundColor_standard + case backgroundColor_inverted + case enabledFillColor + case enabledTextColor + case enabledBorderColor + case enabledFillColor_inverted + case enabledTextColor_inverted + case enabledBorderColor_inverted + case disabledFillColor + case disabledTextColor + case disabledBorderColor + case disabledFillColor_inverted + case disabledTextColor_inverted + case disabledBorderColor_inverted } //-------------------------------------------------- @@ -125,10 +210,6 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW self.enabled = enabled } - if let facade = try typeContainer.decodeIfPresent(Facade.self, forKey: .facade) { - self.facade = facade - } - if let isInverted = try typeContainer.decodeIfPresent(Bool.self, forKey: .inverted) { facade.isInverted = isInverted } @@ -136,6 +217,21 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW if let groupName = try typeContainer.decodeIfPresent(String.self, forKey: .groupName) { self.groupName = groupName } + + backgroundColor_standard = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor_standard) + backgroundColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor_inverted) + enabledFillColor = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledFillColor) + enabledTextColor = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledTextColor) + enabledBorderColor = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledBorderColor) + enabledFillColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledFillColor_inverted) + enabledTextColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledTextColor_inverted) + enabledBorderColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledBorderColor_inverted) + disabledFillColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledFillColor) + disabledTextColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledTextColor) + disabledBorderColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledBorderColor) + disabledFillColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledFillColor_inverted) + disabledTextColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledTextColor_inverted) + disabledBorderColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledBorderColor_inverted) } public func encode(to encoder: Encoder) throws { @@ -149,5 +245,20 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW try container.encodeIfPresent(style, forKey: .style) try container.encodeIfPresent(size, forKey: .size) try container.encodeIfPresent(groupName, forKey: .groupName) + + try container.encodeIfPresent(backgroundColor_standard, forKey: .backgroundColor_standard) + try container.encodeIfPresent(backgroundColor_inverted, forKey: .backgroundColor_inverted) + try container.encodeIfPresent(enabledFillColor, forKey: .enabledFillColor) + try container.encodeIfPresent(enabledTextColor, forKey: .enabledTextColor) + try container.encodeIfPresent(enabledBorderColor, forKey: .enabledBorderColor) + try container.encodeIfPresent(enabledFillColor_inverted, forKey: .enabledFillColor_inverted) + try container.encodeIfPresent(enabledTextColor_inverted, forKey: .enabledTextColor_inverted) + try container.encodeIfPresent(enabledBorderColor_inverted, forKey: .enabledBorderColor_inverted) + try container.encodeIfPresent(disabledFillColor, forKey: .disabledFillColor) + try container.encodeIfPresent(disabledTextColor, forKey: .disabledTextColor) + try container.encodeIfPresent(disabledBorderColor, forKey: .disabledBorderColor) + try container.encodeIfPresent(disabledFillColor_inverted, forKey: .disabledFillColor_inverted) + try container.encodeIfPresent(disabledTextColor_inverted, forKey: .disabledTextColor_inverted) + try container.encodeIfPresent(disabledBorderColor_inverted, forKey: .disabledBorderColor_inverted) } } diff --git a/MVMCoreUI/Styles/Facade.swift b/MVMCoreUI/Styles/Facade.swift deleted file mode 100644 index 2bd525cd..00000000 --- a/MVMCoreUI/Styles/Facade.swift +++ /dev/null @@ -1,188 +0,0 @@ -// -// Facade.swift -// MVMCoreUI -// -// Created by Kevin Christiano on 4/30/20. -// Copyright © 2020 Verizon Wireless. All rights reserved. -// - -import Foundation - -public typealias FacadeElements = (fill: UIColor?, text: UIColor?, border: UIColor?) - - -public class Facade: Codable { - //-------------------------------------------------- - // MARK: - Properties - //-------------------------------------------------- - - public var isInverted: Bool = false - - public lazy var enabled: FacadeElements = (fill: enabled_fillColor(), - text: enabled_textColor(), - border: enabled_borderColor()) - - public lazy var disabled: FacadeElements = (fill: disabled_fillColor(), - text: disabled_textColor(), - border: disabled_borderColor()) - - public var backgroundColor_standard: Color? - public var backgroundColor_inverted: Color? - - public var enabledFillColor: Color? - public var enabledTextColor: Color? - public var enabledBorderColor: Color? - - public var enabledFillColor_inverted: Color? - public var enabledTextColor_inverted: Color? - public var enabledBorderColor_inverted: Color? - - public var disabledFillColor: Color? - public var disabledTextColor: Color? - public var disabledBorderColor: Color? - - public var disabledFillColor_inverted: Color? - public var disabledTextColor_inverted: Color? - public var disabledBorderColor_inverted: Color? - - public var borderWidth: CGFloat? - public var borderWidth_inverted: CGFloat? - - //-------------------------------------------------- - // MARK: - Initializer - //-------------------------------------------------- - - public init(isInverted: Bool = false, - backgroundColor_standard: UIColor? = nil, - backgroundColor_inverted: UIColor? = nil, - enabledFillColor: UIColor? = nil, - enabledTextColor: UIColor? = nil, - enabledBorderColor: UIColor? = nil, - disabledFillColor: UIColor? = nil, - disabledTextColor: UIColor? = nil, - disabledBorderColor: UIColor? = nil, - enabledFillColor_inverted: UIColor? = nil, - enabledTextColor_inverted: UIColor? = nil, - enabledBorderColor_inverted: UIColor? = nil, - disabledFillColor_inverted: UIColor? = nil, - disabledTextColor_inverted: UIColor? = nil, - disabledBorderColor_inverted: UIColor? = nil, - borderWidth: CGFloat? = nil, - borderWidth_inverted: CGFloat? = nil) { - - self.isInverted = isInverted - self.backgroundColor_standard = Color(uiColor: backgroundColor_standard) - self.backgroundColor_inverted = Color(uiColor: backgroundColor_inverted) - self.enabledFillColor = Color(uiColor: enabledFillColor) - self.enabledTextColor = Color(uiColor: enabledTextColor) - self.enabledBorderColor = Color(uiColor: enabledBorderColor) - self.disabledFillColor = Color(uiColor: disabledFillColor) - self.disabledTextColor = Color(uiColor: disabledTextColor) - self.disabledBorderColor = Color(uiColor: disabledBorderColor) - self.enabledFillColor_inverted = Color(uiColor: enabledFillColor_inverted) - self.enabledTextColor_inverted = Color(uiColor: enabledTextColor_inverted) - self.enabledBorderColor_inverted = Color(uiColor: enabledBorderColor_inverted) - self.disabledFillColor_inverted = Color(uiColor: disabledFillColor_inverted) - self.disabledTextColor_inverted = Color(uiColor: disabledTextColor_inverted) - self.disabledBorderColor_inverted = Color(uiColor: disabledBorderColor_inverted) - self.borderWidth = borderWidth - self.borderWidth_inverted = borderWidth_inverted - } - - //-------------------------------------------------- - // MARK: - Methods - //-------------------------------------------------- - - public func backgroundColor() -> UIColor? { - return (isInverted ? backgroundColor_inverted : backgroundColor_standard)?.uiColor - } - - public func getBorderWidth() -> CGFloat? { - return isInverted ? borderWidth_inverted : borderWidth - } - - public func enabled_fillColor() -> UIColor? { - return (isInverted ? enabledFillColor_inverted : enabledFillColor)?.uiColor - } - - public func enabled_textColor() -> UIColor? { - return (isInverted ? enabledTextColor_inverted : enabledTextColor)?.uiColor - } - - public func enabled_borderColor() -> UIColor? { - return (isInverted ? enabledBorderColor_inverted : enabledBorderColor)?.uiColor - } - - public func disabled_fillColor() -> UIColor? { - return (isInverted ? disabledFillColor_inverted : disabledFillColor)?.uiColor - } - - public func disabled_textColor() -> UIColor? { - return (isInverted ? disabledTextColor_inverted : disabledTextColor)?.uiColor - } - - public func disabled_borderColor() -> UIColor? { - return (isInverted ? disabledBorderColor_inverted : disabledBorderColor)?.uiColor - } - - //-------------------------------------------------- - // MARK: - Keys - //-------------------------------------------------- - - private enum CodingKeys: String, CodingKey { - case backgroundColor_standard - case backgroundColor_inverted - case enabledFillColor - case enabledTextColor - case enabledBorderColor - case enabledFillColor_inverted - case enabledTextColor_inverted - case enabledBorderColor_inverted - case disabledFillColor - case disabledTextColor - case disabledBorderColor - case disabledFillColor_inverted - case disabledTextColor_inverted - case disabledBorderColor_inverted - } - - //-------------------------------------------------- - // MARK: - Codec - //-------------------------------------------------- - - required public init(from decoder: Decoder) throws { - let typeContainer = try decoder.container(keyedBy: CodingKeys.self) - backgroundColor_standard = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor_standard) - backgroundColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor_inverted) - enabledFillColor = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledFillColor) - enabledTextColor = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledTextColor) - enabledBorderColor = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledBorderColor) - enabledFillColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledFillColor_inverted) - enabledTextColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledTextColor_inverted) - enabledBorderColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledBorderColor_inverted) - disabledFillColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledFillColor) - disabledTextColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledTextColor) - disabledBorderColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledBorderColor) - disabledFillColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledFillColor_inverted) - disabledTextColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledTextColor_inverted) - disabledBorderColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledBorderColor_inverted) - } - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encodeIfPresent(backgroundColor_standard, forKey: .backgroundColor_standard) - try container.encodeIfPresent(backgroundColor_inverted, forKey: .backgroundColor_inverted) - try container.encodeIfPresent(enabledFillColor, forKey: .enabledFillColor) - try container.encodeIfPresent(enabledTextColor, forKey: .enabledTextColor) - try container.encodeIfPresent(enabledBorderColor, forKey: .enabledBorderColor) - try container.encodeIfPresent(enabledFillColor_inverted, forKey: .enabledFillColor_inverted) - try container.encodeIfPresent(enabledTextColor_inverted, forKey: .enabledTextColor_inverted) - try container.encodeIfPresent(enabledBorderColor_inverted, forKey: .enabledBorderColor_inverted) - try container.encodeIfPresent(disabledFillColor, forKey: .disabledFillColor) - try container.encodeIfPresent(disabledTextColor, forKey: .disabledTextColor) - try container.encodeIfPresent(disabledBorderColor, forKey: .disabledBorderColor) - try container.encodeIfPresent(disabledFillColor_inverted, forKey: .disabledFillColor_inverted) - try container.encodeIfPresent(disabledTextColor_inverted, forKey: .disabledTextColor_inverted) - try container.encodeIfPresent(disabledBorderColor_inverted, forKey: .disabledBorderColor_inverted) - } -} From 89499d59edb2ee10848de00e54de3103b0923fa3 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 5 May 2020 12:54:50 -0400 Subject: [PATCH 57/78] indicator changes --- .../Views/CarouselIndicator/BarsIndicatorView.swift | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift index 9b4ea3bc..ad65049d 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift @@ -42,19 +42,24 @@ open class BarsIndicatorView: CarouselIndicator { open override var isEnabled: Bool { didSet { - barReferences.forEach { view, _ in - view.backgroundColor = isEnabled ? indicatorColor : disabledIndicatorColor + + for (i, bar) in barReferences.enumerated() { + if i == currentIndex { + bar.view.backgroundColor = isEnabled ? currentIndicatorColor : disabledIndicatorColor + } else { + bar.view.backgroundColor = isEnabled ? indicatorColor : disabledIndicatorColor + } } } } /// Colors the currently selected index, unique from other indicators public var currentIndicatorColor: UIColor { - get { return barsCarouselIndicatorModel?.currentIndicatorColor.uiColor ?? .mvmBlack } + get { return barsCarouselIndicatorModel?.currentIndicatorColor.uiColor ?? indicatorColor } set (newColor) { barsCarouselIndicatorModel?.currentIndicatorColor = Color(uiColor: newColor) - if !barReferences.isEmpty { + if isEnabled && !barReferences.isEmpty { barReferences[currentIndex].view.backgroundColor = newColor } } From f7ba8da840ae656c12aee7e4b6392ab814c0cd6d Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 5 May 2020 13:00:26 -0400 Subject: [PATCH 58/78] enableable stuff --- .../Atoms/Views/CarouselIndicator/BarsIndicatorView.swift | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift index ad65049d..691dbfa0 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift @@ -42,7 +42,6 @@ open class BarsIndicatorView: CarouselIndicator { open override var isEnabled: Bool { didSet { - for (i, bar) in barReferences.enumerated() { if i == currentIndex { bar.view.backgroundColor = isEnabled ? currentIndicatorColor : disabledIndicatorColor @@ -70,8 +69,10 @@ open class BarsIndicatorView: CarouselIndicator { set (newColor) { super.indicatorColor = newColor - for (i, barTuple) in barReferences.enumerated() { - barTuple.view.backgroundColor = i == currentIndex ? currentIndicatorColor : newColor + if isEnabled { + for (i, barTuple) in barReferences.enumerated() { + barTuple.view.backgroundColor = i == currentIndex ? currentIndicatorColor : newColor + } } } } From 257420c3e444bb5181ac9a204911d2fbd9322c5e Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 5 May 2020 13:44:18 -0400 Subject: [PATCH 59/78] Reforming inversion --- .../Atomic/Atoms/Buttons/ButtonModel.swift | 76 +++++-------------- .../Atomic/Atoms/Buttons/PillButton.swift | 53 +++++++------ MVMCoreUI/Styles/Styler.swift | 15 ---- 3 files changed, 46 insertions(+), 98 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift index a7f679b5..939b0ece 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift @@ -11,6 +11,17 @@ import UIKit public typealias FacadeElements = (fill: UIColor?, text: UIColor?, border: UIColor?) +public enum ButtonStyle: String, Codable { + case primary + case secondary +} + +public enum ButtonSize: String, Codable { + case standard + case tiny +} + + public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupWatcherFieldProtocol { //-------------------------------------------------- // MARK: - Properties @@ -21,8 +32,8 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW public var title: String public var action: ActionModelProtocol public var enabled: Bool = true - public var style: Styler.Button? - public var size: Styler.Button.Size? = .standard + public var style: ButtonStyle? + public var size: ButtonSize? = .standard public var groupName: String = "" public var isInverted: Bool = false @@ -35,9 +46,6 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW text: disabled_textColor(), border: disabled_borderColor()) - public var backgroundColor_standard: Color? - public var backgroundColor_inverted: Color? - public var enabledFillColor: Color? public var enabledTextColor: Color? public var enabledBorderColor: Color? @@ -61,7 +69,7 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW // MARK: - Default Button Facades //-------------------------------------------------- /* - private var primaryFacade = Facade(enabledFillColor: .mvmBlack, + private var primaryFacade = Facade(enabledFillColor: , enabledTextColor: .mvmWhite, disabledFillColor: .mvmCoolGray6, disabledTextColor: .mvmWhite, @@ -122,10 +130,6 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW // MARK: - Methods //-------------------------------------------------- - public func backgroundColor() -> UIColor? { - return (isInverted ? backgroundColor_inverted : backgroundColor_standard)?.uiColor - } - public func getBorderWidth() -> CGFloat? { return isInverted ? borderWidth_inverted : borderWidth } @@ -170,21 +174,6 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW case size case facade case groupName - - case backgroundColor_standard - case backgroundColor_inverted - case enabledFillColor - case enabledTextColor - case enabledBorderColor - case enabledFillColor_inverted - case enabledTextColor_inverted - case enabledBorderColor_inverted - case disabledFillColor - case disabledTextColor - case disabledBorderColor - case disabledFillColor_inverted - case disabledTextColor_inverted - case disabledBorderColor_inverted } //-------------------------------------------------- @@ -198,11 +187,11 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW title = try typeContainer.decode(String.self, forKey: .title) action = try typeContainer.decodeModel(codingKey: .action) - if let style = try typeContainer.decodeIfPresent(Styler.Button.self, forKey: .style) { + if let style = try typeContainer.decodeIfPresent(ButtonStyle.self, forKey: .style) { self.style = style } - if let size = try typeContainer.decodeIfPresent(Styler.Button.Size.self, forKey: .size) { + if let size = try typeContainer.decodeIfPresent(ButtonSize.self, forKey: .size) { self.size = size } @@ -211,27 +200,12 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW } if let isInverted = try typeContainer.decodeIfPresent(Bool.self, forKey: .inverted) { - facade.isInverted = isInverted + self.isInverted = isInverted } if let groupName = try typeContainer.decodeIfPresent(String.self, forKey: .groupName) { self.groupName = groupName } - - backgroundColor_standard = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor_standard) - backgroundColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor_inverted) - enabledFillColor = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledFillColor) - enabledTextColor = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledTextColor) - enabledBorderColor = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledBorderColor) - enabledFillColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledFillColor_inverted) - enabledTextColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledTextColor_inverted) - enabledBorderColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledBorderColor_inverted) - disabledFillColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledFillColor) - disabledTextColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledTextColor) - disabledBorderColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledBorderColor) - disabledFillColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledFillColor_inverted) - disabledTextColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledTextColor_inverted) - disabledBorderColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledBorderColor_inverted) } public func encode(to encoder: Encoder) throws { @@ -240,25 +214,9 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW try container.encode(title, forKey: .title) try container.encode(enabled, forKey: .enabled) try container.encodeModel(action, forKey: .action) - try container.encodeIfPresent(facade, forKey: .facade) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) try container.encodeIfPresent(style, forKey: .style) try container.encodeIfPresent(size, forKey: .size) try container.encodeIfPresent(groupName, forKey: .groupName) - - try container.encodeIfPresent(backgroundColor_standard, forKey: .backgroundColor_standard) - try container.encodeIfPresent(backgroundColor_inverted, forKey: .backgroundColor_inverted) - try container.encodeIfPresent(enabledFillColor, forKey: .enabledFillColor) - try container.encodeIfPresent(enabledTextColor, forKey: .enabledTextColor) - try container.encodeIfPresent(enabledBorderColor, forKey: .enabledBorderColor) - try container.encodeIfPresent(enabledFillColor_inverted, forKey: .enabledFillColor_inverted) - try container.encodeIfPresent(enabledTextColor_inverted, forKey: .enabledTextColor_inverted) - try container.encodeIfPresent(enabledBorderColor_inverted, forKey: .enabledBorderColor_inverted) - try container.encodeIfPresent(disabledFillColor, forKey: .disabledFillColor) - try container.encodeIfPresent(disabledTextColor, forKey: .disabledTextColor) - try container.encodeIfPresent(disabledBorderColor, forKey: .disabledBorderColor) - try container.encodeIfPresent(disabledFillColor_inverted, forKey: .disabledFillColor_inverted) - try container.encodeIfPresent(disabledTextColor_inverted, forKey: .disabledTextColor_inverted) - try container.encodeIfPresent(disabledBorderColor_inverted, forKey: .disabledBorderColor_inverted) } } diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift index 210c6a43..e29af8b3 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift @@ -7,7 +7,7 @@ // import UIKit - + open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { //-------------------------------------------------- @@ -26,6 +26,11 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { didSet { style() } } + private enum ButtonHeight: CGFloat { + case tiny = 20 + case standard = 42 + } + //-------------------------------------------------- // MARK: - Computed Properties //-------------------------------------------------- @@ -55,20 +60,20 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { /// The primary styling for a button. Should be used for main buttons public func stylePrimary() { - enabledTitleColor = buttonModel?.facade.enabled.text ?? .mvmWhite - disabledTitleColor = buttonModel?.facade.disabled.text ?? .mvmWhite - layer.borderWidth = buttonModel?.facade.getBorderWidth() ?? 0 - backgroundColor = isEnabled ? buttonModel?.facade.enabled.fill ?? .mvmBlack : buttonModel?.facade.disabled.fill ?? .mvmCoolGray6 + enabledTitleColor = buttonModel?.enabledElements.text ?? .mvmWhite + disabledTitleColor = buttonModel?.disabledElements.text ?? .mvmWhite + layer.borderWidth = buttonModel?.getBorderWidth() ?? 0 + backgroundColor = isEnabled ? buttonModel?.enabledElements.fill ?? .mvmBlack : buttonModel?.disabledElements.fill ?? .mvmCoolGray6 } /// The secondary styling for a button. Should be used for secondary buttons public func styleSecondary() { - enabledTitleColor = buttonModel?.facade.enabled.text ?? .mvmBlack - disabledTitleColor = buttonModel?.facade.disabled.text ?? .mvmCoolGray6 + enabledTitleColor = buttonModel?.enabledElements.text ?? .mvmBlack + disabledTitleColor = buttonModel?.disabledElements.text ?? .mvmCoolGray6 backgroundColor = .clear - layer.borderWidth = buttonModel?.facade.getBorderWidth() ?? 1 - borderColor = isEnabled ? buttonModel?.facade.enabled.border ?? .mvmBlack : buttonModel?.facade.disabled.border ?? .mvmCoolGray6 + layer.borderWidth = buttonModel?.getBorderWidth() ?? 1 + borderColor = isEnabled ? buttonModel?.enabledElements.border ?? .mvmBlack : buttonModel?.disabledElements.border ?? .mvmCoolGray6 } /// Styles the button based on the model style @@ -82,30 +87,30 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { stylePrimary() } - if let titleColor = buttonModel?.facade.enabled.text { + if let titleColor = buttonModel?.enabledElements.text { enabledTitleColor = titleColor } - if let disabledTitleColor = buttonModel?.facade.disabled.text { + if let disabledTitleColor = buttonModel?.disabledElements.text { self.disabledTitleColor = disabledTitleColor } if isEnabled { - if let fillColor = buttonModel?.facade.enabled.fill { + if let fillColor = buttonModel?.enabledElements.fill { backgroundColor = fillColor } - if let borderColor = buttonModel?.facade.enabled.border { - layer.borderWidth = buttonModel?.facade.getBorderWidth() ?? 1 + if let borderColor = buttonModel?.enabledElements.border { + layer.borderWidth = buttonModel?.getBorderWidth() ?? 1 self.borderColor = borderColor } } else { - if let fillColor = buttonModel?.facade.disabled.fill { + if let fillColor = buttonModel?.disabledElements.fill { backgroundColor = fillColor } - if let borderColor = buttonModel?.facade.disabled.border { - layer.borderWidth = buttonModel?.facade.getBorderWidth() ?? 1 + if let borderColor = buttonModel?.disabledElements.border { + layer.borderWidth = buttonModel?.getBorderWidth() ?? 1 self.borderColor = borderColor } } @@ -119,18 +124,18 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { PillButton.getHeight(for: buttonModel?.size, size: size) } - public static func getHeight(for buttonSize: Styler.Button.Size?, size: CGFloat) -> CGFloat { + public static func getHeight(for buttonSize: ButtonSize?, size: CGFloat) -> CGFloat { switch buttonSize { case .tiny: - return MFSizeObject(standardSize: Styler.Button.Height.tiny.rawValue, + return MFSizeObject(standardSize: ButtonHeight.tiny.rawValue, standardiPadPortraitSize: 34, - iPadProLandscapeSize: 38)?.getValueBased(onSize: size) ?? Styler.Button.Height.tiny.rawValue + iPadProLandscapeSize: 38)?.getValueBased(onSize: size) ?? ButtonHeight.tiny.rawValue default: - return MFSizeObject(standardSize: Styler.Button.Height.standard.rawValue, + return MFSizeObject(standardSize: ButtonHeight.standard.rawValue, standardiPadPortraitSize: 46, - iPadProLandscapeSize: 50)?.getValueBased(onSize: size) ?? Styler.Button.Height.standard.rawValue + iPadProLandscapeSize: 50)?.getValueBased(onSize: size) ?? ButtonHeight.standard.rawValue } } @@ -184,10 +189,10 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { switch buttonModel?.size { case .tiny: - titleLabel?.font = MFFonts.mfFont75Bd(11 * (intrinsicContentSize.height / Styler.Button.Height.tiny.rawValue)) + titleLabel?.font = MFFonts.mfFont75Bd(11 * (intrinsicContentSize.height / ButtonHeight.tiny.rawValue)) default: - titleLabel?.font = MFFonts.mfFont75Bd(13 * (intrinsicContentSize.height / Styler.Button.Height.standard.rawValue)) + titleLabel?.font = MFFonts.mfFont75Bd(13 * (intrinsicContentSize.height / ButtonHeight.standard.rawValue)) } layer.cornerRadius = getInnerPadding() diff --git a/MVMCoreUI/Styles/Styler.swift b/MVMCoreUI/Styles/Styler.swift index c342b5a1..863d4703 100644 --- a/MVMCoreUI/Styles/Styler.swift +++ b/MVMCoreUI/Styles/Styler.swift @@ -172,21 +172,6 @@ open class Styler { } } - public enum Button: String, Codable { - case primary - case secondary - - public enum Size: String, Codable { - case standard - case tiny - } - - public enum Height: CGFloat { - case tiny = 20 - case standard = 42 - } - } - //-------------------------------------------------- // MARK: - Functions //-------------------------------------------------- From 1d43a40acb73834016c6105ab194ea51005af0b2 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 5 May 2020 14:20:50 -0400 Subject: [PATCH 60/78] removed duplicate --- MVMCoreUI/BaseClasses/ImageView.swift | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/MVMCoreUI/BaseClasses/ImageView.swift b/MVMCoreUI/BaseClasses/ImageView.swift index 2f0d47e1..b2707ec2 100644 --- a/MVMCoreUI/BaseClasses/ImageView.swift +++ b/MVMCoreUI/BaseClasses/ImageView.swift @@ -54,11 +54,7 @@ open class ImageView: UIImageView, ModelMoleculeViewProtocol { //-------------------------------------------------- // MARK: - ModelMoleculeViewProtocol //-------------------------------------------------- - - public func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable : Any]?) { - - } - + open func set(with model: MoleculeModelProtocol?, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { self.model = model if let backgroundColor = model?.backgroundColor { From c6c26874abdd693552c7b905b7be068905678040 Mon Sep 17 00:00:00 2001 From: "Pfeil, Scott Robert" Date: Tue, 5 May 2020 14:27:41 -0400 Subject: [PATCH 61/78] add initializer --- MVMCoreUI/Atomic/Atoms/Views/LoadImageView.swift | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/MVMCoreUI/Atomic/Atoms/Views/LoadImageView.swift b/MVMCoreUI/Atomic/Atoms/Views/LoadImageView.swift index ffa80ba3..a8d0ba9a 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/LoadImageView.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/LoadImageView.swift @@ -44,6 +44,10 @@ import UIKit super.init(frame: .zero) } + public override init(frame: CGRect) { + super.init(frame: frame) + } + public required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } From bcea1d4f253f8544b4df2f7dea12c25993e1a8d5 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 5 May 2020 14:31:54 -0400 Subject: [PATCH 62/78] renaming --- .../Views/CarouselIndicator/CarouselIndicator.swift | 12 ++++++------ .../CarouselIndicator/NumericIndicatorView.swift | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift index be3b3542..d1f12d85 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift @@ -197,7 +197,7 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { currentIndex = model.currentIndex isEnabled = model.enabled - adjustAccessibilityValue(of: currentIndex + 1, total: numberOfPages) + formatAccessibilityValue(index: currentIndex + 1, total: numberOfPages) } //-------------------------------------------------- @@ -206,15 +206,15 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { open override func accessibilityIncrement() { - accessibilityAdjust(toPage: currentIndex + 1) + adjustAccessibility(toPage: currentIndex + 1) } open override func accessibilityDecrement() { - accessibilityAdjust(toPage: currentIndex - 1) + adjustAccessibility(toPage: currentIndex - 1) } - func adjustAccessibilityValue(of index: Int, total: Int) { + func formatAccessibilityValue(index: Int, total: Int) { let ordinalFormatter = NumberFormatter() ordinalFormatter.numberStyle = .ordinal @@ -226,9 +226,9 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { accessibilityValue = String(format: accessibleFormat, accessibleIndex, total) } - func accessibilityAdjust(toPage index: Int) { + func adjustAccessibility(toPage index: Int) { - adjustAccessibilityValue(of: index, total: numberOfPages) + formatAccessibilityValue(index: index, total: numberOfPages) if (index < numberOfPages && index >= 0) || carouselIndicatorModel?.alwaysSendAction ?? false { carouselIndicatorModel?.animated = false diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift index 8660968d..3585be05 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift @@ -120,7 +120,7 @@ open class NumericIndicatorView: CarouselIndicator { open override func updateUI(previousIndex oldIndex: Int, newIndex: Int, totalCount: Int, isAnimated: Bool) { pageCount.text = "\(newIndex + 1)/\(totalCount)" - adjustAccessibilityValue(of: newIndex + 1, total: totalCount) + formatAccessibilityValue(index: newIndex + 1, total: totalCount) layoutIfNeeded() } } From 51b1b9da12149cb597af3d73c1de070006158884 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 5 May 2020 14:52:02 -0400 Subject: [PATCH 63/78] change --- MVMCoreUI/BaseClasses/ImageView.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MVMCoreUI/BaseClasses/ImageView.swift b/MVMCoreUI/BaseClasses/ImageView.swift index b2707ec2..aa004d27 100644 --- a/MVMCoreUI/BaseClasses/ImageView.swift +++ b/MVMCoreUI/BaseClasses/ImageView.swift @@ -54,8 +54,8 @@ open class ImageView: UIImageView, ModelMoleculeViewProtocol { //-------------------------------------------------- // MARK: - ModelMoleculeViewProtocol //-------------------------------------------------- - - open func set(with model: MoleculeModelProtocol?, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { + + public func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable : Any]?) { self.model = model if let backgroundColor = model?.backgroundColor { self.backgroundColor = backgroundColor.uiColor From c141f5968508aa2368f90a7b67a439d7f48f6e89 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Wed, 6 May 2020 10:04:39 -0400 Subject: [PATCH 64/78] encode fix --- MVMCoreUI/BaseClasses/TextViewModel.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/MVMCoreUI/BaseClasses/TextViewModel.swift b/MVMCoreUI/BaseClasses/TextViewModel.swift index 49ac664c..d9505275 100644 --- a/MVMCoreUI/BaseClasses/TextViewModel.swift +++ b/MVMCoreUI/BaseClasses/TextViewModel.swift @@ -81,6 +81,7 @@ open class TextViewModel: TextEntryFieldModel { } public override func encode(to encoder: Encoder) throws { + try super.encode(to: encoder) var container = encoder.container(keyedBy: CodingKeys.self) try container.encodeIfPresent(accessibilityText, forKey: .accessibilityText) try container.encodeIfPresent(height, forKey: .height) From e43ad863a481dc601d04befc73cb4694c6e29dcb Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Wed, 6 May 2020 14:14:09 -0400 Subject: [PATCH 65/78] latest changes with inversion --- .../Atomic/Atoms/Buttons/ButtonModel.swift | 96 ++++++++++--------- .../Atomic/Atoms/Buttons/PillButton.swift | 56 +++++------ .../TwoButtonView.swift | 20 ++-- .../TwoButtonViewModel.swift | 5 +- MVMCoreUI/Styles/Styler.swift | 23 +++++ 5 files changed, 115 insertions(+), 85 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift index 939b0ece..49149026 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift @@ -11,17 +11,6 @@ import UIKit public typealias FacadeElements = (fill: UIColor?, text: UIColor?, border: UIColor?) -public enum ButtonStyle: String, Codable { - case primary - case secondary -} - -public enum ButtonSize: String, Codable { - case standard - case tiny -} - - public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupWatcherFieldProtocol { //-------------------------------------------------- // MARK: - Properties @@ -32,19 +21,29 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW public var title: String public var action: ActionModelProtocol public var enabled: Bool = true - public var style: ButtonStyle? - public var size: ButtonSize? = .standard + public var style: Styler.Button.Style? { + didSet { + guard let style = style else { return } + switch style { + case .primary: + setPrimaryFacade() + + case .secondary: + setSecondaryFacade() + } + } + } + public var size: Styler.Button.Size? = .standard public var groupName: String = "" - public var isInverted: Bool = false - public lazy var enabledElements: FacadeElements = (fill: enabled_fillColor(), - text: enabled_textColor(), - border: enabled_borderColor()) + public lazy var enabledColors: FacadeElements = (fill: enabled_fillColor(), + text: enabled_textColor(), + border: enabled_borderColor()) - public lazy var disabledElements: FacadeElements = (fill: disabled_fillColor(), - text: disabled_textColor(), - border: disabled_borderColor()) + public lazy var disabledColors: FacadeElements = (fill: disabled_fillColor(), + text: disabled_textColor(), + border: disabled_borderColor()) public var enabledFillColor: Color? public var enabledTextColor: Color? @@ -68,31 +67,8 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW //-------------------------------------------------- // MARK: - Default Button Facades //-------------------------------------------------- - /* - private var primaryFacade = Facade(enabledFillColor: , - enabledTextColor: .mvmWhite, - disabledFillColor: .mvmCoolGray6, - disabledTextColor: .mvmWhite, - enabledFillColor_inverted: .mvmWhite, - enabledTextColor_inverted: .mvmBlack, - disabledFillColor_inverted: .mvmCoolGray6, - disabledTextColor_inverted: .mvmBlack, - borderWidth: 0) - private var secondaryFacade = Facade(enabledFillColor: .mvmWhite, - enabledTextColor: .mvmBlack, - enabledBorderColor: .mvmBlack, - disabledFillColor: .mvmWhite, - disabledTextColor: .mvmCoolGray6, - disabledBorderColor: .mvmCoolGray6, - enabledFillColor_inverted: .mvmBlack, - enabledTextColor_inverted: .mvmWhite, - enabledBorderColor_inverted: .mvmWhite, - disabledFillColor_inverted: .mvmWhite, - disabledTextColor_inverted: .mvmCoolGray6, - disabledBorderColor_inverted: .mvmCoolGray6, - borderWidth: 1) - */ + //-------------------------------------------------- // MARK: - Methods //-------------------------------------------------- @@ -158,6 +134,33 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW return (isInverted ? disabledBorderColor_inverted : disabledBorderColor)?.uiColor } + /// Defines the default appearance for the primary style. + func setPrimaryFacade() { + + enabledFillColor = Color(uiColor: .mvmBlack) + enabledTextColor = Color(uiColor: .mvmWhite) + disabledFillColor = Color(uiColor: .mvmCoolGray6) + disabledTextColor = Color(uiColor: .mvmWhite) + enabledFillColor_inverted = Color(uiColor: .mvmWhite) + enabledTextColor_inverted = Color(uiColor: .mvmBlack) + disabledFillColor_inverted = Color(uiColor: .mvmCoolGray6) + disabledTextColor_inverted = Color(uiColor: .mvmBlack) + borderWidth = 0 + } + + /// Defines the default appearance for the Secondary style. + func setSecondaryFacade() { + + enabledTextColor = Color(uiColor: .mvmBlack) + enabledBorderColor = Color(uiColor: .mvmBlack) + disabledTextColor = Color(uiColor: .mvmCoolGray6) + disabledBorderColor = Color(uiColor: .mvmCoolGray6) + enabledTextColor_inverted = Color(uiColor: .mvmWhite) + enabledBorderColor_inverted = Color(uiColor: .mvmWhite) + disabledTextColor_inverted = Color(uiColor: .mvmCoolGray6) + disabledBorderColor_inverted = Color(uiColor: .mvmCoolGray6) + borderWidth = 1 + } //-------------------------------------------------- // MARK: - Keys @@ -187,11 +190,11 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW title = try typeContainer.decode(String.self, forKey: .title) action = try typeContainer.decodeModel(codingKey: .action) - if let style = try typeContainer.decodeIfPresent(ButtonStyle.self, forKey: .style) { + if let style = try typeContainer.decodeIfPresent(Styler.Button.Style.self, forKey: .style) { self.style = style } - if let size = try typeContainer.decodeIfPresent(ButtonSize.self, forKey: .size) { + if let size = try typeContainer.decodeIfPresent(Styler.Button.Size.self, forKey: .size) { self.size = size } @@ -213,6 +216,7 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW try container.encode(moleculeName, forKey: .moleculeName) try container.encode(title, forKey: .title) try container.encode(enabled, forKey: .enabled) + try container.encode(isInverted, forKey: .inverted) try container.encodeModel(action, forKey: .action) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) try container.encodeIfPresent(style, forKey: .style) diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift index e29af8b3..1cfa59f7 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift @@ -7,7 +7,7 @@ // import UIKit - + open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { //-------------------------------------------------- @@ -26,11 +26,6 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { didSet { style() } } - private enum ButtonHeight: CGFloat { - case tiny = 20 - case standard = 42 - } - //-------------------------------------------------- // MARK: - Computed Properties //-------------------------------------------------- @@ -60,20 +55,22 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { /// The primary styling for a button. Should be used for main buttons public func stylePrimary() { - enabledTitleColor = buttonModel?.enabledElements.text ?? .mvmWhite - disabledTitleColor = buttonModel?.disabledElements.text ?? .mvmWhite + buttonModel?.style = .primary + enabledTitleColor = buttonModel?.enabledColors.text ?? .mvmWhite + disabledTitleColor = buttonModel?.disabledColors.text ?? .mvmWhite layer.borderWidth = buttonModel?.getBorderWidth() ?? 0 - backgroundColor = isEnabled ? buttonModel?.enabledElements.fill ?? .mvmBlack : buttonModel?.disabledElements.fill ?? .mvmCoolGray6 + backgroundColor = isEnabled ? buttonModel?.enabledColors.fill ?? .mvmBlack : buttonModel?.disabledColors.fill ?? .mvmCoolGray6 } /// The secondary styling for a button. Should be used for secondary buttons public func styleSecondary() { - enabledTitleColor = buttonModel?.enabledElements.text ?? .mvmBlack - disabledTitleColor = buttonModel?.disabledElements.text ?? .mvmCoolGray6 + buttonModel?.style = .secondary + enabledTitleColor = buttonModel?.enabledColors.text ?? .mvmBlack + disabledTitleColor = buttonModel?.disabledColors.text ?? .mvmCoolGray6 backgroundColor = .clear layer.borderWidth = buttonModel?.getBorderWidth() ?? 1 - borderColor = isEnabled ? buttonModel?.enabledElements.border ?? .mvmBlack : buttonModel?.disabledElements.border ?? .mvmCoolGray6 + borderColor = isEnabled ? buttonModel?.enabledColors.border ?? .mvmBlack : buttonModel?.disabledColors.border ?? .mvmCoolGray6 } /// Styles the button based on the model style @@ -87,29 +84,29 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { stylePrimary() } - if let titleColor = buttonModel?.enabledElements.text { + if let titleColor = buttonModel?.enabledColors.text { enabledTitleColor = titleColor } - if let disabledTitleColor = buttonModel?.disabledElements.text { + if let disabledTitleColor = buttonModel?.disabledColors.text { self.disabledTitleColor = disabledTitleColor } if isEnabled { - if let fillColor = buttonModel?.enabledElements.fill { + if let fillColor = buttonModel?.enabledColors.fill { backgroundColor = fillColor } - if let borderColor = buttonModel?.enabledElements.border { + if let borderColor = buttonModel?.enabledColors.border { layer.borderWidth = buttonModel?.getBorderWidth() ?? 1 self.borderColor = borderColor } } else { - if let fillColor = buttonModel?.disabledElements.fill { + if let fillColor = buttonModel?.disabledColors.fill { backgroundColor = fillColor } - if let borderColor = buttonModel?.disabledElements.border { + if let borderColor = buttonModel?.disabledColors.border { layer.borderWidth = buttonModel?.getBorderWidth() ?? 1 self.borderColor = borderColor } @@ -124,18 +121,20 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { PillButton.getHeight(for: buttonModel?.size, size: size) } - public static func getHeight(for buttonSize: ButtonSize?, size: CGFloat) -> CGFloat { + public static func getHeight(for buttonSize: Styler.Button.Size?, size: CGFloat) -> CGFloat { switch buttonSize { case .tiny: - return MFSizeObject(standardSize: ButtonHeight.tiny.rawValue, + let tinyHeight = Styler.Button.Size.tiny.getHeight() + return MFSizeObject(standardSize: tinyHeight, standardiPadPortraitSize: 34, - iPadProLandscapeSize: 38)?.getValueBased(onSize: size) ?? ButtonHeight.tiny.rawValue + iPadProLandscapeSize: 38)?.getValueBased(onSize: size) ?? tinyHeight default: - return MFSizeObject(standardSize: ButtonHeight.standard.rawValue, + let standardHeight = Styler.Button.Size.standard.getHeight() + return MFSizeObject(standardSize: standardHeight, standardiPadPortraitSize: 46, - iPadProLandscapeSize: 50)?.getValueBased(onSize: size) ?? ButtonHeight.standard.rawValue + iPadProLandscapeSize: 50)?.getValueBased(onSize: size) ?? standardHeight } } @@ -143,10 +142,11 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { switch buttonModel?.size { case .tiny: - return MFSizeObject(standardSize: 49, standardiPadPortraitSize: 90, iPadProLandscapeSize: 135)?.getValueBased(onSize: size) ?? 49 + return MFSizeObject(standardSize: 49, + standardiPadPortraitSize: 90, + iPadProLandscapeSize: 135)?.getValueBased(onSize: size) ?? 49 - default: - return 151 + default: return 151 } } @@ -189,10 +189,10 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { switch buttonModel?.size { case .tiny: - titleLabel?.font = MFFonts.mfFont75Bd(11 * (intrinsicContentSize.height / ButtonHeight.tiny.rawValue)) + titleLabel?.font = MFFonts.mfFont75Bd(11 * (intrinsicContentSize.height / Styler.Button.Size.tiny.getHeight())) default: - titleLabel?.font = MFFonts.mfFont75Bd(13 * (intrinsicContentSize.height / ButtonHeight.standard.rawValue)) + titleLabel?.font = MFFonts.mfFont75Bd(13 * (intrinsicContentSize.height / Styler.Button.Size.standard.getHeight())) } layer.cornerRadius = getInnerPadding() diff --git a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonView.swift b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonView.swift index c8a97136..31420e56 100644 --- a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonView.swift +++ b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonView.swift @@ -43,15 +43,17 @@ import UIKit // MARK: - Lifecycle //-------------------------------------------------- - public func setDefault() { + public func setDefaultAppearance() { + primaryButton.stylePrimary() secondaryButton.styleSecondary() } open override func updateView(_ size: CGFloat) { super.updateView(size) - self.primaryButton.updateView(size) - self.secondaryButton.updateView(size) + + primaryButton.updateView(size) + secondaryButton.updateView(size) } open override func setupView() { @@ -71,7 +73,7 @@ import UIKit //-------------------------------------------------- // MARK: - Stack Manipulation //-------------------------------------------------- - + public func showPrimaryButton() { if !stack.arrangedSubviews.contains(primaryButton) { @@ -119,13 +121,15 @@ import UIKit //-------------------------------------------------- // MARK: - MoleculeViewProtocol //-------------------------------------------------- - + open override func reset() { super.reset() - setDefault() + + setDefaultAppearance() } public override class func estimatedHeight(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?) -> CGFloat? { + guard let model = model as? TwoButtonViewModel, let buttonModel = model.primaryButton ?? model.secondaryButton else { return 0 } @@ -140,7 +144,6 @@ import UIKit if let secondaryModel = model.secondaryButton { showSecondaryButton() - secondaryModel.style = .secondary secondaryButton.set(with: secondaryModel, delegateObject, additionalData) } else { hideSecondaryButton() @@ -148,7 +151,6 @@ import UIKit if let primaryModel = model.primaryButton { showPrimaryButton() - primaryModel.style = .primary primaryButton.set(with: primaryModel, delegateObject, additionalData) } else { hidePrimaryButton() @@ -157,7 +159,7 @@ import UIKit //-------------------------------------------------- // MARK: - MVMCoreUIViewConstrainingProtocol //-------------------------------------------------- - + open func horizontalAlignment() -> UIStackView.Alignment { return .center } diff --git a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonViewModel.swift b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonViewModel.swift index 4e0c8363..da7663c6 100644 --- a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonViewModel.swift +++ b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonViewModel.swift @@ -29,7 +29,7 @@ public class TwoButtonViewModel: MoleculeModelProtocol { case primaryButton case secondaryButton } - + //-------------------------------------------------- // MARK: - Initialzer //-------------------------------------------------- @@ -47,10 +47,11 @@ public class TwoButtonViewModel: MoleculeModelProtocol { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) primaryButton = try typeContainer.decodeIfPresent(ButtonModel.self, forKey: .primaryButton) + primaryButton?.style = .primary secondaryButton = try typeContainer.decodeIfPresent(ButtonModel.self, forKey: .secondaryButton) secondaryButton?.style = .secondary } - + public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(moleculeName, forKey: .moleculeName) diff --git a/MVMCoreUI/Styles/Styler.swift b/MVMCoreUI/Styles/Styler.swift index 863d4703..d8d0a519 100644 --- a/MVMCoreUI/Styles/Styler.swift +++ b/MVMCoreUI/Styles/Styler.swift @@ -172,6 +172,29 @@ open class Styler { } } + public enum Button { + + public enum Style: String, Codable { + case primary + case secondary + } + + public enum Size: String, Codable { + case standard + case tiny + + func getHeight() -> CGFloat { + switch self { + case .standard: + return 42 + + case .tiny: + return 20 + } + } + } + } + //-------------------------------------------------- // MARK: - Functions //-------------------------------------------------- From 39f7c4c6f4f6b900ebab19fe68708ab17e2ad334 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Wed, 6 May 2020 14:41:18 -0400 Subject: [PATCH 66/78] reverting border width --- MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift | 11 +---------- MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift | 8 ++++---- 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift index 49149026..714a343b 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift @@ -61,9 +61,6 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW public var disabledTextColor_inverted: Color? public var disabledBorderColor_inverted: Color? - public var borderWidth: CGFloat? - public var borderWidth_inverted: CGFloat? - //-------------------------------------------------- // MARK: - Default Button Facades //-------------------------------------------------- @@ -105,11 +102,7 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW //-------------------------------------------------- // MARK: - Methods //-------------------------------------------------- - - public func getBorderWidth() -> CGFloat? { - return isInverted ? borderWidth_inverted : borderWidth - } - + public func enabled_fillColor() -> UIColor? { return (isInverted ? enabledFillColor_inverted : enabledFillColor)?.uiColor } @@ -145,7 +138,6 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW enabledTextColor_inverted = Color(uiColor: .mvmBlack) disabledFillColor_inverted = Color(uiColor: .mvmCoolGray6) disabledTextColor_inverted = Color(uiColor: .mvmBlack) - borderWidth = 0 } /// Defines the default appearance for the Secondary style. @@ -159,7 +151,6 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW enabledBorderColor_inverted = Color(uiColor: .mvmWhite) disabledTextColor_inverted = Color(uiColor: .mvmCoolGray6) disabledBorderColor_inverted = Color(uiColor: .mvmCoolGray6) - borderWidth = 1 } //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift index 1cfa59f7..5fe7a972 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift @@ -58,7 +58,7 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { buttonModel?.style = .primary enabledTitleColor = buttonModel?.enabledColors.text ?? .mvmWhite disabledTitleColor = buttonModel?.disabledColors.text ?? .mvmWhite - layer.borderWidth = buttonModel?.getBorderWidth() ?? 0 + layer.borderWidth = 0 backgroundColor = isEnabled ? buttonModel?.enabledColors.fill ?? .mvmBlack : buttonModel?.disabledColors.fill ?? .mvmCoolGray6 } @@ -69,7 +69,7 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { enabledTitleColor = buttonModel?.enabledColors.text ?? .mvmBlack disabledTitleColor = buttonModel?.disabledColors.text ?? .mvmCoolGray6 backgroundColor = .clear - layer.borderWidth = buttonModel?.getBorderWidth() ?? 1 + layer.borderWidth = 1 borderColor = isEnabled ? buttonModel?.enabledColors.border ?? .mvmBlack : buttonModel?.disabledColors.border ?? .mvmCoolGray6 } @@ -98,7 +98,7 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { } if let borderColor = buttonModel?.enabledColors.border { - layer.borderWidth = buttonModel?.getBorderWidth() ?? 1 + layer.borderWidth = 1 self.borderColor = borderColor } } else { @@ -107,7 +107,7 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { } if let borderColor = buttonModel?.disabledColors.border { - layer.borderWidth = buttonModel?.getBorderWidth() ?? 1 + layer.borderWidth = 1 self.borderColor = borderColor } } From 876ec4597df64fc441953530a9033d8fe0d96efc Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Wed, 6 May 2020 14:56:13 -0400 Subject: [PATCH 67/78] for custom colors --- .../Atomic/Atoms/Buttons/ButtonModel.swift | 50 ++++++++++++++----- 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift index 714a343b..e697c045 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift @@ -61,11 +61,6 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW public var disabledTextColor_inverted: Color? public var disabledBorderColor_inverted: Color? - //-------------------------------------------------- - // MARK: - Default Button Facades - //-------------------------------------------------- - - //-------------------------------------------------- // MARK: - Methods //-------------------------------------------------- @@ -130,10 +125,15 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW /// Defines the default appearance for the primary style. func setPrimaryFacade() { - enabledFillColor = Color(uiColor: .mvmBlack) - enabledTextColor = Color(uiColor: .mvmWhite) - disabledFillColor = Color(uiColor: .mvmCoolGray6) - disabledTextColor = Color(uiColor: .mvmWhite) + if enabledFillColor == nil && enabledTextColor == nil { + enabledFillColor = Color(uiColor: .mvmBlack) + enabledTextColor = Color(uiColor: .mvmWhite) + } + + if disabledFillColor == nil && disabledTextColor == nil { + disabledFillColor = Color(uiColor: .mvmCoolGray6) + disabledTextColor = Color(uiColor: .mvmWhite) + } enabledFillColor_inverted = Color(uiColor: .mvmWhite) enabledTextColor_inverted = Color(uiColor: .mvmBlack) disabledFillColor_inverted = Color(uiColor: .mvmCoolGray6) @@ -143,10 +143,15 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW /// Defines the default appearance for the Secondary style. func setSecondaryFacade() { - enabledTextColor = Color(uiColor: .mvmBlack) - enabledBorderColor = Color(uiColor: .mvmBlack) - disabledTextColor = Color(uiColor: .mvmCoolGray6) - disabledBorderColor = Color(uiColor: .mvmCoolGray6) + if enabledTextColor == nil && enabledBorderColor == nil { + enabledTextColor = Color(uiColor: .mvmBlack) + enabledBorderColor = Color(uiColor: .mvmBlack) + } + + if disabledTextColor == nil && disabledBorderColor == nil { + disabledTextColor = Color(uiColor: .mvmCoolGray6) + disabledBorderColor = Color(uiColor: .mvmCoolGray6) + } enabledTextColor_inverted = Color(uiColor: .mvmWhite) enabledBorderColor_inverted = Color(uiColor: .mvmWhite) disabledTextColor_inverted = Color(uiColor: .mvmCoolGray6) @@ -168,6 +173,12 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW case size case facade case groupName + case fillColor + case textColor + case borderColor + case disabledFillColor + case disabledTextColor + case disabledBorderColor } //-------------------------------------------------- @@ -200,6 +211,13 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW if let groupName = try typeContainer.decodeIfPresent(String.self, forKey: .groupName) { self.groupName = groupName } + + enabledFillColor = try typeContainer.decodeIfPresent(Color.self, forKey: .fillColor) + enabledTextColor = try typeContainer.decodeIfPresent(Color.self, forKey: .textColor) + enabledBorderColor = try typeContainer.decodeIfPresent(Color.self, forKey: .borderColor) + disabledFillColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledFillColor) + disabledTextColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledTextColor) + disabledBorderColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledBorderColor) } public func encode(to encoder: Encoder) throws { @@ -210,6 +228,12 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW try container.encode(isInverted, forKey: .inverted) try container.encodeModel(action, forKey: .action) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) + try container.encodeIfPresent(enabledFillColor, forKey: .fillColor) + try container.encodeIfPresent(enabledTextColor, forKey: .textColor) + try container.encodeIfPresent(enabledBorderColor, forKey: .borderColor) + try container.encodeIfPresent(disabledFillColor, forKey: .disabledFillColor) + try container.encodeIfPresent(disabledTextColor, forKey: .disabledTextColor) + try container.encodeIfPresent(disabledBorderColor, forKey: .disabledBorderColor) try container.encodeIfPresent(style, forKey: .style) try container.encodeIfPresent(size, forKey: .size) try container.encodeIfPresent(groupName, forKey: .groupName) From cdfd2942ff9f328236860869c9c887f26faac930 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Wed, 6 May 2020 15:12:31 -0400 Subject: [PATCH 68/78] removeing --- MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift | 1 - .../Protocols/ModelProtocols/MoleculeModelProtocol.swift | 6 ------ 2 files changed, 7 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift index e697c045..5567c540 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift @@ -171,7 +171,6 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW case enabled case style case size - case facade case groupName case fillColor case textColor diff --git a/MVMCoreUI/Atomic/Protocols/ModelProtocols/MoleculeModelProtocol.swift b/MVMCoreUI/Atomic/Protocols/ModelProtocols/MoleculeModelProtocol.swift index f4d528f5..dda19b35 100644 --- a/MVMCoreUI/Atomic/Protocols/ModelProtocols/MoleculeModelProtocol.swift +++ b/MVMCoreUI/Atomic/Protocols/ModelProtocols/MoleculeModelProtocol.swift @@ -9,7 +9,6 @@ public enum MolecularError: Swift.Error { public protocol MoleculeModelProtocol: ModelProtocol { var moleculeName: String { get } - var isInverted: Bool { get set } var backgroundColor: Color? { get set } } @@ -26,9 +25,4 @@ public extension MoleculeModelProtocol { static var categoryCodingKey: String { return "moleculeName" } - - var isInverted: Bool { - get { return false } - set { } - } } From 1f18436f58174decc2dedb5196a215c570cd4b73 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Wed, 6 May 2020 15:19:57 -0400 Subject: [PATCH 69/78] reverting --- .../HorizontalCombinationViews/TwoButtonViewModel.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonViewModel.swift b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonViewModel.swift index da7663c6..f9e7bce8 100644 --- a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonViewModel.swift +++ b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonViewModel.swift @@ -49,7 +49,9 @@ public class TwoButtonViewModel: MoleculeModelProtocol { primaryButton = try typeContainer.decodeIfPresent(ButtonModel.self, forKey: .primaryButton) primaryButton?.style = .primary secondaryButton = try typeContainer.decodeIfPresent(ButtonModel.self, forKey: .secondaryButton) - secondaryButton?.style = .secondary + if secondaryButton?.style == nil { + secondaryButton?.style = .secondary + } } public func encode(to encoder: Encoder) throws { From 9e9984a8c5c6f51b3ed84e7c77db96126db688fc Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Wed, 6 May 2020 15:25:32 -0400 Subject: [PATCH 70/78] adding check for primary --- .../HorizontalCombinationViews/TwoButtonViewModel.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonViewModel.swift b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonViewModel.swift index f9e7bce8..d4da0ba4 100644 --- a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonViewModel.swift +++ b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonViewModel.swift @@ -47,7 +47,9 @@ public class TwoButtonViewModel: MoleculeModelProtocol { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) primaryButton = try typeContainer.decodeIfPresent(ButtonModel.self, forKey: .primaryButton) - primaryButton?.style = .primary + if primaryButton?.style == nil { + primaryButton?.style = .primary + } secondaryButton = try typeContainer.decodeIfPresent(ButtonModel.self, forKey: .secondaryButton) if secondaryButton?.style == nil { secondaryButton?.style = .secondary From e4911a8ccea4794f553fcec508857a91f84bb896 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Wed, 6 May 2020 16:31:45 -0400 Subject: [PATCH 71/78] more changes for inverted --- .../Atomic/Atoms/Buttons/ButtonModel.swift | 53 +++++++++++++------ .../Atomic/Atoms/Buttons/PillButton.swift | 6 +-- 2 files changed, 38 insertions(+), 21 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift index 5567c540..601a8fb2 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift @@ -35,7 +35,7 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW } public var size: Styler.Button.Size? = .standard public var groupName: String = "" - public var isInverted: Bool = false + public var inverted: Bool = false public lazy var enabledColors: FacadeElements = (fill: enabled_fillColor(), text: enabled_textColor(), @@ -97,29 +97,29 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW //-------------------------------------------------- // MARK: - Methods //-------------------------------------------------- - + public func enabled_fillColor() -> UIColor? { - return (isInverted ? enabledFillColor_inverted : enabledFillColor)?.uiColor + return (inverted ? enabledFillColor_inverted : enabledFillColor)?.uiColor } public func enabled_textColor() -> UIColor? { - return (isInverted ? enabledTextColor_inverted : enabledTextColor)?.uiColor + return (inverted ? enabledTextColor_inverted : enabledTextColor)?.uiColor } public func enabled_borderColor() -> UIColor? { - return (isInverted ? enabledBorderColor_inverted : enabledBorderColor)?.uiColor + return (inverted ? enabledBorderColor_inverted : enabledBorderColor)?.uiColor } public func disabled_fillColor() -> UIColor? { - return (isInverted ? disabledFillColor_inverted : disabledFillColor)?.uiColor + return (inverted ? disabledFillColor_inverted : disabledFillColor)?.uiColor } public func disabled_textColor() -> UIColor? { - return (isInverted ? disabledTextColor_inverted : disabledTextColor)?.uiColor + return (inverted ? disabledTextColor_inverted : disabledTextColor)?.uiColor } public func disabled_borderColor() -> UIColor? { - return (isInverted ? disabledBorderColor_inverted : disabledBorderColor)?.uiColor + return (inverted ? disabledBorderColor_inverted : disabledBorderColor)?.uiColor } /// Defines the default appearance for the primary style. @@ -134,6 +134,7 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW disabledFillColor = Color(uiColor: .mvmCoolGray6) disabledTextColor = Color(uiColor: .mvmWhite) } + enabledFillColor_inverted = Color(uiColor: .mvmWhite) enabledTextColor_inverted = Color(uiColor: .mvmBlack) disabledFillColor_inverted = Color(uiColor: .mvmCoolGray6) @@ -152,6 +153,7 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW disabledTextColor = Color(uiColor: .mvmCoolGray6) disabledBorderColor = Color(uiColor: .mvmCoolGray6) } + enabledTextColor_inverted = Color(uiColor: .mvmWhite) enabledBorderColor_inverted = Color(uiColor: .mvmWhite) disabledTextColor_inverted = Color(uiColor: .mvmCoolGray6) @@ -203,20 +205,37 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW self.enabled = enabled } - if let isInverted = try typeContainer.decodeIfPresent(Bool.self, forKey: .inverted) { - self.isInverted = isInverted + if let inverted = try typeContainer.decodeIfPresent(Bool.self, forKey: .inverted) { + self.inverted = inverted } if let groupName = try typeContainer.decodeIfPresent(String.self, forKey: .groupName) { self.groupName = groupName } - enabledFillColor = try typeContainer.decodeIfPresent(Color.self, forKey: .fillColor) - enabledTextColor = try typeContainer.decodeIfPresent(Color.self, forKey: .textColor) - enabledBorderColor = try typeContainer.decodeIfPresent(Color.self, forKey: .borderColor) - disabledFillColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledFillColor) - disabledTextColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledTextColor) - disabledBorderColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledBorderColor) + if let enabledFillColor = try typeContainer.decodeIfPresent(Color.self, forKey: .fillColor) { + self.enabledFillColor = enabledFillColor + } + + if let enabledTextColor = try typeContainer.decodeIfPresent(Color.self, forKey: .textColor) { + self.enabledTextColor = enabledTextColor + } + + if let enabledBorderColor = try typeContainer.decodeIfPresent(Color.self, forKey: .borderColor) { + self.enabledBorderColor = enabledBorderColor + } + + if let disabledFillColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledFillColor) { + self.disabledFillColor = disabledFillColor + } + + if let disabledTextColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledTextColor) { + self.disabledTextColor = disabledTextColor + } + + if let disabledBorderColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledBorderColor) { + self.disabledBorderColor = disabledBorderColor + } } public func encode(to encoder: Encoder) throws { @@ -224,7 +243,7 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW try container.encode(moleculeName, forKey: .moleculeName) try container.encode(title, forKey: .title) try container.encode(enabled, forKey: .enabled) - try container.encode(isInverted, forKey: .inverted) + try container.encode(inverted, forKey: .inverted) try container.encodeModel(action, forKey: .action) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) try container.encodeIfPresent(enabledFillColor, forKey: .fillColor) diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift index 5fe7a972..745a34f4 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift @@ -45,7 +45,7 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { guard let currentColor = layer.borderColor else { return nil } return UIColor(cgColor: currentColor) } - set { layer.borderColor = newValue?.cgColor} + set { layer.borderColor = newValue?.cgColor } } //-------------------------------------------------- @@ -55,7 +55,6 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { /// The primary styling for a button. Should be used for main buttons public func stylePrimary() { - buttonModel?.style = .primary enabledTitleColor = buttonModel?.enabledColors.text ?? .mvmWhite disabledTitleColor = buttonModel?.disabledColors.text ?? .mvmWhite layer.borderWidth = 0 @@ -65,7 +64,6 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { /// The secondary styling for a button. Should be used for secondary buttons public func styleSecondary() { - buttonModel?.style = .secondary enabledTitleColor = buttonModel?.enabledColors.text ?? .mvmBlack disabledTitleColor = buttonModel?.disabledColors.text ?? .mvmCoolGray6 backgroundColor = .clear @@ -114,7 +112,7 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { } private func getInnerPadding() -> CGFloat { - return getHeight() / 2 + return getHeight() / 2.0 } private func getHeight() -> CGFloat { From 0501c2daae7bdd554a4b641b74381fbec775cb7b Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Thu, 7 May 2020 10:38:10 -0400 Subject: [PATCH 72/78] correcting layout issue --- .../Views/CarouselIndicator/BarsIndicatorView.swift | 12 ++++++++++++ .../CarouselIndicator/NumericIndicatorView.swift | 11 +++++++++++ MVMCoreUI/Atomic/Organisms/Carousel.swift | 13 +++++-------- .../Atomic/Protocols/MoleculeViewProtocol.swift | 4 ++-- 4 files changed, 30 insertions(+), 10 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift index 691dbfa0..039ece9d 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift @@ -98,6 +98,18 @@ open class BarsIndicatorView: CarouselIndicator { ]) } + open override func layoutSubviews() { + super.layoutSubviews() + + if barReferences.isEmpty { + generateBars() + updateUI(previousIndex: previousIndex, + newIndex: currentIndex, + totalCount: numberOfPages, + isAnimated: false) + } + } + //-------------------------------------------------- // MARK: - Methods //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift index 3585be05..b4991d1e 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift @@ -66,6 +66,17 @@ open class NumericIndicatorView: CarouselIndicator { pageCount.updateView(size) } + open override func layoutSubviews() { + super.layoutSubviews() + + if pageCount.text?.isEmpty == nil { + updateUI(previousIndex: previousIndex, + newIndex: currentIndex, + totalCount: numberOfPages, + isAnimated: false) + } + } + //-------------------------------------------------- // MARK: - Setup //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Organisms/Carousel.swift b/MVMCoreUI/Atomic/Organisms/Carousel.swift index 5fd0df36..4cf65f1b 100644 --- a/MVMCoreUI/Atomic/Organisms/Carousel.swift +++ b/MVMCoreUI/Atomic/Organisms/Carousel.swift @@ -26,10 +26,8 @@ open class Carousel: View { /// The index of the page, does not include dummy cells. public var pageIndex: Int { - get { - return loop ? currentIndex - 2 : currentIndex - } - set(newIndex) { + get { return loop ? currentIndex - 2 : currentIndex } + set (newIndex) { currentIndex = loop ? newIndex + 2 : newIndex } } @@ -90,6 +88,7 @@ open class Carousel: View { } } + //-------------------------------------------------- // MARK: - MVMCoreViewProtocol //-------------------------------------------------- @@ -194,7 +193,7 @@ open class Carousel: View { pagingView = MoleculeObjectMapping.shared()?.createMolecule(molecule, delegateObject: delegateObject) as? (UIView & CarouselPageControlProtocol) } - addPaging(view: pagingView , position: (CGFloat(molecule?.position ?? 20))) + addPaging(view: pagingView, position: (CGFloat(molecule?.position ?? 20))) } /// Registers the cells with the collection view @@ -213,9 +212,7 @@ open class Carousel: View { /// Returns the (identifier, class) of the molecule for the given map. func getMoleculeInfo(with molecule: MoleculeModelProtocol, delegateObject: MVMCoreUIDelegateObject?) -> (identifier: String, class: AnyClass, molecule: MoleculeModelProtocol)? { - guard let className = MoleculeObjectMapping.shared()?.getMoleculeClass(molecule) else { - return nil - } + guard let className = MoleculeObjectMapping.shared()?.getMoleculeClass(molecule) else { return nil } return (className.nameForReuse(with: molecule, delegateObject) ?? molecule.moleculeName, className, molecule) } diff --git a/MVMCoreUI/Atomic/Protocols/MoleculeViewProtocol.swift b/MVMCoreUI/Atomic/Protocols/MoleculeViewProtocol.swift index db0de647..91f461dd 100644 --- a/MVMCoreUI/Atomic/Protocols/MoleculeViewProtocol.swift +++ b/MVMCoreUI/Atomic/Protocols/MoleculeViewProtocol.swift @@ -45,8 +45,8 @@ extension MoleculeViewProtocol { } // Do nothing, optionals. - public func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) {} - public func reset() {} + public func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { } + public func reset() { } public static func estimatedHeight(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?) -> CGFloat? { return nil From d94543f3122aa6439af3043a4da7e360ef68cc87 Mon Sep 17 00:00:00 2001 From: "Pfeil, Scott Robert" Date: Thu, 7 May 2020 12:11:10 -0400 Subject: [PATCH 73/78] fixes for notification button --- .../Atomic/Atoms/Buttons/PillButton.swift | 32 ++++++++++++++++--- .../TopAlert/MVMCoreUITopAlertMainView.m | 3 +- MVMCoreUI/TopAlert/MVMCoreUITopAlertView.m | 1 + 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift index 745a34f4..0f612f5a 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift @@ -26,6 +26,28 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { didSet { style() } } + open var buttonSize: Styler.Button.Size = .standard { + didSet { + buttonModel?.size = buttonSize + } + } + + //-------------------------------------------------- + // MARK: - Initializers + //-------------------------------------------------- + + @objc public convenience init(asPrimaryButton tiny: Bool) { + self.init() + buttonSize = tiny ? .tiny : .standard + stylePrimary() + } + + @objc public convenience init(asSecondaryButton tiny: Bool) { + self.init() + buttonSize = tiny ? .tiny : .standard + styleSecondary() + } + //-------------------------------------------------- // MARK: - Computed Properties //-------------------------------------------------- @@ -116,7 +138,7 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { } private func getHeight() -> CGFloat { - PillButton.getHeight(for: buttonModel?.size, size: size) + PillButton.getHeight(for: buttonSize, size: size) } public static func getHeight(for buttonSize: Styler.Button.Size?, size: CGFloat) -> CGFloat { @@ -138,7 +160,7 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { private func getMinimumWidth() -> CGFloat { - switch buttonModel?.size { + switch buttonSize { case .tiny: return MFSizeObject(standardSize: 49, standardiPadPortraitSize: 90, @@ -165,7 +187,9 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { guard let model = model as? ButtonModel else { return } setTitle(model.title, for: .normal) - + if let size = model.size { + buttonSize = size + } model.updateUI = { [weak self] in MVMCoreDispatchUtility.performBlock(onMainThread: { self?.enableField(model.enabled) @@ -185,7 +209,7 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { invalidateIntrinsicContentSize() - switch buttonModel?.size { + switch buttonSize { case .tiny: titleLabel?.font = MFFonts.mfFont75Bd(11 * (intrinsicContentSize.height / Styler.Button.Size.tiny.getHeight())) diff --git a/MVMCoreUI/TopAlert/MVMCoreUITopAlertMainView.m b/MVMCoreUI/TopAlert/MVMCoreUITopAlertMainView.m index 2021cb15..4c62293e 100644 --- a/MVMCoreUI/TopAlert/MVMCoreUITopAlertMainView.m +++ b/MVMCoreUI/TopAlert/MVMCoreUITopAlertMainView.m @@ -188,14 +188,13 @@ self.labelRightConstraint.active = NO; // Sets up to use a button action. Always uses the top view controller - PillButton *button = [[PillButton alloc] init]; + PillButton *button = [[PillButton alloc] initAsSecondaryButton:true]; [button styleSecondary]; [button setContentCompressionResistancePriority:UILayoutPriorityDefaultHigh forAxis:UILayoutConstraintAxisHorizontal]; [button setContentHuggingPriority:800 forAxis:UILayoutConstraintAxisHorizontal]; button.translatesAutoresizingMaskIntoConstraints = NO; [self addSubview:button]; - [NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|->=space-[button]->=space-|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:@{@"space":@(PaddingFive)} views:NSDictionaryOfVariableBindings(button)]]; [NSLayoutConstraint constraintWithItem:button attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0].active = YES; [NSLayoutConstraint constraintWithItem:button attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.centerView attribute:NSLayoutAttributeRight multiplier:1 constant:PaddingThree].active = YES; [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:button attribute:NSLayoutAttributeRight multiplier:1 constant:(self.closeButton ? PaddingTen : PaddingFive)].active = YES; diff --git a/MVMCoreUI/TopAlert/MVMCoreUITopAlertView.m b/MVMCoreUI/TopAlert/MVMCoreUITopAlertView.m index b3dacb21..d8c21b45 100644 --- a/MVMCoreUI/TopAlert/MVMCoreUITopAlertView.m +++ b/MVMCoreUI/TopAlert/MVMCoreUITopAlertView.m @@ -160,6 +160,7 @@ NSString * const MFAccTopAlertClosed = @"Top alert notification is closed."; UIColor *statusBarColor = nil; UIStatusBarStyle statusBarStyle = UIStatusBarStyleDefault; MVMCoreUITopAlertBaseView *view = [self topAlertViewForTopAlertObject:topAlertObject animationDelegate:animationDelegate statusBarColor:&statusBarColor statusBarStyle:&statusBarStyle]; + [view updateView:CGRectGetWidth(self.bounds)]; if (!statusBarColor) { statusBarColor = [UIColor whiteColor]; } From 770731a63927aab8e7614b8d8b6748bda74d56b1 Mon Sep 17 00:00:00 2001 From: "Pfeil, Scott Robert" Date: Thu, 7 May 2020 12:43:44 -0400 Subject: [PATCH 74/78] feedback --- MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift | 12 +++--------- MVMCoreUI/TopAlert/MVMCoreUITopAlertMainView.m | 2 +- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift index 0f612f5a..f5a7ed44 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift @@ -36,16 +36,10 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { // MARK: - Initializers //-------------------------------------------------- - @objc public convenience init(asPrimaryButton tiny: Bool) { + @objc public convenience init(asPrimaryButton isPrimary: Bool, makeTiny istiny: Bool) { self.init() - buttonSize = tiny ? .tiny : .standard - stylePrimary() - } - - @objc public convenience init(asSecondaryButton tiny: Bool) { - self.init() - buttonSize = tiny ? .tiny : .standard - styleSecondary() + buttonSize = istiny ? .tiny : .standard + isPrimary ? stylePrimary() : styleSecondary() } //-------------------------------------------------- diff --git a/MVMCoreUI/TopAlert/MVMCoreUITopAlertMainView.m b/MVMCoreUI/TopAlert/MVMCoreUITopAlertMainView.m index 4c62293e..eeff9cfe 100644 --- a/MVMCoreUI/TopAlert/MVMCoreUITopAlertMainView.m +++ b/MVMCoreUI/TopAlert/MVMCoreUITopAlertMainView.m @@ -188,7 +188,7 @@ self.labelRightConstraint.active = NO; // Sets up to use a button action. Always uses the top view controller - PillButton *button = [[PillButton alloc] initAsSecondaryButton:true]; + PillButton *button = [[PillButton alloc] initAsPrimaryButton:false makeTiny:true]; [button styleSecondary]; [button setContentCompressionResistancePriority:UILayoutPriorityDefaultHigh forAxis:UILayoutConstraintAxisHorizontal]; [button setContentHuggingPriority:800 forAxis:UILayoutConstraintAxisHorizontal]; From ee107a25cfea2bb56847ec63321e75232fc68900 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Thu, 7 May 2020 14:51:23 -0400 Subject: [PATCH 75/78] addressing layout issue --- .../CarouselIndicator/BarsIndicatorView.swift | 20 +++++++---------- .../NumericIndicatorView.swift | 22 +++++++++---------- 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift index 039ece9d..90fb0af1 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift @@ -98,18 +98,6 @@ open class BarsIndicatorView: CarouselIndicator { ]) } - open override func layoutSubviews() { - super.layoutSubviews() - - if barReferences.isEmpty { - generateBars() - updateUI(previousIndex: previousIndex, - newIndex: currentIndex, - totalCount: numberOfPages, - isAnimated: false) - } - } - //-------------------------------------------------- // MARK: - Methods //-------------------------------------------------- @@ -154,6 +142,14 @@ open class BarsIndicatorView: CarouselIndicator { guard let model = model as? BarsCarouselIndicatorModel else { return } currentIndicatorColor = model.currentIndicatorColor.uiColor + + if barReferences.isEmpty { + generateBars() + updateUI(previousIndex: previousIndex, + newIndex: currentIndex, + totalCount: numberOfPages, + isAnimated: false) + } } //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift index b4991d1e..e4ac2fe4 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift @@ -66,17 +66,6 @@ open class NumericIndicatorView: CarouselIndicator { pageCount.updateView(size) } - open override func layoutSubviews() { - super.layoutSubviews() - - if pageCount.text?.isEmpty == nil { - updateUI(previousIndex: previousIndex, - newIndex: currentIndex, - totalCount: numberOfPages, - isAnimated: false) - } - } - //-------------------------------------------------- // MARK: - Setup //-------------------------------------------------- @@ -124,6 +113,17 @@ open class NumericIndicatorView: CarouselIndicator { leftArrow.setNeedsDisplay() } + open override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { + super.set(with: model, delegateObject, additionalData) + + if pageCount.text?.isEmpty == nil { + updateUI(previousIndex: previousIndex, + newIndex: currentIndex, + totalCount: numberOfPages, + isAnimated: false) + } + } + //-------------------------------------------------- // MARK: - IndicatorViewProtocol //-------------------------------------------------- From b8eb6cf3f4bcebf457978f49efc5dc1172e9072f Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Thu, 7 May 2020 15:07:37 -0400 Subject: [PATCH 76/78] didSet does not work upon init --- .../Atomic/Atoms/Buttons/ButtonModel.swift | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift index 601a8fb2..b0e4d54d 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift @@ -24,13 +24,7 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW public var style: Styler.Button.Style? { didSet { guard let style = style else { return } - switch style { - case .primary: - setPrimaryFacade() - - case .secondary: - setSecondaryFacade() - } + setFacade(by: style) } } public var size: Styler.Button.Size? = .standard @@ -160,6 +154,17 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW disabledBorderColor_inverted = Color(uiColor: .mvmCoolGray6) } + public func setFacade(by style: Styler.Button.Style) { + + switch style { + case .primary: + setPrimaryFacade() + + case .secondary: + setSecondaryFacade() + } + } + //-------------------------------------------------- // MARK: - Keys //-------------------------------------------------- @@ -195,6 +200,7 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW if let style = try typeContainer.decodeIfPresent(Styler.Button.Style.self, forKey: .style) { self.style = style + setFacade(by: style) } if let size = try typeContainer.decodeIfPresent(Styler.Button.Size.self, forKey: .size) { From fd3b08bc064a21efa215bfce6821ddc9b4ebc9a1 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Thu, 7 May 2020 15:36:50 -0400 Subject: [PATCH 77/78] moving action to point of interaction --- .../Views/CarouselIndicator/BarsIndicatorView.swift | 9 +-------- .../Views/CarouselIndicator/CarouselIndicator.swift | 13 ++++++------- .../CarouselIndicator/NumericIndicatorView.swift | 11 ----------- 3 files changed, 7 insertions(+), 26 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift index 90fb0af1..972ea7ca 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/BarsIndicatorView.swift @@ -134,6 +134,7 @@ open class BarsIndicatorView: CarouselIndicator { public override func assessTouchOf(_ touchPoint_X: CGFloat) { currentIndex = barReferences.firstIndex { $0.0.frame.maxX >= touchPoint_X && $0.0.frame.minX <= touchPoint_X } ?? 0 + performAction() } open override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { @@ -142,14 +143,6 @@ open class BarsIndicatorView: CarouselIndicator { guard let model = model as? BarsCarouselIndicatorModel else { return } currentIndicatorColor = model.currentIndicatorColor.uiColor - - if barReferences.isEmpty { - generateBars() - updateUI(previousIndex: previousIndex, - newIndex: currentIndex, - totalCount: numberOfPages, - isAnimated: false) - } } //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift index d1f12d85..9380e8c0 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift @@ -48,13 +48,10 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { previousIndex = currentIndex carouselIndicatorModel?.currentIndex = newIndex - if previousIndex != newIndex { - updateUI(previousIndex: previousIndex, - newIndex: newIndex, - totalCount: numberOfPages, - isAnimated: carouselIndicatorModel?.animated ?? true) - performAction() - } + updateUI(previousIndex: previousIndex, + newIndex: newIndex, + totalCount: numberOfPages, + isAnimated: carouselIndicatorModel?.animated ?? true) } } @@ -141,11 +138,13 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { func incrementCurrentIndex() { currentIndex = (currentIndex + 1) % numberOfPages + performAction() } func decrementCurrentIndex() { let newIndex = currentIndex - 1 currentIndex = newIndex < 0 ? numberOfPages - 1 : newIndex + performAction() } /// Increments the currentIndex value. diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift index e4ac2fe4..3585be05 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift @@ -113,17 +113,6 @@ open class NumericIndicatorView: CarouselIndicator { leftArrow.setNeedsDisplay() } - open override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { - super.set(with: model, delegateObject, additionalData) - - if pageCount.text?.isEmpty == nil { - updateUI(previousIndex: previousIndex, - newIndex: currentIndex, - totalCount: numberOfPages, - isAnimated: false) - } - } - //-------------------------------------------------- // MARK: - IndicatorViewProtocol //-------------------------------------------------- From f06da5e379f4118de5cc7c03d6d2b638cff5c4cd Mon Sep 17 00:00:00 2001 From: "Suresh, Kamlesh" Date: Fri, 8 May 2020 17:27:10 -0400 Subject: [PATCH 78/78] move backgroud color set to handleNewData --- MVMCoreUI/Atomic/Protocols/TemplateProtocol.swift | 3 --- MVMCoreUI/BaseControllers/ViewController.swift | 4 ++++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/MVMCoreUI/Atomic/Protocols/TemplateProtocol.swift b/MVMCoreUI/Atomic/Protocols/TemplateProtocol.swift index fc9873bd..56b1a86c 100644 --- a/MVMCoreUI/Atomic/Protocols/TemplateProtocol.swift +++ b/MVMCoreUI/Atomic/Protocols/TemplateProtocol.swift @@ -22,8 +22,5 @@ public extension TemplateProtocol where Self: ViewController { let templateModel = try decoder.decode(TemplateModel.self, from: data) self.templateModel = templateModel self.pageModel = templateModel as? MVMControllerModelProtocol - if let backgroundColor = templateModel.backgroundColor { - view.backgroundColor = backgroundColor.uiColor - } } } diff --git a/MVMCoreUI/BaseControllers/ViewController.swift b/MVMCoreUI/BaseControllers/ViewController.swift index e9310547..315a0476 100644 --- a/MVMCoreUI/BaseControllers/ViewController.swift +++ b/MVMCoreUI/BaseControllers/ViewController.swift @@ -171,6 +171,10 @@ import UIKit let rules = pageModel?.formRules formValidator = FormValidator(rules) } + + if let backgroundColor = pageModel?.backgroundColor { + view.backgroundColor = backgroundColor.uiColor + } } // MARK: - Navigation Item (Move to model base)