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/56] 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/56] 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/56] 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/56] 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/56] 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/56] 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/56] 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/56] 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/56] 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/56] 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/56] 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/56] 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/56] 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/56] 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/56] 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/56] 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/56] 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/56] 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/56] 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/56] 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/56] 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/56] 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/56] 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/56] 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/56] 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/56] 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/56] 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/56] 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/56] 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/56] 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/56] 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/56] 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/56] 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/56] 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/56] 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/56] 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/56] 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/56] 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/56] 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/56] 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/56] 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 52e54c185c9545862fc873aa5c013f8a8a7cb1b6 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 28 Apr 2020 14:21:00 -0400 Subject: [PATCH 42/56] 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 c8155a57dbc945876cbbe1d3ccedbe74d38bd290 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Fri, 1 May 2020 16:47:45 -0400 Subject: [PATCH 43/56] 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 44/56] 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 45/56] 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 46/56] 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 3fbf135faa2cb5e35b22b31fb1a89a451475eabb Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Mon, 4 May 2020 12:26:09 -0400 Subject: [PATCH 47/56] correcting a spacing issue --- .../ListOneColumnFullWidthTextAllTextAndLinks.swift | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/OneColumn/ListOneColumnFullWidthTextAllTextAndLinks.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/OneColumn/ListOneColumnFullWidthTextAllTextAndLinks.swift index ad74039a..599d0cdf 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/OneColumn/ListOneColumnFullWidthTextAllTextAndLinks.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/OneColumn/ListOneColumnFullWidthTextAllTextAndLinks.swift @@ -8,11 +8,12 @@ import Foundation + @objcMembers public class ListOneColumnFullWidthTextAllTextAndLinks: TableViewCell { - //----------------------------------------------------- // MARK: - Outlets //----------------------------------------------------- + var stack: Stack let eyebrow = Label.commonLabelB3(true) let headline = Label.commonLabelH3(true) @@ -26,7 +27,7 @@ import Foundation public override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { stack = Stack.createStack(with: [eyebrow, headline, subHeadline, body, link]) stack.stackModel?.spacing = 0 - stack.stackModel?.molecules[4].spacing = 2 + stack.stackModel?.molecules[4].spacing = 8 super.init(style: style, reuseIdentifier: reuseIdentifier) } @@ -37,13 +38,14 @@ import Foundation //----------------------------------------------------- // MARK: - View Lifecycle //----------------------------------------------------- + override open func setupView() { super.setupView() addMolecule(stack) stack.restack() } - open override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable : Any]?){ + open override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { super.set(with: model, delegateObject, additionalData) guard let model = model as? ListOneColumnFullWidthTextAllTextAndLinksModel else { return } stack.updateContainedMolecules(with: [model.eyebrow, From 3347f4a0af49dc7fc801567c075c47e026fe4675 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Mon, 4 May 2020 15:02:17 -0400 Subject: [PATCH 48/56] 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 49/56] 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 0aad6f3aa7a0b5eb12a96d88b91efdabedba2b99 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 5 May 2020 10:41:55 -0400 Subject: [PATCH 50/56] 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 89499d59edb2ee10848de00e54de3103b0923fa3 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 5 May 2020 12:54:50 -0400 Subject: [PATCH 51/56] 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 52/56] 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 1d43a40acb73834016c6105ab194ea51005af0b2 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 5 May 2020 14:20:50 -0400 Subject: [PATCH 53/56] 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 54/56] 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 55/56] 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 56/56] 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