diff --git a/MVMCoreUI.xcodeproj/project.pbxproj b/MVMCoreUI.xcodeproj/project.pbxproj index 577534d9..401a5589 100644 --- a/MVMCoreUI.xcodeproj/project.pbxproj +++ b/MVMCoreUI.xcodeproj/project.pbxproj @@ -38,6 +38,7 @@ D296E13C229598BF0051EBE7 /* MoleculeListCellProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = D296E13B2295969C0051EBE7 /* MoleculeListCellProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; D296E1412295EBBA0051EBE7 /* MoleculeDelegateProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = D296E1402295EBBA0051EBE7 /* MoleculeDelegateProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; D296E143229729C30051EBE7 /* MoleculeMappingObject+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = D296E142229729C30051EBE7 /* MoleculeMappingObject+Extension.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 */; }; @@ -202,6 +203,7 @@ D296E13B2295969C0051EBE7 /* MoleculeListCellProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MoleculeListCellProtocol.h; sourceTree = ""; }; D296E1402295EBBA0051EBE7 /* MoleculeDelegateProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MoleculeDelegateProtocol.h; sourceTree = ""; }; D296E142229729C30051EBE7 /* MoleculeMappingObject+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MoleculeMappingObject+Extension.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 = ""; }; @@ -664,6 +666,7 @@ D29DF27421E79E81003B2FB9 /* MVMCoreUILoggingHandler.m */, D2C5001621F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.h */, D2C5001721F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.m */, + D296E14622A597490051EBE7 /* MVMCoreUIViewConstrainingProtocol.h */, D296E1402295EBBA0051EBE7 /* MoleculeDelegateProtocol.h */, D2A514562211C53C00345BFB /* MVMCoreUIMoleculeMappingObject.h */, D2A514572211C53C00345BFB /* MVMCoreUIMoleculeMappingObject.m */, @@ -768,6 +771,7 @@ D29DF2B321E7B76D003B2FB9 /* MFLoadingSpinner.h in Headers */, D29DF32521ED0DA2003B2FB9 /* TextButtonView.h in Headers */, D29DF25021E6A177003B2FB9 /* MFDigitTextBox.h in Headers */, + D296E14722A5984C0051EBE7 /* MVMCoreUIViewConstrainingProtocol.h in Headers */, D29DF2C621E7BF57003B2FB9 /* MFTabBarInteractor.h in Headers */, D29DF25721E6A177003B2FB9 /* MFTextField.h in Headers */, D29DF17521E69E1F003B2FB9 /* ButtonDelegateProtocol.h in Headers */, diff --git a/MVMCoreUI/Atoms/Buttons/CaretButton.swift b/MVMCoreUI/Atoms/Buttons/CaretButton.swift index 4503a1f3..46c6d3f4 100644 --- a/MVMCoreUI/Atoms/Buttons/CaretButton.swift +++ b/MVMCoreUI/Atoms/Buttons/CaretButton.swift @@ -8,7 +8,7 @@ // -open class CaretButton: MFCustomButton, MVMCoreUIMoleculeViewProtocol { +open class CaretButton: MFCustomButton, MVMCoreUIMoleculeViewProtocol, MVMCoreUIViewConstrainingProtocol { //------------------------------------------------------ // MARK: - Constants @@ -136,7 +136,7 @@ open class CaretButton: MFCustomButton, MVMCoreUIMoleculeViewProtocol { return true } - open func moleculeAlignment() -> UIStackView.Alignment { + open func alignment() -> UIStackView.Alignment { return UIStackView.Alignment.leading; } } diff --git a/MVMCoreUI/Atoms/Buttons/MFTextButton.h b/MVMCoreUI/Atoms/Buttons/MFTextButton.h index ec37589b..1e81e1f0 100644 --- a/MVMCoreUI/Atoms/Buttons/MFTextButton.h +++ b/MVMCoreUI/Atoms/Buttons/MFTextButton.h @@ -10,7 +10,7 @@ #import @class MFSizeObject; -@interface MFTextButton : MFCustomButton +@interface MFTextButton : MFCustomButton @property (nonnull, strong, nonatomic) MFSizeObject *sizeObject; diff --git a/MVMCoreUI/Atoms/Buttons/MFTextButton.m b/MVMCoreUI/Atoms/Buttons/MFTextButton.m index c404fa08..336db92a 100644 --- a/MVMCoreUI/Atoms/Buttons/MFTextButton.m +++ b/MVMCoreUI/Atoms/Buttons/MFTextButton.m @@ -12,6 +12,7 @@ #import "UIColor+MFConvenience.h" #import "MVMCoreUISplitViewController.h" #import "MVMCoreUIConstants.h" +#import @import MVMCore.MVMCoreDispatchUtility; @import MVMCore.MVMCoreGetterUtility; @import MVMCore.NSDictionary_MFConvenience; @@ -128,6 +129,10 @@ #pragma mark - MVMCoreUIMoleculeViewProtocol +- (void)reset { + [self setTitleColor:[UIColor mfTextButtonColor] forState:UIControlStateNormal]; +} + - (void)setWithJSON:(NSDictionary *)json delegateObject:(MVMCoreUIDelegateObject *)delegateObject additionalData:(NSDictionary *)additionalData { NSString *color = [json string:KeyTextColor]; if (color) { @@ -141,11 +146,13 @@ } } +#pragma mark - MVMCoreUIViewConstrainingProtocol + - (BOOL)needsToBeConstrained { return YES; } -- (UIStackViewAlignment)moleculeAlignment { +- (UIStackViewAlignment)alignment { return UIStackViewAlignmentLeading; } diff --git a/MVMCoreUI/Atoms/Buttons/PrimaryButton.h b/MVMCoreUI/Atoms/Buttons/PrimaryButton.h index 771f8c01..99929430 100644 --- a/MVMCoreUI/Atoms/Buttons/PrimaryButton.h +++ b/MVMCoreUI/Atoms/Buttons/PrimaryButton.h @@ -26,7 +26,7 @@ typedef enum : NSUInteger { static CGFloat const PrimaryButtonHeight = 42.0; static CGFloat const PrimaryButtonSmallHeight = 30.0; -@interface PrimaryButton : MFCustomButton +@interface PrimaryButton : MFCustomButton @property (nonatomic, readonly, assign) PrimaryButtonType primaryButtonType; //use reset function to set diff --git a/MVMCoreUI/Atoms/Buttons/PrimaryButton.m b/MVMCoreUI/Atoms/Buttons/PrimaryButton.m index 16dc124e..74a1e41a 100644 --- a/MVMCoreUI/Atoms/Buttons/PrimaryButton.m +++ b/MVMCoreUI/Atoms/Buttons/PrimaryButton.m @@ -638,6 +638,10 @@ #pragma mark - Molecule protocol +- (void)reset { + [self setAsStandardCustom]; +} + - (void)setAsStandardCustom { // Default to standard look. self.primaryButtonType = PrimaryButtonTypeCustom; diff --git a/MVMCoreUI/Atoms/TextFields/MFTextField.h b/MVMCoreUI/Atoms/TextFields/MFTextField.h index 27dd8414..62985c93 100644 --- a/MVMCoreUI/Atoms/TextFields/MFTextField.h +++ b/MVMCoreUI/Atoms/TextFields/MFTextField.h @@ -7,7 +7,7 @@ // #import -#import +#import @class PrimaryButton; @class MFTextField; @@ -28,7 +28,7 @@ @end -@interface MFTextField : MFView +@interface MFTextField : ViewConstrainingView @property (nullable, weak, nonatomic) UIView *view; diff --git a/MVMCoreUI/Atoms/TextFields/MFTextField.m b/MVMCoreUI/Atoms/TextFields/MFTextField.m index 55d6f8e6..9afcb24a 100644 --- a/MVMCoreUI/Atoms/TextFields/MFTextField.m +++ b/MVMCoreUI/Atoms/TextFields/MFTextField.m @@ -40,17 +40,12 @@ #pragma mark - setup - (void)updateView:(CGFloat)size { + [super updateView:size]; [MVMCoreDispatchUtility performBlockOnMainThread:^{ self.formLabel.font = [MFStyler fontB3]; self.label.font = [MFStyler fontForTextFieldUnderLabel]; [MFStyler styleTextField:self.textField]; [self.dashLine updateView:size]; - - if (self.isMolecule) { - [self setHorizontalPadding:[MFStyler defaultHorizontalPaddingForSize:size]]; - } else { - [self setHorizontalPadding:0]; - } }]; } @@ -369,14 +364,16 @@ }]; } -- (void)setHorizontalPadding:(CGFloat)padding { - self.textContainerLeftPin.constant = padding; - self.errorLableLeftPin.constant = padding; - self.formLabelLeftPin.constant = padding; - - self.textContainerRightPin.constant = padding; - self.errorLableRightPin.constant = padding; - self.formLabelRightPin.constant = padding; +- (void)setLeftPinConstant:(CGFloat)constant { + self.textContainerLeftPin.constant = constant; + self.errorLableLeftPin.constant = constant; + self.formLabelLeftPin.constant = constant; +} + +- (void)setRightPinConstant:(CGFloat)constant { + self.textContainerRightPin.constant = constant; + self.errorLableRightPin.constant = constant; + self.formLabelRightPin.constant = constant; } - (void)dealloc { diff --git a/MVMCoreUI/Atoms/Views/CaretView.swift b/MVMCoreUI/Atoms/Views/CaretView.swift index f5ee49c3..62b82b90 100644 --- a/MVMCoreUI/Atoms/Views/CaretView.swift +++ b/MVMCoreUI/Atoms/Views/CaretView.swift @@ -133,7 +133,7 @@ open class CaretView: MFView { return true } - open override func moleculeAlignment() -> UIStackView.Alignment { + open override func alignment() -> UIStackView.Alignment { return UIStackView.Alignment.leading; } } diff --git a/MVMCoreUI/Atoms/Views/Label.swift b/MVMCoreUI/Atoms/Views/Label.swift index 6302ed90..f2792081 100644 --- a/MVMCoreUI/Atoms/Views/Label.swift +++ b/MVMCoreUI/Atoms/Views/Label.swift @@ -10,7 +10,7 @@ import MVMCore -@objc open class Label: UILabel, MVMCoreViewProtocol, MVMCoreUIMoleculeViewProtocol { +@objc open class Label: UILabel, MVMCoreViewProtocol, MVMCoreUIMoleculeViewProtocol, MVMCoreUIViewConstrainingProtocol { //------------------------------------------------------ // MARK: - Properties //------------------------------------------------------ @@ -295,14 +295,29 @@ import MVMCore // MARK: - Atomization //------------------------------------------------------ + public func reset() { + text = nil + attributedText = nil + originalAttributedString = nil + styleB2(true) + } + @objc public func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) { Label.setUILabel(self, withJSON: json, delegate: delegateObject, additionalData: additionalData) originalAttributedString = attributedText } + public func setAsMolecule() { + setContentHuggingPriority(.required, for: .vertical) + } + public func needsToBeConstrained() -> Bool { return true; } + + public func alignment() -> UIStackView.Alignment { + return .leading + } } extension Label { diff --git a/MVMCoreUI/Atoms/Views/MFView.h b/MVMCoreUI/Atoms/Views/MFView.h index 5e32ff0a..62683433 100644 --- a/MVMCoreUI/Atoms/Views/MFView.h +++ b/MVMCoreUI/Atoms/Views/MFView.h @@ -8,9 +8,10 @@ #import #import +#import @import MVMCore.MVMCoreViewProtocol; -@interface MFView : UIView +@interface MFView : UIView @property (nullable, nonatomic, strong) NSDictionary *json; diff --git a/MVMCoreUI/Atoms/Views/MVMCoreUICheckBox.m b/MVMCoreUI/Atoms/Views/MVMCoreUICheckBox.m index 73a29011..9db9285b 100644 --- a/MVMCoreUI/Atoms/Views/MVMCoreUICheckBox.m +++ b/MVMCoreUI/Atoms/Views/MVMCoreUICheckBox.m @@ -54,7 +54,7 @@ static const CGFloat CheckBoxHeightWidth = 18.0; return YES; } -- (UIStackViewAlignment)moleculeAlignment { +- (UIStackViewAlignment)alignment { return UIStackViewAlignmentLeading; } diff --git a/MVMCoreUI/Atoms/Views/SeparatorView.m b/MVMCoreUI/Atoms/Views/SeparatorView.m index 43c33f44..2734bc94 100644 --- a/MVMCoreUI/Atoms/Views/SeparatorView.m +++ b/MVMCoreUI/Atoms/Views/SeparatorView.m @@ -70,6 +70,10 @@ #pragma mark - set up +- (void)reset { + [self setAsLight]; +} + - (void)updateView:(CGFloat)size { [super updateView:size]; self.height.constant = [self.heightSizeObject getValueBasedOnSize:size]; diff --git a/MVMCoreUI/Atoms/Views/ViewConstrainingView.m b/MVMCoreUI/Atoms/Views/ViewConstrainingView.m index d433388c..2830f19b 100644 --- a/MVMCoreUI/Atoms/Views/ViewConstrainingView.m +++ b/MVMCoreUI/Atoms/Views/ViewConstrainingView.m @@ -145,6 +145,12 @@ } } +- (void)reset { + if ([self.constrainedView respondsToSelector:@selector(reset)]) { + [self.constrainedView performSelector:@selector(reset)]; + } +} + #pragma mark - MVMCoreUIMoleculeViewProtocol - (void)setAsMolecule { diff --git a/MVMCoreUI/MVMCoreUI.h b/MVMCoreUI/MVMCoreUI.h index b5ccd8e1..4ef880c0 100644 --- a/MVMCoreUI/MVMCoreUI.h +++ b/MVMCoreUI/MVMCoreUI.h @@ -20,6 +20,7 @@ FOUNDATION_EXPORT const unsigned char MVMCoreUIVersionString[]; #import #import #import +#import #import #import #import diff --git a/MVMCoreUI/Molecules/ButtonView.swift b/MVMCoreUI/Molecules/ButtonView.swift index d03a2e72..3e863a8e 100644 --- a/MVMCoreUI/Molecules/ButtonView.swift +++ b/MVMCoreUI/Molecules/ButtonView.swift @@ -39,6 +39,10 @@ import UIKit } // MARK: - MVMCoreViewProtocol + open override func reset() { + primaryButton?.reset() + } + open override func updateView(_ size: CGFloat) { super.updateView(size) MVMCoreDispatchUtility.performBlock(onMainThread: { diff --git a/MVMCoreUI/Molecules/MVMCoreUIMoleculeViewProtocol.h b/MVMCoreUI/Molecules/MVMCoreUIMoleculeViewProtocol.h index 67e64d24..962b0c0c 100644 --- a/MVMCoreUI/Molecules/MVMCoreUIMoleculeViewProtocol.h +++ b/MVMCoreUI/Molecules/MVMCoreUIMoleculeViewProtocol.h @@ -12,21 +12,19 @@ @protocol MVMCoreUIMoleculeViewProtocol -// Sets up the ui based on the json +/// Sets up the ui based on the json - (void)setWithJSON:(nullable NSDictionary *)json delegateObject:(nullable MVMCoreUIDelegateObject *)delegateObject additionalData:(nullable NSDictionary *)additionalData; @optional -// Called after init to provide an early setter for any molecule specific logic +/// Called after init to provide an early setter for any molecule specific logic - (void)setAsMolecule; -// Notifies the creator that the view needs to be constrained in a view. -- (BOOL)needsToBeConstrained; +/// Resets to default state before set with json is called again. +- (void)reset; -// The alignment for the molecule if constrained. -- (UIStackViewAlignment)moleculeAlignment; -// For the molecule list to load more efficiently. +/// For the molecule list to load more efficiently. + (CGFloat)estimatedHeightForRow:(nullable NSDictionary *)json; @end diff --git a/MVMCoreUI/Molecules/MoleculeTableViewCell.swift b/MVMCoreUI/Molecules/MoleculeTableViewCell.swift index e0053437..298fa6b5 100644 --- a/MVMCoreUI/Molecules/MoleculeTableViewCell.swift +++ b/MVMCoreUI/Molecules/MoleculeTableViewCell.swift @@ -41,7 +41,7 @@ import UIKit // MARK: - MFViewProtocol public func updateView(_ size: CGFloat) { - MFStyler.setDefaultMarginsFor(self, size: size) + MFStyler.setDefaultMarginsFor(self, size: size, horizontal: true, vertical: true) if #available(iOS 11.0, *) { contentView.directionalLayoutMargins = directionalLayoutMargins topSeparatorView?.setLeftAndRightPinConstant(directionalLayoutMargins.leading) @@ -75,7 +75,16 @@ import UIKit if molecule == nil { if let moleculeView = MVMCoreUIMoleculeMappingObject.shared()?.createMolecule(forJSON: moleculeJSON, delegateObject: delegateObject, constrainIfNeeded: true) { contentView.addSubview(moleculeView) - NSLayoutConstraint.activate(Array(NSLayoutConstraint.pinView(toSuperview: moleculeView, useMargins: moleculeView.needsToBeConstrained?() ?? false).values)) + let standardConstraints = (moleculeView as? MVMCoreUIViewConstrainingProtocol)?.useStandardConstraints?() ?? true + NSLayoutConstraint.activate(Array(NSLayoutConstraint.pinView(toSuperview: moleculeView, useMargins: standardConstraints).values)) + if standardConstraints { + let constraint = contentView.heightAnchor.constraint(equalToConstant: 80) + constraint.priority = .defaultLow + constraint.isActive = true + if let moleculeView = moleculeView as? ViewConstrainingView { + moleculeView.updateViewHorizontalDefaults = false + } + } molecule = moleculeView } } else { @@ -97,6 +106,10 @@ import UIKit } } + public func reset() { + molecule?.reset?() + } + public static func estimatedHeight(forRow json: [AnyHashable : Any]?) -> CGFloat { guard let moleculeJSON = json?.optionalDictionaryForKey(KeyMolecule), let theClass = MVMCoreUIMoleculeMappingObject.shared()?.getMoleculeClass(withJSON: moleculeJSON, delegateObject: nil), diff --git a/MVMCoreUI/Molecules/StandardFooterView.swift b/MVMCoreUI/Molecules/StandardFooterView.swift index 5c4aa688..73088b2e 100644 --- a/MVMCoreUI/Molecules/StandardFooterView.swift +++ b/MVMCoreUI/Molecules/StandardFooterView.swift @@ -101,4 +101,9 @@ public class StandardFooterView: ViewConstrainingView { twoButtonView.setWithJSON(json?.optionalDictionaryForKey("twoButtonView"), delegateObject: delegateObject, additionalData: additionalData) textButton.setWithJSON(json?.optionalDictionaryForKey("textButton"), delegateObject: delegateObject, additionalData: additionalData) } + + public override func reset() { + twoButtonView.reset() + textButton.reset() + } } diff --git a/MVMCoreUI/Molecules/StandardHeaderView.swift b/MVMCoreUI/Molecules/StandardHeaderView.swift index 6a14416e..26ce345b 100644 --- a/MVMCoreUI/Molecules/StandardHeaderView.swift +++ b/MVMCoreUI/Molecules/StandardHeaderView.swift @@ -19,6 +19,7 @@ public class StandardHeaderView: ViewConstrainingView { var rightConstraintMessage: NSLayoutConstraint? private var heightConstraint: NSLayoutConstraint? + // MARK: - MVMCoreViewProtocol public override func updateView(_ size: CGFloat) { super.updateView(size) headlineLabel.updateView(size) @@ -74,6 +75,7 @@ public class StandardHeaderView: ViewConstrainingView { } } + // MARK: - Constraining public func setSpacing() { if headlineLabel.hasText && messageLabel.hasText { spaceBetweenLabels?.constant = PaddingTwo @@ -110,6 +112,15 @@ public class StandardHeaderView: ViewConstrainingView { separatorView?.rightPin?.constant = constant } + open override func reset() { + backgroundColor = .clear + headlineLabel.styleH2(true) + messageLabel.styleB2(true) + separatorView?.setAsHeavy() + separatorView?.show() + } + + // MARK: - MVMCoreUIMoleculeViewProtocol open override func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) { super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData) if let colorString = json?.optionalStringForKey(KeyBackgroundColor) { diff --git a/MVMCoreUI/Molecules/Switch.swift b/MVMCoreUI/Molecules/Switch.swift index b97496a3..a8bb00ba 100644 --- a/MVMCoreUI/Molecules/Switch.swift +++ b/MVMCoreUI/Molecules/Switch.swift @@ -80,7 +80,7 @@ import UIKit return true } - public override func moleculeAlignment() -> UIStackView.Alignment { + public override func alignment() -> UIStackView.Alignment { return UIStackView.Alignment.leading } } diff --git a/MVMCoreUI/Molecules/SwitchLineItem.swift b/MVMCoreUI/Molecules/SwitchLineItem.swift index 665de248..8c15e8ec 100644 --- a/MVMCoreUI/Molecules/SwitchLineItem.swift +++ b/MVMCoreUI/Molecules/SwitchLineItem.swift @@ -113,7 +113,7 @@ import UIKit return true } - public override func moleculeAlignment() -> UIStackView.Alignment { + public override func alignment() -> UIStackView.Alignment { return UIStackView.Alignment.leading } } diff --git a/MVMCoreUI/Molecules/TwoButtonView.swift b/MVMCoreUI/Molecules/TwoButtonView.swift index ca3c8215..48becca2 100644 --- a/MVMCoreUI/Molecules/TwoButtonView.swift +++ b/MVMCoreUI/Molecules/TwoButtonView.swift @@ -49,6 +49,11 @@ import UIKit set(primaryButtonJSON: primaryButtonMap, secondaryButtonJSON: secondaryButtonMap, delegateObject: delegateObject, additionalData: additionalData) } + open override func reset() { + super.reset() + secondaryButton?.setAsSecondaryCustom() + } + // MARK: - Constraining override func setupButton() { setupWithTwoButtons() diff --git a/MVMCoreUI/OtherHandlers/MVMCoreUIMoleculeMappingObject.m b/MVMCoreUI/OtherHandlers/MVMCoreUIMoleculeMappingObject.m index 9329a0a3..0004027a 100644 --- a/MVMCoreUI/OtherHandlers/MVMCoreUIMoleculeMappingObject.m +++ b/MVMCoreUI/OtherHandlers/MVMCoreUIMoleculeMappingObject.m @@ -13,6 +13,7 @@ #import "MVMCoreUIObject.h" #import #import "MFTextField.h" +#import "MVMCoreUIViewConstrainingProtocol.h" @implementation MVMCoreUIMoleculeMappingObject @@ -82,8 +83,11 @@ return nil; } UIView *molecule = [self createMoleculeForName:moleculeName]; - if (constrainIfNeeded && [molecule respondsToSelector:@selector(needsToBeConstrained)] && [molecule needsToBeConstrained]) { - molecule = [[ViewConstrainingView alloc] initWithMolecule:molecule alignment:[molecule respondsToSelector:@selector(moleculeAlignment)] ? [molecule moleculeAlignment] : UIStackViewAlignmentFill]; + + // Check if we need to constrain this view. + UIView *castMolecule = [molecule conformsToProtocol:@protocol(MVMCoreUIViewConstrainingProtocol)] ? (UIView *)molecule : nil; + if (constrainIfNeeded && [castMolecule respondsToSelector:@selector(needsToBeConstrained)] && [castMolecule needsToBeConstrained]) { + molecule = [[ViewConstrainingView alloc] initWithMolecule:molecule alignment:[castMolecule respondsToSelector:@selector(alignment)] ? [castMolecule alignment] : UIStackViewAlignmentFill]; } [molecule setWithJSON:moleculeJSON delegateObject:delegateObject additionalData:nil]; return molecule; diff --git a/MVMCoreUI/OtherHandlers/MVMCoreUIViewConstrainingProtocol.h b/MVMCoreUI/OtherHandlers/MVMCoreUIViewConstrainingProtocol.h new file mode 100644 index 00000000..8bdc3eb1 --- /dev/null +++ b/MVMCoreUI/OtherHandlers/MVMCoreUIViewConstrainingProtocol.h @@ -0,0 +1,24 @@ +// +// MVMCoreUIViewConstrainingProtocol.h +// MVMCoreUI +// +// Created by Scott Pfeil on 6/3/19. +// Copyright © 2019 Verizon Wireless. All rights reserved. +// + +#import + +@protocol MVMCoreUIViewConstrainingProtocol + +@optional + +/// Notifies the creator that the view may not be suitable to be shown on its own and it needs to be added to a view to help with layout. +- (BOOL)needsToBeConstrained; + +/// The alignment if constrained. +- (UIStackViewAlignment)alignment; + +/// Can be used to override any standard constraints that may be added. +- (BOOL)useStandardConstraints; + +@end diff --git a/MVMCoreUI/Styles/MFStyler.h b/MVMCoreUI/Styles/MFStyler.h index 0a52c468..b8c80752 100644 --- a/MVMCoreUI/Styles/MFStyler.h +++ b/MVMCoreUI/Styles/MFStyler.h @@ -91,6 +91,7 @@ B3 -> Legal + (CGFloat)defaultHorizontalPaddingForSize:(CGFloat)size; + (CGFloat)defaultVerticalPaddingForSize:(CGFloat)size; + (void)setDefaultMarginsForView:(nullable UIView *)view size:(CGFloat)size; ++ (void)setDefaultMarginsForView:(nullable UIView *)view size:(CGFloat)size horizontal:(BOOL)horizontal vertical:(BOOL)vertical; //------------------------------------------------- // Returns the fonts for these styles. Scales them as needed by default diff --git a/MVMCoreUI/Styles/MFStyler.m b/MVMCoreUI/Styles/MFStyler.m index 261181b1..4f27b2be 100644 --- a/MVMCoreUI/Styles/MFStyler.m +++ b/MVMCoreUI/Styles/MFStyler.m @@ -91,12 +91,17 @@ CGFloat const LabelWithInternalButtonLineSpace = 2; } + (void)setDefaultMarginsForView:(nullable UIView *)view size:(CGFloat)size { + [self setDefaultMarginsForView:view size:size horizontal:YES vertical:NO]; +} + ++ (void)setDefaultMarginsForView:(nullable UIView *)view size:(CGFloat)size horizontal:(BOOL)horizontal vertical:(BOOL)vertical { [MVMCoreDispatchUtility performBlockOnMainThread:^{ - CGFloat padding = [MFStyler defaultHorizontalPaddingForSize:size]; + CGFloat horizontalPadding = horizontal ? [MFStyler defaultHorizontalPaddingForSize:size] : 0; + CGFloat verticalPadding = vertical ? PaddingDefaultVerticalSpacing : 0; if (@available(iOS 11.0, *)) { - view.directionalLayoutMargins = NSDirectionalEdgeInsetsMake(0, padding, 0, padding); + view.directionalLayoutMargins = NSDirectionalEdgeInsetsMake(verticalPadding, horizontalPadding, verticalPadding, horizontalPadding); } else { - view.layoutMargins = UIEdgeInsetsMake(0, padding, 0, padding); + view.layoutMargins = UIEdgeInsetsMake(verticalPadding, horizontalPadding, verticalPadding, horizontalPadding); } }]; } diff --git a/MVMCoreUI/Templates/MoleculeListTemplate.swift b/MVMCoreUI/Templates/MoleculeListTemplate.swift index db69218b..9f8b7707 100644 --- a/MVMCoreUI/Templates/MoleculeListTemplate.swift +++ b/MVMCoreUI/Templates/MoleculeListTemplate.swift @@ -85,6 +85,7 @@ open class MoleculeListTemplate: ThreeLayerTableViewController { protocolCell.setSeparatorWithJSON?(loadObject?.pageJSON?.optionalDictionaryForKey("separator"), delegateObject: delegate, additionalData: nil, indexPath: indexPath) } if let protocolCell = cell as? MVMCoreUIMoleculeViewProtocol { + protocolCell.reset?() protocolCell.setWithJSON(molecule.molecule, delegateObject: delegate, additionalData: nil) protocolCell.updateView(tableView.bounds.width) }