From 248ee9a0d4e9a6fe3131d407f3f3f549f8f490fa Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Wed, 14 Aug 2019 10:05:44 -0400 Subject: [PATCH 01/20] Changed code to align with Android. --- .../Molecules/ActionDetailWithImage.swift | 50 +++++++------------ 1 file changed, 18 insertions(+), 32 deletions(-) diff --git a/MVMCoreUI/Molecules/ActionDetailWithImage.swift b/MVMCoreUI/Molecules/ActionDetailWithImage.swift index 4792dbd6..3804ed00 100644 --- a/MVMCoreUI/Molecules/ActionDetailWithImage.swift +++ b/MVMCoreUI/Molecules/ActionDetailWithImage.swift @@ -14,8 +14,7 @@ import UIKit // MARK: - Outlets //------------------------------------------------------ - let title = Label.commonLabelH3(true) - let message = Label.commonLabelB3(true) + let header = HeadlineBody(frame: .zero) let button = PrimaryButton.primaryTinyButton(false)! let imageLoader = MFLoadImageView(pinnedEdges: .all) let leftContainer = ViewConstrainingView.empty() @@ -24,7 +23,7 @@ import UIKit // MARK: - Properties //------------------------------------------------------ - var bottomTitlePadding: CGFloat = PaddingOne + var buttomHeaderPadding: CGFloat = PaddingTwo //------------------------------------------------------ // MARK: - Constraints @@ -32,7 +31,6 @@ import UIKit var imageLeadingConstraint: NSLayoutConstraint? var buttonTopConstraint: NSLayoutConstraint? - var messageTopConstraint: NSLayoutConstraint? //------------------------------------------------------ // MARK: - Initialization @@ -68,8 +66,7 @@ import UIKit addSubview(leftContainer) addSubview(imageLoader) - leftContainer.addSubview(title) - leftContainer.addSubview(message) + leftContainer.addSubview(header) leftContainer.addSubview(button) leftContainer.topAnchor.constraint(equalTo: layoutMarginsGuide.topAnchor).isActive = true @@ -80,17 +77,11 @@ import UIKit leftContainerBottom.priority = UILayoutPriority(249) leftContainerBottom.isActive = true - title.topAnchor.constraint(equalTo: leftContainer.topAnchor).isActive = true - title.leadingAnchor.constraint(equalTo: leftContainer.leadingAnchor).isActive = true - leftContainer.trailingAnchor.constraint(equalTo: title.trailingAnchor).isActive = true - - messageTopConstraint = message.topAnchor.constraint(equalTo: title.bottomAnchor, constant: PaddingOne) - messageTopConstraint?.isActive = true - - message.leadingAnchor.constraint(equalTo: leftContainer.leadingAnchor).isActive = true - leftContainer.trailingAnchor.constraint(equalTo: message.trailingAnchor).isActive = true - - buttonTopConstraint = button.topAnchor.constraint(equalTo: message.bottomAnchor, constant: PaddingTwo) + header.topAnchor.constraint(equalTo: leftContainer.topAnchor).isActive = true + header.leadingAnchor.constraint(equalTo: leftContainer.leadingAnchor).isActive = true + leftContainer.trailingAnchor.constraint(equalTo: header.trailingAnchor).isActive = true + + buttonTopConstraint = button.topAnchor.constraint(equalTo: header.bottomAnchor, constant: PaddingTwo) buttonTopConstraint?.isActive = true button.leadingAnchor.constraint(equalTo: leftContainer.leadingAnchor).isActive = true @@ -112,15 +103,12 @@ import UIKit override open func updateView(_ size: CGFloat) { super.updateView(size) - title.updateView(size) - message.updateView(size) + header.updateView(size) button.updateView(size) imageLoader.updateView(size) leftContainer.updateView(size) - - messageTopConstraint?.constant = title.hasText && message.hasText ? bottomTitlePadding : 0 - buttonTopConstraint?.constant = message.hasText || title.hasText ? PaddingTwo : 0 + buttonTopConstraint?.constant = header.headlineLabel.hasText || header.messageLabel.hasText ? PaddingTwo : 0 } public override static func estimatedHeight(forRow json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat { @@ -133,20 +121,19 @@ import UIKit private func setDefaultState() { - title.font = MFStyler.fontH3() - message.font = MFStyler.fontB3() + header.headlineLabel.font = MFStyler.fontH3() + header.messageLabel.font = MFStyler.fontB3() button.setAsSecondaryCustom() button.isHidden = false imageLoader.imageView.contentMode = .scaleAspectFit imageLoader.addSizeConstraintsForAspectRatio = true - bottomTitlePadding = PaddingOne + buttomHeaderPadding = PaddingTwo } override open func reset() { super.reset() - title.reset() - message.reset() + header.reset() button.reset() imageLeadingConstraint?.constant = 16 imageLoader.reset() @@ -157,8 +144,7 @@ import UIKit open override func setAsMolecule() { super.setAsMolecule() - title.setAsMolecule() - message.setAsMolecule() + header.setAsMolecule() button.setAsMolecule() imageLoader.setAsMolecule() @@ -171,12 +157,12 @@ import UIKit guard let dictionary = json else { return } if let padding = dictionary.optionalCGFloatForKey("bottomTitlePadding") { - bottomTitlePadding = padding + buttomHeaderPadding = padding } - title.setWithJSON(dictionary.optionalDictionaryForKey("title"), delegateObject: delegateObject, additionalData: additionalData) - message.setWithJSON(dictionary.optionalDictionaryForKey("message"), delegateObject: delegateObject, additionalData: additionalData) + header.setWithJSON(dictionary.optionalDictionaryForKey("headlineBody"), delegateObject: delegateObject, additionalData: additionalData) imageLoader.setWithJSON(dictionary.optionalDictionaryForKey("image"), delegateObject: delegateObject, additionalData: additionalData) + if let buttonDictionary = dictionary.optionalDictionaryForKey("button") { button.setWithJSON(buttonDictionary, delegateObject: delegateObject, additionalData: additionalData) } else { From 4bc22dbb8ecd552b7afbe920c5f243167e3155a2 Mon Sep 17 00:00:00 2001 From: "Pfeil, Scott Robert" Date: Mon, 26 Aug 2019 12:35:04 -0400 Subject: [PATCH 02/20] switches --- MVMCoreUI.xcodeproj/project.pbxproj | 10 ++- MVMCoreUI/Atoms/Views/MVMCoreUISwitch.h | 3 +- MVMCoreUI/Atoms/Views/MVMCoreUISwitch.m | 74 ++++++++++++++++++- .../SwitchLineItem.swift | 0 .../MVMCoreUIMoleculeMappingObject.m | 2 +- 5 files changed, 83 insertions(+), 6 deletions(-) rename MVMCoreUI/Molecules/{ => SwitchMolecules}/SwitchLineItem.swift (100%) diff --git a/MVMCoreUI.xcodeproj/project.pbxproj b/MVMCoreUI.xcodeproj/project.pbxproj index 22b92460..7a6d0181 100644 --- a/MVMCoreUI.xcodeproj/project.pbxproj +++ b/MVMCoreUI.xcodeproj/project.pbxproj @@ -391,6 +391,14 @@ path = FormUIHelpers; sourceTree = ""; }; + D224798823142BF2003FCCF9 /* SwitchMolecules */ = { + isa = PBXGroup; + children = ( + 016A1070228122180009D605 /* SwitchLineItem.swift */, + ); + path = SwitchMolecules; + sourceTree = ""; + }; D22D1F582204D2590077CEC0 /* LegacyControllers */ = { isa = PBXGroup; children = ( @@ -478,12 +486,12 @@ D29DF10E21E67A77003B2FB9 /* Molecules */ = { isa = PBXGroup; children = ( + D224798823142BF2003FCCF9 /* SwitchMolecules */, 0A12149F22C11A17007C7030 /* ActionDetailWithImage.swift */, 01DF55DF21F8FAA800CC099B /* MFTextFieldListView.swift */, D29770C721F7C4AE00B2F0D0 /* TopLabelsView.h */, D29770C621F7C4AE00B2F0D0 /* TopLabelsView.m */, D282AACA2243C61700C46919 /* ButtonView.swift */, - 016A1070228122180009D605 /* SwitchLineItem.swift */, 01CA51B4229716F60071A6EE /* Switch.swift */, D20A9A5D2243D3E300ADE781 /* TwoButtonView.swift */, D2A514662213885800345BFB /* StandardHeaderView.swift */, diff --git a/MVMCoreUI/Atoms/Views/MVMCoreUISwitch.h b/MVMCoreUI/Atoms/Views/MVMCoreUISwitch.h index 5591f595..ba36419e 100644 --- a/MVMCoreUI/Atoms/Views/MVMCoreUISwitch.h +++ b/MVMCoreUI/Atoms/Views/MVMCoreUISwitch.h @@ -8,10 +8,11 @@ #import +#import @import MVMCore.MVMCoreViewProtocol; typedef void(^ValueChangeBlock)(void); -@interface MVMCoreUISwitch : UIControl +@interface MVMCoreUISwitch : UIControl @property (assign, nonatomic, getter=isOn) BOOL on; @property (nullable, strong, nonatomic) UIColor *onTintColor; diff --git a/MVMCoreUI/Atoms/Views/MVMCoreUISwitch.m b/MVMCoreUI/Atoms/Views/MVMCoreUISwitch.m index 9b9e0b96..95264f3c 100644 --- a/MVMCoreUI/Atoms/Views/MVMCoreUISwitch.m +++ b/MVMCoreUI/Atoms/Views/MVMCoreUISwitch.m @@ -14,6 +14,7 @@ #import #import #import +#import const CGFloat SwitchWidth = 42; const CGFloat SwitchHeight = 22; @@ -21,7 +22,7 @@ const CGFloat SwitchKnobWidth = 20; const CGFloat SwitchKnobHeight = 20; const CGFloat SwitchShakeIntensity = 2; -@interface MVMCoreUISwitch () +@interface MVMCoreUISwitch () @property (weak, nonatomic) UIView *baseView; @property (weak, nonatomic) UIView *knobView; @@ -37,6 +38,9 @@ const CGFloat SwitchShakeIntensity = 2; @property (nonatomic) BOOL canChangeValue; +@property (strong, nonatomic, nullable) NSDictionary *json; +@property (nullable, strong, nonatomic) DelegateObject *delegate; + @end @implementation MVMCoreUISwitch @@ -137,6 +141,50 @@ const CGFloat SwitchShakeIntensity = 2; } } +#pragma mark - MVMCoreUIMoleculeViewProtocol + +- (void)setWithJSON:(NSDictionary *)json delegateObject:(MVMCoreUIDelegateObject *)delegateObject additionalData:(NSDictionary *)additionalData { + self.json = json; + + [FormValidator setupValidationWithMolecule:self delegate:delegateObject.formValidationProtocol]; + + NSString *color = [json string:@"onTintColor"]; + if (color) { + self.onTintColor = [UIColor mfGetColorForHex:color]; + } + + color = [json string:@"offTintColor"]; + if (color) { + self.offTintColor = [UIColor mfGetColorForHex:color]; + } + + color = [json string:@"onKnobTintColor"]; + if (color) { + self.onKnobTintColor = [UIColor mfGetColorForHex:color]; + } + + color = [json string:@"offKnobTintColor"]; + if (color) { + self.offKnobTintColor = [UIColor mfGetColorForHex:color]; + } + + [self setState:[json boolForKey:@"state"] animated:false]; +} + ++ (CGFloat)estimatedHeightForRow:(NSDictionary *)json delegateObject:(MVMCoreUIDelegateObject *)delegateObject { + return [self getSwitchHeight]; +} + +#pragma mark - MVMCoreUIMoleculeViewProtocol + +- (BOOL)needsToBeConstrained { + return YES; +} + +- (UIStackViewAlignment)alignment { + return UIStackViewAlignmentTrailing; +} + #pragma mark - UIResponder overide - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { @@ -280,6 +328,11 @@ const CGFloat SwitchShakeIntensity = 2; if (self.valueChangedBlock) { self.valueChangedBlock(); } + + if (self.delegate && [self.delegate respondsToSelector:@selector(formValidationProtocol)] && [[self.delegate performSelector:@selector(formValidationProtocol)] respondsToSelector:@selector(formValidatorModel)]) { + FormValidator *formValidator = [[self.delegate performSelector:@selector(formValidationProtocol)] performSelector:@selector(formValidatorModel)]; + [formValidator enableByValidation]; + } } - (void)setState:(BOOL)state withoutBlockAnimated:(BOOL)animated { @@ -308,7 +361,7 @@ const CGFloat SwitchShakeIntensity = 2; } -- (BOOL)changeValue{ +- (BOOL)changeValue { self.on^=YES; self.shouldTouchToSwitch = NO; [self setState:self.on animated:YES]; @@ -349,7 +402,8 @@ const CGFloat SwitchShakeIntensity = 2; } #pragma mark - Accessibility -- (BOOL)isAccessibilityElement{ + +- (BOOL)isAccessibilityElement { return YES; } @@ -361,4 +415,18 @@ const CGFloat SwitchShakeIntensity = 2; return [MVMCoreUIUtility hardcodedStringWithKey:@"AccToggleHint"]; } +#pragma mark FormValidationProtocol + +- (BOOL)isValidField { + return self.isOn && [self.json boolForKey:@"required"]; +} + +- (NSString *)formFieldName { + return [self.json string:KeyFieldKey]; +} + +- (id)formFieldValue { + return @(self.isOn); +} + @end diff --git a/MVMCoreUI/Molecules/SwitchLineItem.swift b/MVMCoreUI/Molecules/SwitchMolecules/SwitchLineItem.swift similarity index 100% rename from MVMCoreUI/Molecules/SwitchLineItem.swift rename to MVMCoreUI/Molecules/SwitchMolecules/SwitchLineItem.swift diff --git a/MVMCoreUI/OtherHandlers/MVMCoreUIMoleculeMappingObject.m b/MVMCoreUI/OtherHandlers/MVMCoreUIMoleculeMappingObject.m index 0dffc356..123940f4 100644 --- a/MVMCoreUI/OtherHandlers/MVMCoreUIMoleculeMappingObject.m +++ b/MVMCoreUI/OtherHandlers/MVMCoreUIMoleculeMappingObject.m @@ -45,7 +45,7 @@ @"checkbox": MVMCoreUICheckBox.class, @"listItem": MoleculeTableViewCell.class, @"switchLineItem": SwitchLineItem.class, - @"switch": Switch.class, + @"switch": MVMCoreUISwitch.class, @"leftRightLabelView": LeftRightLabelView.class, @"actionDetailWithImage": ActionDetailWithImage.class, @"image": MFLoadImageView.class, From b5276f5519b1e3a3feec0a889144ce3ce79be572 Mon Sep 17 00:00:00 2001 From: "Pfeil, Scott Robert" Date: Thu, 29 Aug 2019 08:28:07 -0400 Subject: [PATCH 03/20] New molecules and arranging files --- MVMCoreUI.xcodeproj/project.pbxproj | 98 ++++++++++---- .../Buttons}/ButtonView.swift | 0 .../Views}/MVMCoreUIPageControl.h | 0 .../Views}/MVMCoreUIPageControl.m | 0 .../Views}/MVMCoreUIPagingProtocol.h | 0 MVMCoreUI/Atoms/Views/MVMCoreUISwitch.h | 4 +- MVMCoreUI/Atoms/Views/MVMCoreUISwitch.m | 2 +- .../Views}/ProgressBar.swift | 0 .../NSLayoutConstraintExtension.swift | 44 +++++++ .../ImageHeadlineBody.swift | 0 .../TwoButtonView.swift | 0 .../MoleculeCollectionViewCell.swift | 0 .../{ => Items}/MoleculeTableViewCell.swift | 0 .../{ => LeftRightViews}/CornerLabels.swift | 0 .../SwitchMolecules/HeadlineBodySwitch.swift | 57 +++++++++ .../HeadlineBodyTextButtonSwitch.swift | 59 +++++++++ .../SwitchMolecules/LabelSwitch.swift | 57 +++++++++ MVMCoreUI/Molecules/Switch.swift | 91 ------------- .../SwitchMolecules/SwitchLineItem.swift | 121 ------------------ .../HeadlineBody.swift | 26 +++- .../HeadlineBodyTextButton.swift | 78 +++++++++++ .../{Molecules => Organisms}/Carousel.swift | 0 .../MoleculeStackView.swift | 0 .../MVMCoreUIMoleculeMappingObject.m | 8 +- 24 files changed, 401 insertions(+), 244 deletions(-) rename MVMCoreUI/{Molecules => Atoms/Buttons}/ButtonView.swift (100%) rename MVMCoreUI/{Molecules => Atoms/Views}/MVMCoreUIPageControl.h (100%) rename MVMCoreUI/{Molecules => Atoms/Views}/MVMCoreUIPageControl.m (100%) rename MVMCoreUI/{Molecules => Atoms/Views}/MVMCoreUIPagingProtocol.h (100%) rename MVMCoreUI/{Molecules => Atoms/Views}/ProgressBar.swift (100%) create mode 100644 MVMCoreUI/Categories/NSLayoutConstraintExtension.swift rename MVMCoreUI/Molecules/{ => HorizontalCombinationViews}/ImageHeadlineBody.swift (100%) rename MVMCoreUI/Molecules/{ => HorizontalCombinationViews}/TwoButtonView.swift (100%) rename MVMCoreUI/Molecules/{ => Items}/MoleculeCollectionViewCell.swift (100%) rename MVMCoreUI/Molecules/{ => Items}/MoleculeTableViewCell.swift (100%) rename MVMCoreUI/Molecules/{ => LeftRightViews}/CornerLabels.swift (100%) create mode 100644 MVMCoreUI/Molecules/LeftRightViews/SwitchMolecules/HeadlineBodySwitch.swift create mode 100644 MVMCoreUI/Molecules/LeftRightViews/SwitchMolecules/HeadlineBodyTextButtonSwitch.swift create mode 100644 MVMCoreUI/Molecules/LeftRightViews/SwitchMolecules/LabelSwitch.swift delete mode 100644 MVMCoreUI/Molecules/Switch.swift delete mode 100644 MVMCoreUI/Molecules/SwitchMolecules/SwitchLineItem.swift rename MVMCoreUI/Molecules/{ => VerticalCombinationViews}/HeadlineBody.swift (89%) create mode 100644 MVMCoreUI/Molecules/VerticalCombinationViews/HeadlineBodyTextButton.swift rename MVMCoreUI/{Molecules => Organisms}/Carousel.swift (100%) rename MVMCoreUI/{Molecules => Organisms}/MoleculeStackView.swift (100%) diff --git a/MVMCoreUI.xcodeproj/project.pbxproj b/MVMCoreUI.xcodeproj/project.pbxproj index 7a6d0181..2913a9a6 100644 --- a/MVMCoreUI.xcodeproj/project.pbxproj +++ b/MVMCoreUI.xcodeproj/project.pbxproj @@ -10,11 +10,10 @@ 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 */; }; - 016A1071228122180009D605 /* SwitchLineItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 016A1070228122180009D605 /* SwitchLineItem.swift */; }; + 016A1071228122180009D605 /* HeadlineBodyTextButtonSwitch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 016A1070228122180009D605 /* HeadlineBodyTextButtonSwitch.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 */; }; - 01CA51B5229716F60071A6EE /* Switch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01CA51B4229716F60071A6EE /* Switch.swift */; }; 01DF55E021F8FAA800CC099B /* MFTextFieldListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01DF55DF21F8FAA800CC099B /* MFTextFieldListView.swift */; }; 01DF567021FA5AB300CC099B /* TextFieldListFormViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01DF566F21FA5AB300CC099B /* TextFieldListFormViewController.swift */; }; 01E569D3223FFFA500327251 /* ThreeLayerViewController.swift in Headers */ = {isa = PBXBuildFile; fileRef = D2A5146A2214905000345BFB /* ThreeLayerViewController.swift */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -24,6 +23,10 @@ D206997721FB8A0B00CAE0DE /* MVMCoreUINavigationController.h in Headers */ = {isa = PBXBuildFile; fileRef = D206997521FB8A0B00CAE0DE /* MVMCoreUINavigationController.h */; settings = {ATTRIBUTES = (Public, ); }; }; D206997821FB8A0B00CAE0DE /* MVMCoreUINavigationController.m in Sources */ = {isa = PBXBuildFile; fileRef = D206997621FB8A0B00CAE0DE /* MVMCoreUINavigationController.m */; }; D20A9A5E2243D3E300ADE781 /* TwoButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20A9A5D2243D3E300ADE781 /* TwoButtonView.swift */; }; + D224798A2314445E003FCCF9 /* LabelSwitch.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22479892314445E003FCCF9 /* LabelSwitch.swift */; }; + D224798C231450C8003FCCF9 /* HeadlineBodySwitch.swift in Sources */ = {isa = PBXBuildFile; fileRef = D224798B231450C8003FCCF9 /* HeadlineBodySwitch.swift */; }; + D22479942316AE5E003FCCF9 /* NSLayoutConstraintExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22479932316AE5E003FCCF9 /* NSLayoutConstraintExtension.swift */; }; + D22479962316AF6E003FCCF9 /* HeadlineBodyTextButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22479952316AF6D003FCCF9 /* HeadlineBodyTextButton.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, ); }; }; @@ -189,11 +192,10 @@ 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 = ""; }; - 016A1070228122180009D605 /* SwitchLineItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwitchLineItem.swift; sourceTree = ""; }; + 016A1070228122180009D605 /* HeadlineBodyTextButtonSwitch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadlineBodyTextButtonSwitch.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 = ""; }; - 01CA51B4229716F60071A6EE /* Switch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Switch.swift; sourceTree = ""; }; 01DF55DF21F8FAA800CC099B /* MFTextFieldListView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MFTextFieldListView.swift; sourceTree = ""; }; 01DF566F21FA5AB300CC099B /* TextFieldListFormViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextFieldListFormViewController.swift; sourceTree = ""; }; 0A12149F22C11A17007C7030 /* ActionDetailWithImage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActionDetailWithImage.swift; sourceTree = ""; }; @@ -202,6 +204,10 @@ D206997521FB8A0B00CAE0DE /* MVMCoreUINavigationController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUINavigationController.h; sourceTree = ""; }; D206997621FB8A0B00CAE0DE /* MVMCoreUINavigationController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUINavigationController.m; sourceTree = ""; }; D20A9A5D2243D3E300ADE781 /* TwoButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TwoButtonView.swift; sourceTree = ""; }; + D22479892314445E003FCCF9 /* LabelSwitch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelSwitch.swift; sourceTree = ""; }; + D224798B231450C8003FCCF9 /* HeadlineBodySwitch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadlineBodySwitch.swift; sourceTree = ""; }; + D22479932316AE5E003FCCF9 /* NSLayoutConstraintExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSLayoutConstraintExtension.swift; sourceTree = ""; }; + D22479952316AF6D003FCCF9 /* HeadlineBodyTextButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadlineBodyTextButton.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 = ""; }; @@ -394,11 +400,58 @@ D224798823142BF2003FCCF9 /* SwitchMolecules */ = { isa = PBXGroup; children = ( - 016A1070228122180009D605 /* SwitchLineItem.swift */, + D22479892314445E003FCCF9 /* LabelSwitch.swift */, + D224798B231450C8003FCCF9 /* HeadlineBodySwitch.swift */, + 016A1070228122180009D605 /* HeadlineBodyTextButtonSwitch.swift */, ); path = SwitchMolecules; sourceTree = ""; }; + D224798D2316A988003FCCF9 /* VerticalCombinationViews */ = { + isa = PBXGroup; + children = ( + D2A638FC22CA98280052ED1F /* HeadlineBody.swift */, + D22479952316AF6D003FCCF9 /* HeadlineBodyTextButton.swift */, + ); + path = VerticalCombinationViews; + sourceTree = ""; + }; + D224798E2316A995003FCCF9 /* HorizontalCombinationViews */ = { + isa = PBXGroup; + children = ( + D2B1E3E422F37D6A0065F95C /* ImageHeadlineBody.swift */, + D20A9A5D2243D3E300ADE781 /* TwoButtonView.swift */, + ); + path = HorizontalCombinationViews; + sourceTree = ""; + }; + D224798F2316A99F003FCCF9 /* LeftRightViews */ = { + isa = PBXGroup; + children = ( + D224798823142BF2003FCCF9 /* SwitchMolecules */, + B8200E182281DC1A007245F4 /* CornerLabels.swift */, + ); + path = LeftRightViews; + sourceTree = ""; + }; + D22479902316A9CB003FCCF9 /* Organisms */ = { + isa = PBXGroup; + children = ( + D2A5145E2211DDC100345BFB /* MoleculeStackView.swift */, + D2A6390022CBB1820052ED1F /* Carousel.swift */, + ); + path = Organisms; + sourceTree = ""; + }; + D22479912316A9EF003FCCF9 /* Items */ = { + isa = PBXGroup; + children = ( + D2A6390422CBCE160052ED1F /* MoleculeCollectionViewCell.swift */, + D2E1FADC2268B25E00AEFD8C /* MoleculeTableViewCell.swift */, + ); + path = Items; + sourceTree = ""; + }; D22D1F582204D2590077CEC0 /* LegacyControllers */ = { isa = PBXGroup; children = ( @@ -444,6 +497,7 @@ D29DF11E21E6851E003B2FB9 /* TopAlert */, D29DF10D21E67A70003B2FB9 /* Atoms */, D29DF10E21E67A77003B2FB9 /* Molecules */, + D22479902316A9CB003FCCF9 /* Organisms */, D29DF0DF21E418B2003B2FB9 /* Templates */, D29DF0CF21E404D4003B2FB9 /* MVMCoreUI.h */, D29DF0D021E404D4003B2FB9 /* Info.plist */, @@ -486,30 +540,19 @@ D29DF10E21E67A77003B2FB9 /* Molecules */ = { isa = PBXGroup; children = ( - D224798823142BF2003FCCF9 /* SwitchMolecules */, + D22479912316A9EF003FCCF9 /* Items */, + D224798F2316A99F003FCCF9 /* LeftRightViews */, + D224798E2316A995003FCCF9 /* HorizontalCombinationViews */, + D224798D2316A988003FCCF9 /* VerticalCombinationViews */, + D2A5145C2211D22A00345BFB /* MVMCoreUIMoleculeViewProtocol.h */, 0A12149F22C11A17007C7030 /* ActionDetailWithImage.swift */, 01DF55DF21F8FAA800CC099B /* MFTextFieldListView.swift */, D29770C721F7C4AE00B2F0D0 /* TopLabelsView.h */, D29770C621F7C4AE00B2F0D0 /* TopLabelsView.m */, - D282AACA2243C61700C46919 /* ButtonView.swift */, - 01CA51B4229716F60071A6EE /* Switch.swift */, - D20A9A5D2243D3E300ADE781 /* TwoButtonView.swift */, D2A514662213885800345BFB /* StandardHeaderView.swift */, - D2A5145C2211D22A00345BFB /* MVMCoreUIMoleculeViewProtocol.h */, - D2A5145E2211DDC100345BFB /* MoleculeStackView.swift */, D274CA322236A78900B01B62 /* StandardFooterView.swift */, - D2E1FADC2268B25E00AEFD8C /* MoleculeTableViewCell.swift */, - B8200E142280C4CF007245F4 /* ProgressBar.swift */, - B8200E182281DC1A007245F4 /* CornerLabels.swift */, D29B770F22C281F400D6ACE0 /* ModuleMolecule.swift */, - D2A638FC22CA98280052ED1F /* HeadlineBody.swift */, - D2A6390022CBB1820052ED1F /* Carousel.swift */, - D2A6390422CBCE160052ED1F /* MoleculeCollectionViewCell.swift */, - D260D7AF22D65BDD007E7233 /* MVMCoreUIPageControl.h */, - D260D7B022D65BDD007E7233 /* MVMCoreUIPageControl.m */, - D260D7B522D68509007E7233 /* MVMCoreUIPagingProtocol.h */, D2D6CD3F22E78C1A00D701B8 /* Scroller.swift */, - D2B1E3E422F37D6A0065F95C /* ImageHeadlineBody.swift */, ); path = Molecules; sourceTree = ""; @@ -542,6 +585,7 @@ D29DF11321E6805F003B2FB9 /* UIColor+MFConvenience.m */, D29DF11221E6805F003B2FB9 /* NSLayoutConstraint+MFConvenience.h */, D29DF11421E6805F003B2FB9 /* NSLayoutConstraint+MFConvenience.m */, + D22479932316AE5E003FCCF9 /* NSLayoutConstraintExtension.swift */, ); path = Categories; sourceTree = ""; @@ -620,6 +664,7 @@ D29DF17021E69E1F003B2FB9 /* MFCustomButton.m */, D29DF16C21E69E1F003B2FB9 /* PrimaryButton.h */, D29DF17121E69E1F003B2FB9 /* PrimaryButton.m */, + D282AACA2243C61700C46919 /* ButtonView.swift */, D29DF16D21E69E1F003B2FB9 /* MFTextButton.h */, D29DF17221E69E1F003B2FB9 /* MFTextButton.m */, ); @@ -629,6 +674,10 @@ D29DF17D21E69E26003B2FB9 /* Views */ = { isa = PBXGroup; children = ( + D260D7AF22D65BDD007E7233 /* MVMCoreUIPageControl.h */, + D260D7B022D65BDD007E7233 /* MVMCoreUIPageControl.m */, + D260D7B522D68509007E7233 /* MVMCoreUIPagingProtocol.h */, + B8200E142280C4CF007245F4 /* ProgressBar.swift */, DBC4391622442196001AB423 /* CaretView.swift */, DBC4391722442197001AB423 /* DashLine.swift */, DB06250A2293456500B72DD3 /* LeftRightLabelView.swift */, @@ -951,6 +1000,7 @@ D29DF25321E6A177003B2FB9 /* MFDigitTextField.m in Sources */, D29DF12F21E6851E003B2FB9 /* MVMCoreUITopAlertMainView.m in Sources */, DBC4392122491730001AB423 /* LabelWithInternalButton.swift in Sources */, + D224798C231450C8003FCCF9 /* HeadlineBodySwitch.swift in Sources */, D29DF17C21E69E1F003B2FB9 /* MFTextButton.m in Sources */, D29DF2C521E7BF57003B2FB9 /* MFTabBarSwipeAnimator.m in Sources */, D29DF2B421E7B76D003B2FB9 /* MFLoadingSpinner.m in Sources */, @@ -975,9 +1025,11 @@ D260D7B222D65BDD007E7233 /* MVMCoreUIPageControl.m in Sources */, D29DF26D21E6AA0B003B2FB9 /* FLAnimatedImageView.m in Sources */, D29DF2EF21ECEAE1003B2FB9 /* MFFonts.m in Sources */, + D22479942316AE5E003FCCF9 /* NSLayoutConstraintExtension.swift in Sources */, D282AACB2243C61700C46919 /* ButtonView.swift in Sources */, D2D6CD4222E78FAB00D701B8 /* ThreeLayerTemplate.swift in Sources */, 0105618F224BBE7700E1557D /* FormValidator+FormParams.swift in Sources */, + D22479962316AF6E003FCCF9 /* HeadlineBodyTextButton.swift in Sources */, D2E1FADD2268B25E00AEFD8C /* MoleculeTableViewCell.swift in Sources */, D29DF2AE21E7B3A4003B2FB9 /* MFTextView.m in Sources */, D29DF18121E69E50003B2FB9 /* MFView.m in Sources */, @@ -994,12 +1046,13 @@ D2A6390522CBCE160052ED1F /* MoleculeCollectionViewCell.swift in Sources */, D2A6390122CBB1820052ED1F /* Carousel.swift in Sources */, D29DF2C721E7BF57003B2FB9 /* MFTabBarInteractor.m in Sources */, - 016A1071228122180009D605 /* SwitchLineItem.swift in Sources */, + 016A1071228122180009D605 /* HeadlineBodyTextButtonSwitch.swift in Sources */, D29DF29521E7ADB8003B2FB9 /* ProgrammaticScrollViewController.m in Sources */, D2A638FD22CA98280052ED1F /* HeadlineBody.swift in Sources */, D29DF16121E69996003B2FB9 /* MFViewController.m in Sources */, D2E1FAE12268E81D00AEFD8C /* MoleculeListTemplate.swift in Sources */, DB06250B2293456500B72DD3 /* LeftRightLabelView.swift in Sources */, + D224798A2314445E003FCCF9 /* LabelSwitch.swift in Sources */, D22D1F47220496A30077CEC0 /* MVMCoreUISwitch.m in Sources */, D29DF28C21E7AC2B003B2FB9 /* ViewConstrainingView.m in Sources */, D29DF17B21E69E1F003B2FB9 /* PrimaryButton.m in Sources */, @@ -1017,7 +1070,6 @@ D29770FC21F7C77400B2F0D0 /* MVMCoreUITextFieldView.m in Sources */, D29DF25121E6A177003B2FB9 /* MFDigitTextBox.m in Sources */, DBC4391B224421A0001AB423 /* CaretButton.swift in Sources */, - 01CA51B5229716F60071A6EE /* Switch.swift in Sources */, 0198F7A82256A80B0066C936 /* MFRadioButton.m in Sources */, D29DF13221E6851E003B2FB9 /* MVMCoreUITopAlertBaseView.m in Sources */, D29DF29C21E7ADB9003B2FB9 /* MFProgrammaticTableViewController.m in Sources */, diff --git a/MVMCoreUI/Molecules/ButtonView.swift b/MVMCoreUI/Atoms/Buttons/ButtonView.swift similarity index 100% rename from MVMCoreUI/Molecules/ButtonView.swift rename to MVMCoreUI/Atoms/Buttons/ButtonView.swift diff --git a/MVMCoreUI/Molecules/MVMCoreUIPageControl.h b/MVMCoreUI/Atoms/Views/MVMCoreUIPageControl.h similarity index 100% rename from MVMCoreUI/Molecules/MVMCoreUIPageControl.h rename to MVMCoreUI/Atoms/Views/MVMCoreUIPageControl.h diff --git a/MVMCoreUI/Molecules/MVMCoreUIPageControl.m b/MVMCoreUI/Atoms/Views/MVMCoreUIPageControl.m similarity index 100% rename from MVMCoreUI/Molecules/MVMCoreUIPageControl.m rename to MVMCoreUI/Atoms/Views/MVMCoreUIPageControl.m diff --git a/MVMCoreUI/Molecules/MVMCoreUIPagingProtocol.h b/MVMCoreUI/Atoms/Views/MVMCoreUIPagingProtocol.h similarity index 100% rename from MVMCoreUI/Molecules/MVMCoreUIPagingProtocol.h rename to MVMCoreUI/Atoms/Views/MVMCoreUIPagingProtocol.h diff --git a/MVMCoreUI/Atoms/Views/MVMCoreUISwitch.h b/MVMCoreUI/Atoms/Views/MVMCoreUISwitch.h index ba36419e..a21dd55f 100644 --- a/MVMCoreUI/Atoms/Views/MVMCoreUISwitch.h +++ b/MVMCoreUI/Atoms/Views/MVMCoreUISwitch.h @@ -24,8 +24,8 @@ typedef void(^ValueChangeBlock)(void); @property (nonatomic) BOOL shouldTouchToSwitch; @property (nullable, copy, nonatomic) ValueChangeBlock valueChangedBlock; -+ (nullable instancetype)mvmSwitchDefault; -+ (nullable instancetype)mvmSwitchDefaultWithValueChangeBlock:(nullable ValueChangeBlock)block; ++ (nonnull instancetype)mvmSwitchDefault; ++ (nonnull instancetype)mvmSwitchDefaultWithValueChangeBlock:(nullable ValueChangeBlock)block; - (void)setState:(BOOL)state animated:(BOOL)animated; diff --git a/MVMCoreUI/Atoms/Views/MVMCoreUISwitch.m b/MVMCoreUI/Atoms/Views/MVMCoreUISwitch.m index 95264f3c..f994b320 100644 --- a/MVMCoreUI/Atoms/Views/MVMCoreUISwitch.m +++ b/MVMCoreUI/Atoms/Views/MVMCoreUISwitch.m @@ -90,7 +90,7 @@ const CGFloat SwitchShakeIntensity = 2; return mySwitch; } -+ (nullable instancetype)mvmSwitchDefaultWithValueChangeBlock:(nullable ValueChangeBlock)block { ++ (nonnull instancetype)mvmSwitchDefaultWithValueChangeBlock:(nullable ValueChangeBlock)block { MVMCoreUISwitch *mySwitch = [[self alloc] initWithFrame:CGRectZero]; mySwitch.valueChangedBlock = block; return mySwitch; diff --git a/MVMCoreUI/Molecules/ProgressBar.swift b/MVMCoreUI/Atoms/Views/ProgressBar.swift similarity index 100% rename from MVMCoreUI/Molecules/ProgressBar.swift rename to MVMCoreUI/Atoms/Views/ProgressBar.swift diff --git a/MVMCoreUI/Categories/NSLayoutConstraintExtension.swift b/MVMCoreUI/Categories/NSLayoutConstraintExtension.swift new file mode 100644 index 00000000..bf6c8f65 --- /dev/null +++ b/MVMCoreUI/Categories/NSLayoutConstraintExtension.swift @@ -0,0 +1,44 @@ +// +// NSLayoutConstraintExtension.swift +// MVMCoreUI +// +// Created by Scott Pfeil on 8/28/19. +// Copyright © 2019 Verizon Wireless. All rights reserved. +// + +import Foundation + +public extension NSLayoutConstraint { + static func pinSubviewsCenter(leftView: UIView, rightView: UIView) { + guard let superView = leftView.superview else { + return + } + leftView.centerYAnchor.constraint(equalTo: superView.centerYAnchor).isActive = true + leftView.leftAnchor.constraint(equalTo: superView.layoutMarginsGuide.leftAnchor).isActive = true + leftView.topAnchor.constraint(greaterThanOrEqualTo: superView.layoutMarginsGuide.topAnchor).isActive = true + superView.layoutMarginsGuide.bottomAnchor.constraint(greaterThanOrEqualTo: leftView.bottomAnchor).isActive = true + + var constraint = leftView.topAnchor.constraint(equalTo: superView.layoutMarginsGuide.topAnchor) + constraint.priority = .defaultLow + constraint.isActive = true + + constraint = superView.layoutMarginsGuide.bottomAnchor.constraint(equalTo: leftView.bottomAnchor) + constraint.priority = .defaultLow + constraint.isActive = true + + rightView.leftAnchor.constraint(greaterThanOrEqualTo: leftView.rightAnchor, constant: 16).isActive = true + + rightView.centerYAnchor.constraint(equalTo: superView.centerYAnchor).isActive = true + superView.layoutMarginsGuide.rightAnchor.constraint(equalTo: rightView.rightAnchor).isActive = true + rightView.topAnchor.constraint(greaterThanOrEqualTo: superView.layoutMarginsGuide.topAnchor).isActive = true + superView.layoutMarginsGuide.bottomAnchor.constraint(greaterThanOrEqualTo: rightView.bottomAnchor).isActive = true + + constraint = rightView.topAnchor.constraint(equalTo: superView.layoutMarginsGuide.topAnchor) + constraint.priority = .defaultLow + constraint.isActive = true + + constraint = superView.layoutMarginsGuide.bottomAnchor.constraint(equalTo: rightView.bottomAnchor) + constraint.priority = .defaultLow + constraint.isActive = true + } +} diff --git a/MVMCoreUI/Molecules/ImageHeadlineBody.swift b/MVMCoreUI/Molecules/HorizontalCombinationViews/ImageHeadlineBody.swift similarity index 100% rename from MVMCoreUI/Molecules/ImageHeadlineBody.swift rename to MVMCoreUI/Molecules/HorizontalCombinationViews/ImageHeadlineBody.swift diff --git a/MVMCoreUI/Molecules/TwoButtonView.swift b/MVMCoreUI/Molecules/HorizontalCombinationViews/TwoButtonView.swift similarity index 100% rename from MVMCoreUI/Molecules/TwoButtonView.swift rename to MVMCoreUI/Molecules/HorizontalCombinationViews/TwoButtonView.swift diff --git a/MVMCoreUI/Molecules/MoleculeCollectionViewCell.swift b/MVMCoreUI/Molecules/Items/MoleculeCollectionViewCell.swift similarity index 100% rename from MVMCoreUI/Molecules/MoleculeCollectionViewCell.swift rename to MVMCoreUI/Molecules/Items/MoleculeCollectionViewCell.swift diff --git a/MVMCoreUI/Molecules/MoleculeTableViewCell.swift b/MVMCoreUI/Molecules/Items/MoleculeTableViewCell.swift similarity index 100% rename from MVMCoreUI/Molecules/MoleculeTableViewCell.swift rename to MVMCoreUI/Molecules/Items/MoleculeTableViewCell.swift diff --git a/MVMCoreUI/Molecules/CornerLabels.swift b/MVMCoreUI/Molecules/LeftRightViews/CornerLabels.swift similarity index 100% rename from MVMCoreUI/Molecules/CornerLabels.swift rename to MVMCoreUI/Molecules/LeftRightViews/CornerLabels.swift diff --git a/MVMCoreUI/Molecules/LeftRightViews/SwitchMolecules/HeadlineBodySwitch.swift b/MVMCoreUI/Molecules/LeftRightViews/SwitchMolecules/HeadlineBodySwitch.swift new file mode 100644 index 00000000..c856832d --- /dev/null +++ b/MVMCoreUI/Molecules/LeftRightViews/SwitchMolecules/HeadlineBodySwitch.swift @@ -0,0 +1,57 @@ +// +// HeadlineBodySwitch.swift +// MVMCoreUI +// +// Created by Scott Pfeil on 8/26/19. +// Copyright © 2019 Verizon Wireless. All rights reserved. +// + +import UIKit + +@objcMembers public class HeadlineBodySwitch: ViewConstrainingView { + let headlineBody = HeadlineBody(frame: .zero) + let mvmSwitch = MVMCoreUISwitch.mvmSwitchDefault() + + // MARK: - MVMCoreViewProtocol + open override func updateView(_ size: CGFloat) { + super.updateView(size) + headlineBody.updateView(size) + mvmSwitch.updateView(size) + } + + public override func setupView() { + super.setupView() + guard mvmSwitch.superview == nil else { + return + } + headlineBody.styleListItem() + addSubview(headlineBody) + addSubview(mvmSwitch) + NSLayoutConstraint.pinSubviewsCenter(leftView: headlineBody, rightView: mvmSwitch) + } + + // MARK: - MVMCoreUIMoleculeViewProtocol + public override func setWithJSON(_ json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable : Any]?) { + super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData) + headlineBody.setWithJSON(json?.optionalDictionaryForKey("headlineBody"), delegateObject: delegateObject, additionalData: additionalData) + mvmSwitch.setWithJSON(json?.optionalDictionaryForKey("switch"), delegateObject: delegateObject, additionalData: additionalData) + } + + public override static func estimatedHeight(forRow json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat { + return MVMCoreUISwitch.estimatedHeight(forRow: json, delegateObject: delegateObject) + } + + public override func setAsMolecule() { + super.setAsMolecule() + headlineBody.setAsMolecule() + (mvmSwitch as MVMCoreUIMoleculeViewProtocol).setAsMolecule?() + headlineBody.styleListItem() + } + + public override func reset() { + super.reset() + headlineBody.reset() + (mvmSwitch as MVMCoreUIMoleculeViewProtocol).reset?() + headlineBody.styleListItem() + } +} diff --git a/MVMCoreUI/Molecules/LeftRightViews/SwitchMolecules/HeadlineBodyTextButtonSwitch.swift b/MVMCoreUI/Molecules/LeftRightViews/SwitchMolecules/HeadlineBodyTextButtonSwitch.swift new file mode 100644 index 00000000..87ca50d5 --- /dev/null +++ b/MVMCoreUI/Molecules/LeftRightViews/SwitchMolecules/HeadlineBodyTextButtonSwitch.swift @@ -0,0 +1,59 @@ +// +// SwitchLineItem.swift +// MVMCoreUI +// +// Created by Priya on 5/6/19. +// Copyright © 2019 Verizon Wireless. All rights reserved. +// + +import UIKit + +@objcMembers public class HeadlineBodyTextButtonSwitch: ViewConstrainingView { + let headlineBodyTextButton = HeadlineBodyTextButton(frame: .zero) + let mvmSwitch = MVMCoreUISwitch.mvmSwitchDefault() + + // MARK: - MVMCoreViewProtocol + open override func updateView(_ size: CGFloat) { + super.updateView(size) + headlineBodyTextButton.updateView(size) + mvmSwitch.updateView(size) + } + + public override func setupView() { + super.setupView() + guard mvmSwitch.superview == nil else { + return + } + headlineBodyTextButton.headlineBody.styleListItem() + addSubview(headlineBodyTextButton) + addSubview(mvmSwitch) + NSLayoutConstraint.pinSubviewsCenter(leftView: headlineBodyTextButton, rightView: mvmSwitch) + } + + // MARK: - MVMCoreUIMoleculeViewProtocol + public override func setWithJSON(_ json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable : Any]?) { + super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData) + headlineBodyTextButton.setWithJSON(json?.optionalDictionaryForKey("headlineBodyTextButton"), delegateObject: delegateObject, additionalData: additionalData) + mvmSwitch.setWithJSON(json?.optionalDictionaryForKey("switch"), delegateObject: delegateObject, additionalData: additionalData) + } + + public override static func estimatedHeight(forRow json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat { + return MVMCoreUISwitch.estimatedHeight(forRow: json, delegateObject: delegateObject) + } + + public override func setAsMolecule() { + super.setAsMolecule() + headlineBodyTextButton.setAsMolecule() + (mvmSwitch as MVMCoreUIMoleculeViewProtocol).setAsMolecule?() + headlineBodyTextButton.headlineBody.styleListItem() + } + + public override func reset() { + super.reset() + headlineBodyTextButton.reset() + (mvmSwitch as MVMCoreUIMoleculeViewProtocol).reset?() + headlineBodyTextButton.headlineBody.styleListItem() + } +} + + diff --git a/MVMCoreUI/Molecules/LeftRightViews/SwitchMolecules/LabelSwitch.swift b/MVMCoreUI/Molecules/LeftRightViews/SwitchMolecules/LabelSwitch.swift new file mode 100644 index 00000000..017eee99 --- /dev/null +++ b/MVMCoreUI/Molecules/LeftRightViews/SwitchMolecules/LabelSwitch.swift @@ -0,0 +1,57 @@ +// +// LabelSwitch.swift +// MVMCoreUI +// +// Created by Scott Pfeil on 8/26/19. +// Copyright © 2019 Verizon Wireless. All rights reserved. +// + +import UIKit + +@objcMembers public class LabelSwitch: ViewConstrainingView { + let label = Label.commonLabelB1(true) + let mvmSwitch = MVMCoreUISwitch.mvmSwitchDefault() + + // MARK: - MVMCoreViewProtocol + open override func updateView(_ size: CGFloat) { + super.updateView(size) + label.updateView(size) + mvmSwitch.updateView(size) + } + + public override func setupView() { + super.setupView() + guard mvmSwitch.superview == nil else { + return + } + addSubview(label) + addSubview(mvmSwitch) + label.setContentHuggingPriority(UILayoutPriority.required, for: NSLayoutConstraint.Axis.vertical) + NSLayoutConstraint.pinSubviewsCenter(leftView: label, rightView: mvmSwitch) + } + + // MARK: - MVMCoreUIMoleculeViewProtocol + public override func setWithJSON(_ json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable : Any]?) { + super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData) + label.setWithJSON(json?.optionalDictionaryForKey("label"), delegateObject: delegateObject, additionalData: additionalData) + mvmSwitch.setWithJSON(json?.optionalDictionaryForKey("switch"), delegateObject: delegateObject, additionalData: additionalData) + } + + public override static func estimatedHeight(forRow json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat { + return MVMCoreUISwitch.estimatedHeight(forRow: json, delegateObject: delegateObject) + } + + public override func setAsMolecule() { + super.setAsMolecule() + label.setAsMolecule() + (mvmSwitch as MVMCoreUIMoleculeViewProtocol).setAsMolecule?() + label.styleB1(true) + } + + public override func reset() { + super.reset() + label.reset() + (mvmSwitch as MVMCoreUIMoleculeViewProtocol).reset?() + label.styleB1(true) + } +} diff --git a/MVMCoreUI/Molecules/Switch.swift b/MVMCoreUI/Molecules/Switch.swift deleted file mode 100644 index 5b23b1d5..00000000 --- a/MVMCoreUI/Molecules/Switch.swift +++ /dev/null @@ -1,91 +0,0 @@ -// -// Switch.swift -// MVMCoreUI -// -// Created by Priya on 5/23/19. -// Copyright © 2019 Verizon Wireless. All rights reserved. -// - -import UIKit - -@objcMembers public class Switch: ViewConstrainingView, FormValidationProtocol{ - public var mvmSwitch = MVMCoreUISwitch() - var isRequired = false - var delegateObject: DelegateObject? - - @objc func switchChanged() { - let delegate = delegateObject as? MVMCoreUIDelegateObject - if let delegate = delegate { - let formValidator = delegate.formValidationProtocol?.formValidatorModel?() - formValidator?.enableByValidation() - } - } - - open override func setupView() { - super.setupView() - mvmSwitch.addTarget(self, action: #selector(Switch.switchChanged), for: .valueChanged) - self.clipsToBounds = true - addSubview(mvmSwitch) - mvmSwitch.translatesAutoresizingMaskIntoConstraints = false - setupContainerConstraints() - } - - public override func updateView(_ size: CGFloat) { - super.updateView(size) - mvmSwitch.updateView(size) - } - - open override func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) { - super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData) - isRequired = json?[KeyRequired] as? Bool ?? false - self.delegateObject = delegateObject - if let delegateObject = delegateObject { - FormValidator.setupValidation(molecule: self, delegate: delegateObject.formValidationProtocol) - } - if let onColorString = json?.optionalStringForKey("onTintColor") { - mvmSwitch.onTintColor = .mfGet(forHex: onColorString) - } - if let offColorString = json?.optionalStringForKey("offTintColor") { - mvmSwitch.offTintColor = .mfGet(forHex: offColorString) - } - if let onKnobColorString = json?.optionalStringForKey("onKnobTintColor") { - mvmSwitch.onKnobTintColor = .mfGet(forHex: onKnobColorString) - } - if let offKnobColorString = json?.optionalStringForKey("offKnobTintColor") { - mvmSwitch.offKnobTintColor = .mfGet(forHex: offKnobColorString) - } - mvmSwitch.setState(json?.optionalBoolForKey("state") ?? false, animated: true) - } - - func setupContainerConstraints() { - mvmSwitch.topAnchor.constraint(equalTo: topAnchor).isActive = true - mvmSwitch.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true - mvmSwitch.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true - mvmSwitch.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true - } - - public func isValidField() -> Bool { - return (isRequired == false) ? true : mvmSwitch.isOn - } - - public func formFieldName() -> String? { - return json?.optionalStringForKey(KeyFieldKey) - } - - public func formFieldValue() -> Any? { - return mvmSwitch.isOn - } - - public override func needsToBeConstrained() -> Bool { - return true - } - - public override func alignment() -> UIStackView.Alignment { - return UIStackView.Alignment.leading - } - - public override static func estimatedHeight(forRow json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat { - return MVMCoreUISwitch.getHeight() - } -} - diff --git a/MVMCoreUI/Molecules/SwitchMolecules/SwitchLineItem.swift b/MVMCoreUI/Molecules/SwitchMolecules/SwitchLineItem.swift deleted file mode 100644 index 8c15e8ec..00000000 --- a/MVMCoreUI/Molecules/SwitchMolecules/SwitchLineItem.swift +++ /dev/null @@ -1,121 +0,0 @@ -// -// SwitchLineItem.swift -// MVMCoreUI -// -// Created by Priya on 5/6/19. -// Copyright © 2019 Verizon Wireless. All rights reserved. -// - -import UIKit - -@objcMembers public class SwitchLineItem: ViewConstrainingView, FormValidationProtocol{ - public var mvmSwitch = Switch() - public var label = Label() - public var leftContainerView = UIView() - public var mfTextButton = MFTextButton(nil, constrainHeight: true, forWidth: 0) - var isRequired = false - var delegateObject: DelegateObject? - - @objc func switchChanged() { - let delegate = delegateObject as? MVMCoreUIDelegateObject - if let delegate = delegate { - let formValidator = delegate.formValidationProtocol?.formValidatorModel?() - formValidator?.enableByValidation() - } - } - - open override func setupView() { - super.setupView() - leftContainerView.addSubview(label) - leftContainerView.addSubview(mfTextButton) - addSubview(leftContainerView) - addSubview(mvmSwitch) - - leftContainerView.translatesAutoresizingMaskIntoConstraints = false - mvmSwitch.translatesAutoresizingMaskIntoConstraints = false - mfTextButton.translatesAutoresizingMaskIntoConstraints = false - label.translatesAutoresizingMaskIntoConstraints = false - setupContainerConstraints() - } - - public override func updateView(_ size: CGFloat) { - super.updateView(size) - label.updateView(size) - mvmSwitch.updateView(size) - mfTextButton.updateView(size) - } - - open override func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) { - super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData) - mvmSwitch.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData) - label.setWithJSON(json?.optionalDictionaryForKey("label"), delegateObject: delegateObject, additionalData: additionalData) - mfTextButton.setWithJSON(json?.optionalDictionaryForKey("textButton"), delegateObject: delegateObject, additionalData: additionalData) - if (label.text?.count ?? 0) <= 0 && (mfTextButton.titleLabel?.text?.count ?? 0) <= 0 { - mvmSwitch.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 0).isActive = true - } - } - - func setupContainerConstraints() { - leftContainerView.topAnchor.constraint(greaterThanOrEqualTo: topAnchor).isActive = true - - var constraint = leftContainerView.topAnchor.constraint(equalTo: topAnchor) - constraint.priority = UILayoutPriority(249) - constraint.isActive = true - - mvmSwitch.topAnchor.constraint(greaterThanOrEqualTo: topAnchor).isActive = true - - constraint = mvmSwitch.topAnchor.constraint(equalTo: topAnchor) - constraint.priority = UILayoutPriority(249) - constraint.isActive = true - - trailingAnchor.constraint(equalTo: mvmSwitch.trailingAnchor).isActive = true - - constraint = bottomAnchor.constraint(equalTo: mvmSwitch.bottomAnchor) - constraint.priority = UILayoutPriority(249) - constraint.isActive = true - - bottomAnchor.constraint(greaterThanOrEqualTo: mvmSwitch.bottomAnchor).isActive = true - - constraint = bottomAnchor.constraint(equalTo: leftContainerView.bottomAnchor) - constraint.isActive = true - - bottomAnchor.constraint(greaterThanOrEqualTo: leftContainerView.bottomAnchor).isActive = true - leftContainerView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true - - NSLayoutConstraint.constraintPinSubview(leftContainerView, pinCenterX: false, pinCenterY: true) - constraint = mvmSwitch.leadingAnchor.constraint(greaterThanOrEqualTo: leftContainerView.trailingAnchor) - constraint.priority = UILayoutPriority(999) - constraint.isActive = true - NSLayoutConstraint.constraintPinSubview(mvmSwitch, pinCenterX: false, pinCenterY: true) - - leftContainerView.topAnchor.constraint(equalTo: label.topAnchor).isActive = true - leftContainerView.trailingAnchor.constraint(greaterThanOrEqualTo: label.trailingAnchor).isActive = true - - constraint = leftContainerView.trailingAnchor.constraint(equalTo: label.trailingAnchor) - constraint.priority = UILayoutPriority(249) - constraint.isActive = true - - leftContainerView.trailingAnchor.constraint(greaterThanOrEqualTo: mfTextButton.trailingAnchor).isActive = true - - constraint = leftContainerView.trailingAnchor.constraint(equalTo: mfTextButton.trailingAnchor) - constraint.priority = UILayoutPriority(249) - constraint.isActive = true - - leftContainerView.bottomAnchor.constraint(equalTo: mfTextButton.bottomAnchor).isActive = true - mfTextButton.leadingAnchor.constraint(equalTo: leftContainerView.leadingAnchor).isActive = true - label.leadingAnchor.constraint(equalTo: leftContainerView.leadingAnchor).isActive = true - mfTextButton.topAnchor.constraint(equalTo: label.bottomAnchor).isActive = true - leftContainerView.setContentHuggingPriority(.defaultHigh, for: .horizontal) - mvmSwitch.setContentHuggingPriority(.defaultLow, for: .horizontal) - } - - public override func needsToBeConstrained() -> Bool { - return true - } - - public override func alignment() -> UIStackView.Alignment { - return UIStackView.Alignment.leading - } -} - - diff --git a/MVMCoreUI/Molecules/HeadlineBody.swift b/MVMCoreUI/Molecules/VerticalCombinationViews/HeadlineBody.swift similarity index 89% rename from MVMCoreUI/Molecules/HeadlineBody.swift rename to MVMCoreUI/Molecules/VerticalCombinationViews/HeadlineBody.swift index d3c37261..ac0e416e 100644 --- a/MVMCoreUI/Molecules/HeadlineBody.swift +++ b/MVMCoreUI/Molecules/VerticalCombinationViews/HeadlineBody.swift @@ -18,6 +18,28 @@ open class HeadlineBody: ViewConstrainingView { var leftConstraintMessage: NSLayoutConstraint? var rightConstraintMessage: NSLayoutConstraint? + func styleLandingPageHeader() { + headlineLabel.styleH1(true) + messageLabel.styleB2(true) + spaceBetweenLabelsConstant = PaddingTwo + } + + func stylePageHeader() { + headlineLabel.styleH2(true) + messageLabel.styleB2(true) + spaceBetweenLabelsConstant = PaddingTwo + } + + func styleListItem() { + headlineLabel.styleB1(true) + messageLabel.styleB2(true) + spaceBetweenLabelsConstant = 0 + } + + func hasText() -> Bool { + return headlineLabel.hasText || messageLabel.hasText + } + // MARK: - MVMCoreViewProtocol open override func updateView(_ size: CGFloat) { super.updateView(size) @@ -95,9 +117,7 @@ open class HeadlineBody: ViewConstrainingView { open override func reset() { super.reset() - headlineLabel.styleH2(true) - messageLabel.styleB2(true) - spaceBetweenLabelsConstant = PaddingTwo + stylePageHeader() } public override static func estimatedHeight(forRow json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat { diff --git a/MVMCoreUI/Molecules/VerticalCombinationViews/HeadlineBodyTextButton.swift b/MVMCoreUI/Molecules/VerticalCombinationViews/HeadlineBodyTextButton.swift new file mode 100644 index 00000000..fbfc279b --- /dev/null +++ b/MVMCoreUI/Molecules/VerticalCombinationViews/HeadlineBodyTextButton.swift @@ -0,0 +1,78 @@ +// +// HeadlineBodyTextButton.swift +// MVMCoreUI +// +// Created by Scott Pfeil on 8/28/19. +// Copyright © 2019 Verizon Wireless. All rights reserved. +// + +import UIKit + +@objcMembers public class HeadlineBodyTextButton: ViewConstrainingView { + + let headlineBody = HeadlineBody(frame: .zero) + let textButton = MFTextButton(nil, constrainHeight: true, forWidth: MVMCoreUIUtility.getWidth()) + var spaceBetweenConstant: CGFloat = 0.0 + var spaceBetween: NSLayoutConstraint? + + // MARK: - MVMCoreViewProtocol + open override func updateView(_ size: CGFloat) { + super.updateView(size) + headlineBody.updateView(size) + textButton.updateView(size) + setSpacing() + } + + open override func setupView() { + super.setupView() + guard subviews.count == 0 else { + return + } + addSubview(headlineBody) + addSubview(textButton) + headlineBody.styleListItem() + + headlineBody.topAnchor.constraint(equalTo: layoutMarginsGuide.topAnchor, constant: 0).isActive = true + headlineBody.leftAnchor.constraint(equalTo: layoutMarginsGuide.leftAnchor).isActive = true + var constraint = layoutMarginsGuide.rightAnchor.constraint(equalTo: headlineBody.rightAnchor) + constraint.priority = .defaultHigh + constraint.isActive = true + + spaceBetween = textButton.topAnchor.constraint(equalTo: headlineBody.bottomAnchor, constant: spaceBetweenConstant) + spaceBetween?.isActive = true + + textButton.leftAnchor.constraint(equalTo: layoutMarginsGuide.leftAnchor).isActive = true + layoutMarginsGuide.bottomAnchor.constraint(equalTo: textButton.bottomAnchor).isActive = true + layoutMarginsGuide.rightAnchor.constraint(greaterThanOrEqualTo: textButton.rightAnchor).isActive = true + constraint = layoutMarginsGuide.rightAnchor.constraint(equalTo: textButton.rightAnchor) + constraint.priority = .defaultHigh + constraint.isActive = true + } + + // MARK: - Constraining + public func setSpacing() { + if headlineBody.hasText() && (textButton.titleLabel?.text?.count ?? 0) > 0 { + spaceBetween?.constant = spaceBetweenConstant + } else { + spaceBetween?.constant = 0 + } + } + + // MARK: - MVMCoreUIMoleculeViewProtocol + open override func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) { + super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData) + headlineBody.setWithJSON(json?.optionalDictionaryForKey("headlineBody"), delegateObject: delegateObject, additionalData: additionalData) + textButton.setWithJSON(json?.optionalDictionaryForKey("textButton"), delegateObject: delegateObject, additionalData: additionalData) + } + + open override func reset() { + super.reset() + headlineBody.reset() + headlineBody.styleListItem() + textButton.reset() + } + + public override static func estimatedHeight(forRow json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat { + return 58 + } +} diff --git a/MVMCoreUI/Molecules/Carousel.swift b/MVMCoreUI/Organisms/Carousel.swift similarity index 100% rename from MVMCoreUI/Molecules/Carousel.swift rename to MVMCoreUI/Organisms/Carousel.swift diff --git a/MVMCoreUI/Molecules/MoleculeStackView.swift b/MVMCoreUI/Organisms/MoleculeStackView.swift similarity index 100% rename from MVMCoreUI/Molecules/MoleculeStackView.swift rename to MVMCoreUI/Organisms/MoleculeStackView.swift diff --git a/MVMCoreUI/OtherHandlers/MVMCoreUIMoleculeMappingObject.m b/MVMCoreUI/OtherHandlers/MVMCoreUIMoleculeMappingObject.m index 123940f4..fe84278b 100644 --- a/MVMCoreUI/OtherHandlers/MVMCoreUIMoleculeMappingObject.m +++ b/MVMCoreUI/OtherHandlers/MVMCoreUIMoleculeMappingObject.m @@ -41,10 +41,8 @@ @"checkbox" : MVMCoreUICheckBox.class, @"cornerLabels" : CornerLabels.class, @"progressBar": ProgressBar.class, - @"textField": MFTextField.class, @"checkbox": MVMCoreUICheckBox.class, @"listItem": MoleculeTableViewCell.class, - @"switchLineItem": SwitchLineItem.class, @"switch": MVMCoreUISwitch.class, @"leftRightLabelView": LeftRightLabelView.class, @"actionDetailWithImage": ActionDetailWithImage.class, @@ -55,7 +53,11 @@ @"carouselItem": MoleculeCollectionViewCell.class, @"barsPager": MVMCoreUIPageControl.class, @"scroller": Scroller.class, - @"imageHeadlineBody": ImageHeadlineBody.class + @"imageHeadlineBody": ImageHeadlineBody.class, + @"labelSwitch": LabelSwitch.class, + @"headlineBodySwitch": HeadlineBodySwitch.class, + @"headlineBodyTextButton": HeadlineBodyTextButton.class, + @"headlineBodyTextButtonSwitch": HeadlineBodyTextButtonSwitch.class } mutableCopy]; }); return mapping; From 3234a6ee7ec48fcabd7c61229b026e5727d9ddeb Mon Sep 17 00:00:00 2001 From: "Pfeil, Scott Robert" Date: Thu, 29 Aug 2019 08:35:27 -0400 Subject: [PATCH 04/20] estimated heights update --- .../LeftRightViews/SwitchMolecules/HeadlineBodySwitch.swift | 2 +- .../SwitchMolecules/HeadlineBodyTextButtonSwitch.swift | 2 +- .../VerticalCombinationViews/HeadlineBodyTextButton.swift | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/MVMCoreUI/Molecules/LeftRightViews/SwitchMolecules/HeadlineBodySwitch.swift b/MVMCoreUI/Molecules/LeftRightViews/SwitchMolecules/HeadlineBodySwitch.swift index c856832d..ffab9920 100644 --- a/MVMCoreUI/Molecules/LeftRightViews/SwitchMolecules/HeadlineBodySwitch.swift +++ b/MVMCoreUI/Molecules/LeftRightViews/SwitchMolecules/HeadlineBodySwitch.swift @@ -38,7 +38,7 @@ import UIKit } public override static func estimatedHeight(forRow json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat { - return MVMCoreUISwitch.estimatedHeight(forRow: json, delegateObject: delegateObject) + return 30 } public override func setAsMolecule() { diff --git a/MVMCoreUI/Molecules/LeftRightViews/SwitchMolecules/HeadlineBodyTextButtonSwitch.swift b/MVMCoreUI/Molecules/LeftRightViews/SwitchMolecules/HeadlineBodyTextButtonSwitch.swift index 87ca50d5..754f508b 100644 --- a/MVMCoreUI/Molecules/LeftRightViews/SwitchMolecules/HeadlineBodyTextButtonSwitch.swift +++ b/MVMCoreUI/Molecules/LeftRightViews/SwitchMolecules/HeadlineBodyTextButtonSwitch.swift @@ -38,7 +38,7 @@ import UIKit } public override static func estimatedHeight(forRow json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat { - return MVMCoreUISwitch.estimatedHeight(forRow: json, delegateObject: delegateObject) + return HeadlineBodyTextButton.estimatedHeight(forRow: json, delegateObject: delegateObject) } public override func setAsMolecule() { diff --git a/MVMCoreUI/Molecules/VerticalCombinationViews/HeadlineBodyTextButton.swift b/MVMCoreUI/Molecules/VerticalCombinationViews/HeadlineBodyTextButton.swift index fbfc279b..bb638624 100644 --- a/MVMCoreUI/Molecules/VerticalCombinationViews/HeadlineBodyTextButton.swift +++ b/MVMCoreUI/Molecules/VerticalCombinationViews/HeadlineBodyTextButton.swift @@ -73,6 +73,6 @@ import UIKit } public override static func estimatedHeight(forRow json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat { - return 58 + return 60 } } From 3e426cb80b032bf6a5b192d866e0e67c89a2b864 Mon Sep 17 00:00:00 2001 From: "Pfeil, Scott Robert" Date: Thu, 29 Aug 2019 10:19:28 -0400 Subject: [PATCH 05/20] Fix to two button view --- .../TwoButtonView.swift | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/MVMCoreUI/Molecules/HorizontalCombinationViews/TwoButtonView.swift b/MVMCoreUI/Molecules/HorizontalCombinationViews/TwoButtonView.swift index 4b4f64d9..575c01ec 100644 --- a/MVMCoreUI/Molecules/HorizontalCombinationViews/TwoButtonView.swift +++ b/MVMCoreUI/Molecules/HorizontalCombinationViews/TwoButtonView.swift @@ -8,12 +8,13 @@ import UIKit -@objcMembers open class TwoButtonView: ButtonView { - open var secondaryButton: PrimaryButton? +@objcMembers open class TwoButtonView: ViewConstrainingView { + open var primaryButton: PrimaryButton? = PrimaryButton.button() + open var secondaryButton: PrimaryButton? = PrimaryButton.button() open var viewForButtons: UIView? public var heightConstraint: NSLayoutConstraint? - public override init() { + public init() { super.init(frame: .zero) } @@ -34,25 +35,32 @@ import UIKit open override func updateView(_ size: CGFloat) { super.updateView(size) MVMCoreDispatchUtility.performBlock(onMainThread: { + self.primaryButton?.updateView(size) self.secondaryButton?.updateView(size) }) } + open override func setupView() { + super.setupView() + setupButton() + } + // MARK: - MVMCoreUIMoleculeViewProtocol open override func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) { - super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData) let primaryButtonMap = json?.optionalDictionaryForKey("primaryButton") let secondaryButtonMap = json?.optionalDictionaryForKey("secondaryButton") set(primaryButtonJSON: primaryButtonMap, secondaryButtonJSON: secondaryButtonMap, delegateObject: delegateObject, additionalData: additionalData) + super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData) } open override func reset() { super.reset() + primaryButton?.setAsStandardCustom() secondaryButton?.setAsSecondaryCustom() } // MARK: - Constraining - override func setupButton() { + func setupButton() { setupWithTwoButtons() } From 4f47aa9ad5937414f0475955fed91dd9138046cc Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Thu, 29 Aug 2019 10:52:20 -0400 Subject: [PATCH 06/20] changed key. --- MVMCoreUI/Molecules/ActionDetailWithImage.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MVMCoreUI/Molecules/ActionDetailWithImage.swift b/MVMCoreUI/Molecules/ActionDetailWithImage.swift index 3804ed00..6162fbc7 100644 --- a/MVMCoreUI/Molecules/ActionDetailWithImage.swift +++ b/MVMCoreUI/Molecules/ActionDetailWithImage.swift @@ -156,7 +156,7 @@ import UIKit guard let dictionary = json else { return } - if let padding = dictionary.optionalCGFloatForKey("bottomTitlePadding") { + if let padding = dictionary.optionalCGFloatForKey("buttomHeaderPadding") { buttomHeaderPadding = padding } From 8e216f8b9024841adcfa74a8716d31a021ccc281 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Thu, 29 Aug 2019 14:13:44 -0400 Subject: [PATCH 07/20] Corrections made. --- MVMCoreUI/Molecules/ActionDetailWithImage.swift | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/MVMCoreUI/Molecules/ActionDetailWithImage.swift b/MVMCoreUI/Molecules/ActionDetailWithImage.swift index 6162fbc7..eb46bdc8 100644 --- a/MVMCoreUI/Molecules/ActionDetailWithImage.swift +++ b/MVMCoreUI/Molecules/ActionDetailWithImage.swift @@ -23,7 +23,7 @@ import UIKit // MARK: - Properties //------------------------------------------------------ - var buttomHeaderPadding: CGFloat = PaddingTwo + var buttonHeaderPadding: CGFloat = PaddingTwo //------------------------------------------------------ // MARK: - Constraints @@ -81,7 +81,7 @@ import UIKit header.leadingAnchor.constraint(equalTo: leftContainer.leadingAnchor).isActive = true leftContainer.trailingAnchor.constraint(equalTo: header.trailingAnchor).isActive = true - buttonTopConstraint = button.topAnchor.constraint(equalTo: header.bottomAnchor, constant: PaddingTwo) + buttonTopConstraint = button.topAnchor.constraint(equalTo: header.bottomAnchor, constant: buttonHeaderPadding) buttonTopConstraint?.isActive = true button.leadingAnchor.constraint(equalTo: leftContainer.leadingAnchor).isActive = true @@ -107,8 +107,8 @@ import UIKit button.updateView(size) imageLoader.updateView(size) leftContainer.updateView(size) - - buttonTopConstraint?.constant = header.headlineLabel.hasText || header.messageLabel.hasText ? PaddingTwo : 0 + + buttonTopConstraint?.constant = header.hasText() ? PaddingTwo : 0 } public override static func estimatedHeight(forRow json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat { @@ -127,7 +127,7 @@ import UIKit button.isHidden = false imageLoader.imageView.contentMode = .scaleAspectFit imageLoader.addSizeConstraintsForAspectRatio = true - buttomHeaderPadding = PaddingTwo + buttonHeaderPadding = PaddingTwo } override open func reset() { @@ -156,8 +156,8 @@ import UIKit guard let dictionary = json else { return } - if let padding = dictionary.optionalCGFloatForKey("buttomHeaderPadding") { - buttomHeaderPadding = padding + if let padding = dictionary.optionalCGFloatForKey("buttonHeaderPadding") { + buttonHeaderPadding = padding } header.setWithJSON(dictionary.optionalDictionaryForKey("headlineBody"), delegateObject: delegateObject, additionalData: additionalData) From 2792808c9eb585b9f9c92b99a125af0009b7d502 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Thu, 29 Aug 2019 14:20:42 -0400 Subject: [PATCH 08/20] Further changes made. --- MVMCoreUI/Molecules/ActionDetailWithImage.swift | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/MVMCoreUI/Molecules/ActionDetailWithImage.swift b/MVMCoreUI/Molecules/ActionDetailWithImage.swift index eb46bdc8..ec91c479 100644 --- a/MVMCoreUI/Molecules/ActionDetailWithImage.swift +++ b/MVMCoreUI/Molecules/ActionDetailWithImage.swift @@ -108,7 +108,7 @@ import UIKit imageLoader.updateView(size) leftContainer.updateView(size) - buttonTopConstraint?.constant = header.hasText() ? PaddingTwo : 0 + buttonTopConstraint?.constant = header.hasText() ? buttonHeaderPadding : 0 } public override static func estimatedHeight(forRow json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat { @@ -137,7 +137,6 @@ import UIKit button.reset() imageLeadingConstraint?.constant = 16 imageLoader.reset() - setDefaultState() } @@ -147,7 +146,6 @@ import UIKit header.setAsMolecule() button.setAsMolecule() imageLoader.setAsMolecule() - setDefaultState() } From 255cde58e67fe0ace988c75dd600f1bd86734290 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 3 Sep 2019 14:56:48 -0400 Subject: [PATCH 09/20] Aligning with text to image change. --- MVMCoreUI/TopAlert/MVMCoreUITopAlertMainView.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MVMCoreUI/TopAlert/MVMCoreUITopAlertMainView.m b/MVMCoreUI/TopAlert/MVMCoreUITopAlertMainView.m index 8583cc2e..fa26a7f7 100644 --- a/MVMCoreUI/TopAlert/MVMCoreUITopAlertMainView.m +++ b/MVMCoreUI/TopAlert/MVMCoreUITopAlertMainView.m @@ -235,7 +235,7 @@ if (color) { self.button.layer.borderColor = color.CGColor; [self.button setTitleColor:color forState:UIControlStateNormal]; - [self.closeButton setTitleColor:color forState:UIControlStateNormal]; + [self.closeButton setTintColor:color]; } }]; } From 658ed16bbdbe9b08bf41cc346358a64d1d9f8a71 Mon Sep 17 00:00:00 2001 From: "Pfeil, Scott Robert" Date: Tue, 3 Sep 2019 15:14:12 -0400 Subject: [PATCH 10/20] accordion list item --- MVMCoreUI.xcodeproj/project.pbxproj | 4 ++ .../AccordionMoleculeTableViewCell.swift | 40 +++++++++++++++++++ .../Items/MoleculeTableViewCell.swift | 18 ++++++--- .../MVMCoreUIMoleculeMappingObject.m | 1 + .../OtherHandlers/MoleculeDelegateProtocol.h | 4 ++ .../Templates/MoleculeListTemplate.swift | 30 ++++++++++++++ 6 files changed, 91 insertions(+), 6 deletions(-) create mode 100644 MVMCoreUI/Molecules/Items/AccordionMoleculeTableViewCell.swift diff --git a/MVMCoreUI.xcodeproj/project.pbxproj b/MVMCoreUI.xcodeproj/project.pbxproj index 2913a9a6..9768fcf8 100644 --- a/MVMCoreUI.xcodeproj/project.pbxproj +++ b/MVMCoreUI.xcodeproj/project.pbxproj @@ -27,6 +27,7 @@ D224798C231450C8003FCCF9 /* HeadlineBodySwitch.swift in Sources */ = {isa = PBXBuildFile; fileRef = D224798B231450C8003FCCF9 /* HeadlineBodySwitch.swift */; }; D22479942316AE5E003FCCF9 /* NSLayoutConstraintExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22479932316AE5E003FCCF9 /* NSLayoutConstraintExtension.swift */; }; D22479962316AF6E003FCCF9 /* HeadlineBodyTextButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22479952316AF6D003FCCF9 /* HeadlineBodyTextButton.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, ); }; }; @@ -208,6 +209,7 @@ D224798B231450C8003FCCF9 /* HeadlineBodySwitch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadlineBodySwitch.swift; sourceTree = ""; }; D22479932316AE5E003FCCF9 /* NSLayoutConstraintExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSLayoutConstraintExtension.swift; sourceTree = ""; }; D22479952316AF6D003FCCF9 /* HeadlineBodyTextButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadlineBodyTextButton.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 = ""; }; @@ -448,6 +450,7 @@ children = ( D2A6390422CBCE160052ED1F /* MoleculeCollectionViewCell.swift */, D2E1FADC2268B25E00AEFD8C /* MoleculeTableViewCell.swift */, + D224799A231965AD003FCCF9 /* AccordionMoleculeTableViewCell.swift */, ); path = Items; sourceTree = ""; @@ -994,6 +997,7 @@ DBC4391922442197001AB423 /* DashLine.swift in Sources */, D29DF29621E7ADB8003B2FB9 /* StackableViewController.m in Sources */, D2E1FADB2260D3D200AEFD8C /* MVMCoreUIDelegateObject.swift in Sources */, + D224799B231965AD003FCCF9 /* AccordionMoleculeTableViewCell.swift in Sources */, D22D1F1F220343560077CEC0 /* MVMCoreUICheckMarkView.m in Sources */, D282AAB4223FDDAE00C46919 /* MFLoadImageView.swift in Sources */, D29DF11721E6805F003B2FB9 /* UIColor+MFConvenience.m in Sources */, diff --git a/MVMCoreUI/Molecules/Items/AccordionMoleculeTableViewCell.swift b/MVMCoreUI/Molecules/Items/AccordionMoleculeTableViewCell.swift new file mode 100644 index 00000000..630dfb7d --- /dev/null +++ b/MVMCoreUI/Molecules/Items/AccordionMoleculeTableViewCell.swift @@ -0,0 +1,40 @@ +// +// AccordionMoleculeTableViewCell.swift +// MVMCoreUI +// +// Created by Scott Pfeil on 8/30/19. +// Copyright © 2019 Verizon Wireless. All rights reserved. +// + +import UIKit + +@objcMembers public class AccordionMoleculeTableViewCell: MoleculeTableViewCell { + let accordionButton = createAccordionButton() + + static func createAccordionButton() -> MFCustomButton { + let accordionButton = MFCustomButton(type: .custom) + accordionButton.setTitle("+", for: .normal) + accordionButton.setTitleColor(.black, for: .normal) + accordionButton.frame = CGRect(x: 0, y: 0, width: 20, height: 20) + return accordionButton + } + + override public func setupView() { + customAccessoryView = true + super.setupView() + accessoryView = accordionButton + } + + public override func didSelectCell(atIndex indexPath: IndexPath, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable : Any]?) { + accordionButton.isSelected = !accordionButton.isSelected + accordionButton.setTitle(accordionButton.isSelected ? "-" : "+", for: .normal) + guard let molecules = json?.optionalArrayForKey(KeyMolecules) as? [[AnyHashable: Any]] else { + return + } + if accordionButton.isSelected { + delegateObject?.moleculeDelegate?.addMolecules?(molecules, senderIndexPath: indexPath) + } else { + delegateObject?.moleculeDelegate?.removeMolecules?(molecules, senderIndexPath: indexPath) + } + } +} diff --git a/MVMCoreUI/Molecules/Items/MoleculeTableViewCell.swift b/MVMCoreUI/Molecules/Items/MoleculeTableViewCell.swift index c1054e33..167e0ea8 100644 --- a/MVMCoreUI/Molecules/Items/MoleculeTableViewCell.swift +++ b/MVMCoreUI/Molecules/Items/MoleculeTableViewCell.swift @@ -32,6 +32,9 @@ import UIKit case Between = "between" } + /// For subclasses that want to use a custom accessory view. + open var customAccessoryView = false + // MARK: - Inits public override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) @@ -103,10 +106,12 @@ import UIKit } // Add the caret if there is an action and it's not declared hidden. - if let _ = json?.optionalDictionaryForKey("actionMap"), !json!.boolForKey("hideArrow") { - addCaretViewAccessory() - } else { - accessoryView = nil + if !customAccessoryView { + if let _ = json?.optionalDictionaryForKey("actionMap"), !json!.boolForKey("hideArrow") { + addCaretViewAccessory() + } else { + accessoryView = nil + } } // override the separator @@ -152,9 +157,10 @@ import UIKit public static func name(forReuse molecule: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?) -> String? { guard let molecule = molecule?.optionalDictionaryForKey(KeyMolecule) else { - return nil + return "\(self)<>" } - return MVMCoreUIMoleculeMappingObject.shared()?.getMoleculeClass(withJSON: molecule)?.name?(forReuse: molecule, delegateObject: delegateObject) ?? molecule.optionalStringForKey(KeyMoleculeName) + let moleculeName = MVMCoreUIMoleculeMappingObject.shared()?.getMoleculeClass(withJSON: molecule)?.name?(forReuse: molecule, delegateObject: delegateObject) ?? molecule.optionalStringForKey(KeyMoleculeName) ?? "" + return "\(self)<\(moleculeName)>" } public static func requiredModules(_ json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?, error: AutoreleasingUnsafeMutablePointer?) -> [String]? { diff --git a/MVMCoreUI/OtherHandlers/MVMCoreUIMoleculeMappingObject.m b/MVMCoreUI/OtherHandlers/MVMCoreUIMoleculeMappingObject.m index fe84278b..9175781b 100644 --- a/MVMCoreUI/OtherHandlers/MVMCoreUIMoleculeMappingObject.m +++ b/MVMCoreUI/OtherHandlers/MVMCoreUIMoleculeMappingObject.m @@ -43,6 +43,7 @@ @"progressBar": ProgressBar.class, @"checkbox": MVMCoreUICheckBox.class, @"listItem": MoleculeTableViewCell.class, + @"accordionListItem": AccordionMoleculeTableViewCell.class, @"switch": MVMCoreUISwitch.class, @"leftRightLabelView": LeftRightLabelView.class, @"actionDetailWithImage": ActionDetailWithImage.class, diff --git a/MVMCoreUI/OtherHandlers/MoleculeDelegateProtocol.h b/MVMCoreUI/OtherHandlers/MoleculeDelegateProtocol.h index fa91e0fc..cfa1504f 100644 --- a/MVMCoreUI/OtherHandlers/MoleculeDelegateProtocol.h +++ b/MVMCoreUI/OtherHandlers/MoleculeDelegateProtocol.h @@ -16,4 +16,8 @@ /// Notifies the delegate that the molecule layout update. Should be called when the layout may change due to an async method. - (void)moleculeLayoutUpdated:(nonnull UIView *)molecule; +/// Asks the delegate to add or remove molecules. +- (void)addMolecules:(nonnull NSArray *)molecules senderIndexPath:(nonnull NSIndexPath *)indexPath; +- (void)removeMolecules:(nonnull NSArray *)molecules senderIndexPath:(nonnull NSIndexPath *)indexPath; + @end diff --git a/MVMCoreUI/Templates/MoleculeListTemplate.swift b/MVMCoreUI/Templates/MoleculeListTemplate.swift index abec1b01..7ad011b3 100644 --- a/MVMCoreUI/Templates/MoleculeListTemplate.swift +++ b/MVMCoreUI/Templates/MoleculeListTemplate.swift @@ -117,6 +117,36 @@ open class MoleculeListTemplate: ThreeLayerTableViewController { } } + open override func addMolecules(_ molecules: [[AnyHashable: Any]], senderIndexPath indexPath: IndexPath) { + var indexPaths: [IndexPath] = [] + var moleculeList: [(identifier: String, class: AnyClass, molecule: [AnyHashable: Any])] = [] + for (index, molecule) in molecules.enumerated() { + if let info = getMoleculeInfo(with: molecule) { + moleculeList.append(info) + indexPaths.append(IndexPath(row: indexPath.row + 1 + index, section: 0)) + tableView?.register(info.class, forCellReuseIdentifier: info.identifier) + } + } + moleculesInfo?.insert(contentsOf: moleculeList, at: indexPath.row + 1) + tableView?.insertRows(at: indexPaths, with: .automatic) + } + + open override func removeMolecules(_ molecules: [[AnyHashable: Any]], senderIndexPath indexPath: IndexPath) { + guard let moleculesList = moleculesInfo else { + return + } + var indexPaths: [IndexPath] = [] + for (index, moleculeInfo) in moleculesList.enumerated() { + if molecules.contains(where: { (molecule) -> Bool in + return NSDictionary(dictionary: molecule).isEqual(to: moleculeInfo.molecule) + }) { + indexPaths.append(IndexPath(row: index, section: 0)) + moleculesInfo?.remove(at: index) + } + } + tableView?.deleteRows(at: indexPaths, with: .automatic) + } + // MARK: - Convenience /// Returns the (identifier, class) of the molecule for the given map. func getMoleculeInfo(with molecule: [AnyHashable: Any]?) -> (identifier: String, class: AnyClass, molecule: [AnyHashable: Any])? { From e75b0d6d9a9b1441fc062de526ac93c9bc990365 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 3 Sep 2019 15:49:43 -0400 Subject: [PATCH 11/20] Set UIImageRenderingModeAlwaysTemplate to allow the tint change. --- MVMCoreUI/Utility/MVMCoreUICommonViewsUtility.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MVMCoreUI/Utility/MVMCoreUICommonViewsUtility.m b/MVMCoreUI/Utility/MVMCoreUICommonViewsUtility.m index 41237640..66aeaa06 100644 --- a/MVMCoreUI/Utility/MVMCoreUICommonViewsUtility.m +++ b/MVMCoreUI/Utility/MVMCoreUICommonViewsUtility.m @@ -181,7 +181,8 @@ static const CGFloat VertialShadowOffset = 6; + (nonnull MFCustomButton *)addCloseButtonToView:(UIView *)view action:(ButtonTapBlock)actionBlock verticalCentered:(BOOL)verticalCentered { MFCustomButton *button = [[MFCustomButton alloc] initWithFrame:CGRectZero]; button.translatesAutoresizingMaskIntoConstraints = NO; - [button setImage:[MVMCoreUIUtility imageNamed:@"closeXBlack"] forState:UIControlStateNormal]; + UIImage *image = [[MVMCoreUIUtility imageNamed:@"closeXBlack"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + [button setImage:image forState:UIControlStateNormal]; button.titleLabel.font = [MFStyler fontForHeadlineAlternative]; //accessibility From 32b2ab825b07f52ae9633311cd380a11ee5d06b2 Mon Sep 17 00:00:00 2001 From: "Pfeil, Scott Robert" Date: Tue, 3 Sep 2019 15:52:23 -0400 Subject: [PATCH 12/20] hide separator flag --- MVMCoreUI/Atoms/Views/SeparatorView.h | 3 +++ MVMCoreUI/Atoms/Views/SeparatorView.m | 4 ++++ .../Molecules/Items/AccordionMoleculeTableViewCell.swift | 5 +++++ 3 files changed, 12 insertions(+) diff --git a/MVMCoreUI/Atoms/Views/SeparatorView.h b/MVMCoreUI/Atoms/Views/SeparatorView.h index 89a9197d..40489b16 100644 --- a/MVMCoreUI/Atoms/Views/SeparatorView.h +++ b/MVMCoreUI/Atoms/Views/SeparatorView.h @@ -41,4 +41,7 @@ typedef enum : NSUInteger { - (void)setAsLight; - (void)setAsMedium; +/// Returns if the separator should be visible based on the type. +- (BOOL)shouldBeVisible; + @end diff --git a/MVMCoreUI/Atoms/Views/SeparatorView.m b/MVMCoreUI/Atoms/Views/SeparatorView.m index a666d450..9f85c311 100644 --- a/MVMCoreUI/Atoms/Views/SeparatorView.m +++ b/MVMCoreUI/Atoms/Views/SeparatorView.m @@ -162,6 +162,10 @@ [self setNeedsLayout]; [self layoutIfNeeded]; } + +- (BOOL)shouldBeVisible { + return ![[self.json string:KeyType] isEqualToString:@"none"]; +} #pragma mark - Molecule diff --git a/MVMCoreUI/Molecules/Items/AccordionMoleculeTableViewCell.swift b/MVMCoreUI/Molecules/Items/AccordionMoleculeTableViewCell.swift index 630dfb7d..12ce5c31 100644 --- a/MVMCoreUI/Molecules/Items/AccordionMoleculeTableViewCell.swift +++ b/MVMCoreUI/Molecules/Items/AccordionMoleculeTableViewCell.swift @@ -31,10 +31,15 @@ import UIKit guard let molecules = json?.optionalArrayForKey(KeyMolecules) as? [[AnyHashable: Any]] else { return } + if accordionButton.isSelected { delegateObject?.moleculeDelegate?.addMolecules?(molecules, senderIndexPath: indexPath) } else { delegateObject?.moleculeDelegate?.removeMolecules?(molecules, senderIndexPath: indexPath) } + + if (json?.boolForKey("hideSeparatorWhenExpanded") ?? false) && (self.bottomSeparatorView?.shouldBeVisible() ?? false) { + bottomSeparatorView?.isHidden = accordionButton.isSelected + } } } From 9b336dc2ece0421fb5352d644db4dc0d54f1e1c1 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 3 Sep 2019 16:09:01 -0400 Subject: [PATCH 13/20] remove unneeded method call and set default tint as black. --- MVMCoreUI/Utility/MVMCoreUICommonViewsUtility.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MVMCoreUI/Utility/MVMCoreUICommonViewsUtility.m b/MVMCoreUI/Utility/MVMCoreUICommonViewsUtility.m index 66aeaa06..175714bc 100644 --- a/MVMCoreUI/Utility/MVMCoreUICommonViewsUtility.m +++ b/MVMCoreUI/Utility/MVMCoreUICommonViewsUtility.m @@ -183,7 +183,7 @@ static const CGFloat VertialShadowOffset = 6; button.translatesAutoresizingMaskIntoConstraints = NO; UIImage *image = [[MVMCoreUIUtility imageNamed:@"closeXBlack"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; [button setImage:image forState:UIControlStateNormal]; - button.titleLabel.font = [MFStyler fontForHeadlineAlternative]; + [button setTintColor:UIColor.blackColor]; //accessibility button.accessibilityLabel = [MVMCoreUIUtility hardcodedStringWithKey:@"AccCloseButton"]; From b32cbd856617f07e96e995aeef42f517eff15282 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 3 Sep 2019 16:09:55 -0400 Subject: [PATCH 14/20] objc. --- MVMCoreUI/Utility/MVMCoreUICommonViewsUtility.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MVMCoreUI/Utility/MVMCoreUICommonViewsUtility.m b/MVMCoreUI/Utility/MVMCoreUICommonViewsUtility.m index 175714bc..94c6ca85 100644 --- a/MVMCoreUI/Utility/MVMCoreUICommonViewsUtility.m +++ b/MVMCoreUI/Utility/MVMCoreUICommonViewsUtility.m @@ -183,7 +183,7 @@ static const CGFloat VertialShadowOffset = 6; button.translatesAutoresizingMaskIntoConstraints = NO; UIImage *image = [[MVMCoreUIUtility imageNamed:@"closeXBlack"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; [button setImage:image forState:UIControlStateNormal]; - [button setTintColor:UIColor.blackColor]; + [button setTintColor:[UIColor blackColor]]; //accessibility button.accessibilityLabel = [MVMCoreUIUtility hardcodedStringWithKey:@"AccCloseButton"]; From ea13603b7d61444ac433391908826bf999fcccad Mon Sep 17 00:00:00 2001 From: "Pfeil, Scott Robert" Date: Tue, 3 Sep 2019 16:52:10 -0400 Subject: [PATCH 15/20] font update --- MVMCoreUI/Molecules/Items/AccordionMoleculeTableViewCell.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/MVMCoreUI/Molecules/Items/AccordionMoleculeTableViewCell.swift b/MVMCoreUI/Molecules/Items/AccordionMoleculeTableViewCell.swift index 12ce5c31..b188d45b 100644 --- a/MVMCoreUI/Molecules/Items/AccordionMoleculeTableViewCell.swift +++ b/MVMCoreUI/Molecules/Items/AccordionMoleculeTableViewCell.swift @@ -15,6 +15,7 @@ import UIKit let accordionButton = MFCustomButton(type: .custom) accordionButton.setTitle("+", for: .normal) accordionButton.setTitleColor(.black, for: .normal) + accordionButton.titleLabel?.font = UIFont.systemFont(ofSize: 40, weight: .ultraLight) accordionButton.frame = CGRect(x: 0, y: 0, width: 20, height: 20) return accordionButton } From 2fd55f0affd3aa5a10243f2ad2d3860f2b68433c Mon Sep 17 00:00:00 2001 From: "Pfeil, Scott Robert" Date: Tue, 3 Sep 2019 17:12:17 -0400 Subject: [PATCH 16/20] border the button --- .../HorizontalCombinationViews/TwoButtonView.swift | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/MVMCoreUI/Molecules/HorizontalCombinationViews/TwoButtonView.swift b/MVMCoreUI/Molecules/HorizontalCombinationViews/TwoButtonView.swift index 575c01ec..28ad6dc4 100644 --- a/MVMCoreUI/Molecules/HorizontalCombinationViews/TwoButtonView.swift +++ b/MVMCoreUI/Molecules/HorizontalCombinationViews/TwoButtonView.swift @@ -42,7 +42,8 @@ import UIKit open override func setupView() { super.setupView() - setupButton() + setupWithTwoButtons() + secondaryButton?.bordered = true } // MARK: - MVMCoreUIMoleculeViewProtocol @@ -60,10 +61,6 @@ import UIKit } // MARK: - Constraining - func setupButton() { - setupWithTwoButtons() - } - func createPrimaryButton() { if primaryButton == nil { primaryButton = PrimaryButton.button() From 9b5b256594631526bf843dcf9a901a86e43cc3cf Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Wed, 4 Sep 2019 09:55:05 -0400 Subject: [PATCH 17/20] Fixes Alert view color issue. --- MVMCoreUI/TopAlert/MVMCoreUITopAlertMainView.m | 1 + 1 file changed, 1 insertion(+) diff --git a/MVMCoreUI/TopAlert/MVMCoreUITopAlertMainView.m b/MVMCoreUI/TopAlert/MVMCoreUITopAlertMainView.m index fa26a7f7..eab759e8 100644 --- a/MVMCoreUI/TopAlert/MVMCoreUITopAlertMainView.m +++ b/MVMCoreUI/TopAlert/MVMCoreUITopAlertMainView.m @@ -173,6 +173,7 @@ if (closeButton && !self.closeButton) { self.closeButton = [self addCloseButtonWithAnimationDelegate:animationDelegate]; + [self.closeButton setTintColor:[UIColor whiteColor]]; } else if (!closeButton && self.closeButton) { [self.closeButton removeFromSuperview]; self.closeButton = nil; From 1bf69cb505e7c9136c696ea0085279e057e611a9 Mon Sep 17 00:00:00 2001 From: "Thirukamu, Ravivarma" Date: Wed, 4 Sep 2019 10:59:03 -0400 Subject: [PATCH 18/20] changing mftextfield background to clear color. --- MVMCoreUI/Atoms/TextFields/MFTextField.xib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MVMCoreUI/Atoms/TextFields/MFTextField.xib b/MVMCoreUI/Atoms/TextFields/MFTextField.xib index e839533f..9f3cf5c4 100644 --- a/MVMCoreUI/Atoms/TextFields/MFTextField.xib +++ b/MVMCoreUI/Atoms/TextFields/MFTextField.xib @@ -38,7 +38,7 @@ - + From 6883f1a61c1a74439fecff42b7b622d82ad908d6 Mon Sep 17 00:00:00 2001 From: "Thirukamu, Ravivarma" Date: Wed, 4 Sep 2019 11:07:18 -0400 Subject: [PATCH 19/20] Revert "changing mftextfield background to clear color." This reverts commit 1bf69cb505e7c9136c696ea0085279e057e611a9. --- MVMCoreUI/Atoms/TextFields/MFTextField.xib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MVMCoreUI/Atoms/TextFields/MFTextField.xib b/MVMCoreUI/Atoms/TextFields/MFTextField.xib index 9f3cf5c4..e839533f 100644 --- a/MVMCoreUI/Atoms/TextFields/MFTextField.xib +++ b/MVMCoreUI/Atoms/TextFields/MFTextField.xib @@ -38,7 +38,7 @@ - + From 1a23ca6e2759a5ec6b8fd797c15c73a3ae12d2c0 Mon Sep 17 00:00:00 2001 From: "Thirukamu, Ravivarma" Date: Wed, 4 Sep 2019 11:17:04 -0400 Subject: [PATCH 20/20] Adding outlet view in h file for global access. --- MVMCoreUI/Atoms/TextFields/MFTextField.h | 1 + MVMCoreUI/Atoms/TextFields/MFTextField.xib | 1 + 2 files changed, 2 insertions(+) diff --git a/MVMCoreUI/Atoms/TextFields/MFTextField.h b/MVMCoreUI/Atoms/TextFields/MFTextField.h index 72adf682..6b047c6c 100644 --- a/MVMCoreUI/Atoms/TextFields/MFTextField.h +++ b/MVMCoreUI/Atoms/TextFields/MFTextField.h @@ -33,6 +33,7 @@ @property (nullable, weak, nonatomic) UIView *view; @property (nullable, weak, nonatomic) IBOutlet UIView *textFieldContainerView; +@property (nullable, weak, nonatomic) IBOutlet UIView *backgroundView; @property (nullable, weak, nonatomic) IBOutlet UITextField *textField; @property (nullable, weak, nonatomic) IBOutlet Label *formLabel; @property (nullable, weak, nonatomic) IBOutlet UIView *separatorView;//make it public so outsider class can know the posistion of it. diff --git a/MVMCoreUI/Atoms/TextFields/MFTextField.xib b/MVMCoreUI/Atoms/TextFields/MFTextField.xib index e839533f..cb9821f1 100644 --- a/MVMCoreUI/Atoms/TextFields/MFTextField.xib +++ b/MVMCoreUI/Atoms/TextFields/MFTextField.xib @@ -11,6 +11,7 @@ +