diff --git a/MVMCoreUI.xcodeproj/project.pbxproj b/MVMCoreUI.xcodeproj/project.pbxproj index 9ba02cb8..fb0a0e32 100644 --- a/MVMCoreUI.xcodeproj/project.pbxproj +++ b/MVMCoreUI.xcodeproj/project.pbxproj @@ -346,6 +346,7 @@ D236E5B4241FEB1000C38625 /* ListTwoColumnPriceDescription.swift in Sources */ = {isa = PBXBuildFile; fileRef = D236E5B2241FEB1000C38625 /* ListTwoColumnPriceDescription.swift */; }; D236E5B5241FEB1000C38625 /* ListTwoColumnPriceDescriptionModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D236E5B3241FEB1000C38625 /* ListTwoColumnPriceDescriptionModel.swift */; }; D236E5B7242007C500C38625 /* MVMControllerModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D236E5B6242007C500C38625 /* MVMControllerModelProtocol.swift */; }; + D23A8FD9260CE004007E14CE /* MFStyler+PaddingExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23A8FD5260CDF01007E14CE /* MFStyler+PaddingExtension.swift */; }; D23EA7FB2475F09800D60C34 /* CarouselItemProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23EA7FA2475F09800D60C34 /* CarouselItemProtocol.swift */; }; D23EA7FE247EBBB700D60C34 /* NavigationLabelButtonModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23EA7FD247EBBB700D60C34 /* NavigationLabelButtonModel.swift */; }; D23EA800247EBD6C00D60C34 /* LabelBarButtonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23EA7FF247EBD6C00D60C34 /* LabelBarButtonItem.swift */; }; @@ -902,6 +903,7 @@ D236E5B2241FEB1000C38625 /* ListTwoColumnPriceDescription.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListTwoColumnPriceDescription.swift; sourceTree = ""; }; D236E5B3241FEB1000C38625 /* ListTwoColumnPriceDescriptionModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListTwoColumnPriceDescriptionModel.swift; sourceTree = ""; }; D236E5B6242007C500C38625 /* MVMControllerModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MVMControllerModelProtocol.swift; sourceTree = ""; }; + D23A8FD5260CDF01007E14CE /* MFStyler+PaddingExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MFStyler+PaddingExtension.swift"; sourceTree = ""; }; D23EA7FA2475F09800D60C34 /* CarouselItemProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarouselItemProtocol.swift; sourceTree = ""; }; D23EA7FD247EBBB700D60C34 /* NavigationLabelButtonModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationLabelButtonModel.swift; sourceTree = ""; }; D23EA7FF247EBD6C00D60C34 /* LabelBarButtonItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelBarButtonItem.swift; sourceTree = ""; }; @@ -2000,6 +2002,7 @@ D29DF13921E68637003B2FB9 /* MFStyler.m */, 0A6682A92435125F00AD3CA1 /* Styler.swift */, 0A6682AB243531C300AD3CA1 /* Padding.swift */, + D23A8FD5260CDF01007E14CE /* MFStyler+PaddingExtension.swift */, ); path = Styles; sourceTree = ""; @@ -2843,6 +2846,7 @@ D253BB9C245874F8002DE544 /* BGImageMolecule.swift in Sources */, D2C78CD224228BBD00B69FDE /* ActionOpenPanelModel.swift in Sources */, AA617AB02453010A00910B8F /* ListDeviceComplexLinkSmall.swift in Sources */, + D23A8FD9260CE004007E14CE /* MFStyler+PaddingExtension.swift in Sources */, C695A68123C9830D00BFB94E /* NumberedListModel.swift in Sources */, 01EB3684236097C0006832FA /* MoleculeModelProtocol.swift in Sources */, D27CD4102339057800C1DC07 /* EyebrowHeadlineBodyLink.swift in Sources */, diff --git a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/RadioButtonLabel.swift b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/RadioButtonLabel.swift index 918871e7..eb7266a9 100644 --- a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/RadioButtonLabel.swift +++ b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/RadioButtonLabel.swift @@ -32,7 +32,7 @@ import UIKit if let rightView = createRightView() { addSubview(rightView) - rightView.leftAnchor.constraint(equalTo: radioButton.rightAnchor, constant: PaddingHorizontalBetweenRelatedItems).isActive = true + rightView.leftAnchor.constraint(equalTo: radioButton.rightAnchor, constant: Padding.Component.gutterForApplicationWidth).isActive = true rightView.rightAnchor.constraint(equalTo: layoutMarginsGuide.rightAnchor, constant: 0).isActive = true var constraint = rightView.topAnchor.constraint(greaterThanOrEqualTo: layoutMarginsGuide.topAnchor, constant: PaddingOne) diff --git a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/Tabs.swift b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/Tabs.swift index 1ddd9412..b9225488 100644 --- a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/Tabs.swift +++ b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/Tabs.swift @@ -44,7 +44,7 @@ import UIKit //constant let TabCellId = "TabCell" - public let sectionPadding: CGFloat = 20.0 + public let sectionPadding: CGFloat = Padding.Component.gutterForApplicationWidth public let cellSpacing: CGFloat = 34.0 public let cellHeight: CGFloat = 27.0 public let selectionLineHeight: CGFloat = 4.0 @@ -198,11 +198,13 @@ extension Tabs: UICollectionViewDelegateFlowLayout { } public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { - if !paddingBeforeFirstTab && section == 0 { - return .zero - } else { + guard section == 0 else { return UIEdgeInsets(top: 0, left: sectionPadding, bottom: 0, right: 0) } + guard paddingBeforeFirstTab else { + return .zero + } + return UIEdgeInsets(top: 0, left: Padding.Component.horizontalPaddingForApplicationWidth, bottom: 0, right: 0) } public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { diff --git a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonView.swift b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonView.swift index 13fcb279..5f846730 100644 --- a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonView.swift +++ b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonView.swift @@ -51,7 +51,7 @@ import UIKit stack.addArrangedSubview(primaryButton) NSLayoutConstraint.constraintPinSubview(toSuperview: stack) stack.axis = .horizontal - stack.spacing = 12 + stack.spacing = Padding.Component.gutterForApplicationWidth equalWidthConstraint = secondaryButton.widthAnchor.constraint(equalTo: primaryButton.widthAnchor, multiplier: 1) equalWidthConstraint?.isActive = true } diff --git a/MVMCoreUI/Atomic/Organisms/StackModel.swift b/MVMCoreUI/Atomic/Organisms/StackModel.swift index d96da035..dae6fad8 100644 --- a/MVMCoreUI/Atomic/Organisms/StackModel.swift +++ b/MVMCoreUI/Atomic/Organisms/StackModel.swift @@ -11,9 +11,7 @@ //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- - - static let defaultSpacing: CGFloat = 16.0 - + public class var identifier: String { return "stack" } @@ -21,7 +19,7 @@ public var backgroundColor: Color? public var molecules: [StackItemModelProtocol & MoleculeModelProtocol] public var axis: NSLayoutConstraint.Axis = .vertical - public var spacing: CGFloat = StackModel.defaultSpacing + public var spacing: CGFloat = Padding.Four public var useStackSpacingBeforeFirstItem = false //-------------------------------------------------- @@ -35,6 +33,8 @@ } if let spacing = spacing { self.spacing = spacing + } else if axis == .horizontal { + self.spacing = Padding.Component.gutterForApplicationWidth } super.init() } @@ -63,6 +63,8 @@ } if let spacing = try typeContainer.decodeIfPresent(CGFloat.self, forKey: .spacing) { self.spacing = spacing + } else if axis == .horizontal { + self.spacing = Padding.Component.gutterForApplicationWidth } backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) try super.init(from: decoder) diff --git a/MVMCoreUI/Categories/NSLayoutConstraintExtension.swift b/MVMCoreUI/Categories/NSLayoutConstraintExtension.swift index 242e3fc0..43928769 100644 --- a/MVMCoreUI/Categories/NSLayoutConstraintExtension.swift +++ b/MVMCoreUI/Categories/NSLayoutConstraintExtension.swift @@ -55,6 +55,6 @@ public extension NSLayoutConstraint { } leftView.leadingAnchor.constraint(equalTo: superView.layoutMarginsGuide.leadingAnchor).isActive = true superView.layoutMarginsGuide.trailingAnchor.constraint(equalTo: rightView.trailingAnchor).isActive = true - rightView.leftAnchor.constraint(greaterThanOrEqualTo: leftView.rightAnchor, constant: PaddingHorizontalBetweenRelatedItems).isActive = true + rightView.leftAnchor.constraint(greaterThanOrEqualTo: leftView.rightAnchor, constant: Padding.Component.gutterForApplicationWidth).isActive = true } } diff --git a/MVMCoreUI/Styles/MFStyler+PaddingExtension.swift b/MVMCoreUI/Styles/MFStyler+PaddingExtension.swift new file mode 100644 index 00000000..d4bf8ebf --- /dev/null +++ b/MVMCoreUI/Styles/MFStyler+PaddingExtension.swift @@ -0,0 +1,36 @@ +// +// MFStyler+PaddingExtension.swift +// MVMCoreUI +// +// Created by Scott Pfeil on 3/25/21. +// Copyright © 2021 Verizon Wireless. All rights reserved. +// + +import Foundation + +@objc public extension MFStyler { + + @objc static func bridgeGetGutterSizeForForApplicationWidth() -> CGFloat { + Padding.Component.gutterForApplicationWidth + } + + @objc static func bridgeGetGutterSize(for size: CGFloat) -> CGFloat { + Padding.Component.gutterFor(size: size) + } + + @objc static func bridgeHorizontalPaddingFor(size: CGFloat) -> CGFloat { + Padding.Component.horizontalPaddingForSize(size) + } + + @objc static func bridgeVerticalPaddingFor(size: CGFloat) -> CGFloat { + Padding.Component.verticalPaddingForSize(size) + } + + @objc static func bridgeSetDefaultMarginsFor(view: UIView, size: CGFloat, horizontal: Bool = true, vertical: Bool = false) { + Styler.setDefaultMarginsFor(view, size: size, horizontal: horizontal, vertical: vertical) + } + + @objc static func bridgeSetMarginsFor(view: UIView, size: CGFloat, horizontal: CGFloat, top: CGFloat, bottom: CGFloat) { + Styler.setMarginsFor(view, size: size, horizontal: horizontal, top: top, bottom: bottom) + } +} diff --git a/MVMCoreUI/Styles/MFStyler.m b/MVMCoreUI/Styles/MFStyler.m index e1ffe314..17b3e7f1 100644 --- a/MVMCoreUI/Styles/MFStyler.m +++ b/MVMCoreUI/Styles/MFStyler.m @@ -14,6 +14,7 @@ #import "MVMCoreUISplitViewController.h" @import MVMCore.MVMCoreDispatchUtility; #import +#import CGFloat const PaddingDefault = 24; CGFloat const PaddingDefaultHorizontalSpacing = 32; @@ -26,7 +27,7 @@ CGFloat const PaddingVerticalWhiteGrayView = 72; CGFloat const PaddingVerticalHeadlineAlternate = 48; CGFloat const PaddingPrimaryButtonTop = 36; -CGFloat const PaddingHorizontalBetweenRelatedItems = 16; +CGFloat const PaddingHorizontalBetweenRelatedItems = 12; CGFloat const PaddingOne = 6; CGFloat const PaddingTwo = 12; CGFloat const PaddingThree = 18; @@ -77,23 +78,19 @@ CGFloat const LabelWithInternalButtonLineSpace = 2; #pragma mark - Spacing Defaults + (CGFloat)defaultHorizontalPaddingForApplicationWidth { - MFSizeObject *sizeObject = [MFSizeObject sizeObjectWithStandardSize:16]; - [sizeObject addLargerThanCustomSize:32 forThreshold:MFSizeMostlySweetSpotThreshold]; - return [sizeObject getValueBasedOnApplicationWidth]; + return [self bridgeHorizontalPaddingForSize:[MVMCoreUISplitViewController getApplicationViewWidth]]; } + (CGFloat)defaultVerticalPaddingForApplicationWidth { - return [[MFSizeObject sizeObjectWithScalingStandardSize:PaddingDefaultVerticalSpacing] getValueBasedOnApplicationWidth]; + return [self bridgeVerticalPaddingForSize:[MVMCoreUISplitViewController getApplicationViewWidth]]; } + (CGFloat)defaultHorizontalPaddingForSize:(CGFloat)size { - MFSizeObject *sizeObject = [MFSizeObject sizeObjectWithStandardSize:16]; - [sizeObject addLargerThanCustomSize:32 forThreshold:MFSizeMostlySweetSpotThreshold]; - return [sizeObject getValueBasedOnSize:size]; + return [self bridgeHorizontalPaddingForSize:size]; } + (CGFloat)defaultVerticalPaddingForSize:(CGFloat)size { - return [[MFSizeObject sizeObjectWithScalingStandardSize:PaddingDefaultVerticalSpacing] getValueBasedOnSize:size]; + return [self bridgeVerticalPaddingForSize:size]; } + (void)setDefaultMarginsForView:(nullable UIView *)view size:(CGFloat)size { @@ -101,18 +98,13 @@ CGFloat const LabelWithInternalButtonLineSpace = 2; } + (void)setDefaultMarginsForView:(nullable UIView *)view size:(CGFloat)size horizontal:(BOOL)horizontal vertical:(BOOL)vertical { - CGFloat horizontalPadding = horizontal ? [MFStyler defaultHorizontalPaddingForSize:size] : 0; - CGFloat verticalPadding = vertical ? PaddingDefaultVerticalSpacing3 : 0; - [MVMCoreDispatchUtility performBlockOnMainThread:^{ - [MVMCoreUIUtility setMarginsForView:view leading:horizontalPadding top:verticalPadding trailing:horizontalPadding bottom:verticalPadding]; - }]; + if (!view) { return; } + [self bridgeSetDefaultMarginsForView:view size:size horizontal:horizontal vertical:vertical]; } + (void)setMarginsForView:(nullable UIView *)view size:(CGFloat)size defaultHorizontal:(BOOL)horizontal top:(CGFloat)top bottom:(CGFloat)bottom { - CGFloat horizontalPadding = horizontal ? [MFStyler defaultHorizontalPaddingForSize:size] : 0; - [MVMCoreDispatchUtility performBlockOnMainThread:^{ - [MVMCoreUIUtility setMarginsForView:view leading:horizontalPadding top:top trailing:horizontalPadding bottom:bottom]; - }]; + if (!view) { return; } + [self bridgeSetMarginsForView:view size:size horizontal:horizontal top:top bottom:bottom]; } #pragma mark - 3.0 fonts diff --git a/MVMCoreUI/Styles/Padding.swift b/MVMCoreUI/Styles/Padding.swift index 83afe777..2b158739 100644 --- a/MVMCoreUI/Styles/Padding.swift +++ b/MVMCoreUI/Styles/Padding.swift @@ -24,27 +24,38 @@ public struct Padding { public struct Component { public static let Standard: CGFloat = 24 public static let HorizontalMarginSpacing: CGFloat = 16 - public static let LargeVerticalMarginSpacing: CGFloat = 32 + public static let LargeMarginSpacingLarge: CGFloat = 32 public static let VerticalMarginSpacing: CGFloat = 24 - + public static let LargeVerticalMarginSpacing: CGFloat = 32 + public static let HorizontalGutterSpacing: CGFloat = 12 + public static let LargeHorizontalGutterSpacing: CGFloat = 24 + public static var horizontalPaddingForApplicationWidth: CGFloat { - let sizeObject = MFSizeObject(standardSize: 16)! - sizeObject.addLargerThanCustomSize(32, forThreshold: MFSizeMostlySweetSpotThreshold) - return sizeObject.getValueBasedOnApplicationWidth() + horizontalPaddingForSize(MVMCoreUISplitViewController.getApplicationViewWidth()) } public static var verticalPaddingForApplicationWidth: CGFloat { - MFSizeObject(scalingStandardSize: VerticalMarginSpacing)?.getValueBasedOnApplicationWidth() ?? VerticalMarginSpacing + verticalPaddingForSize(MVMCoreUISplitViewController.getApplicationViewWidth()) + } + + public static var gutterForApplicationWidth: CGFloat { + gutterFor(size: MVMCoreUISplitViewController.getApplicationViewWidth()) } public static func horizontalPaddingForSize(_ size: CGFloat) -> CGFloat { - let sizeObject = MFSizeObject(standardSize: 16)! - sizeObject.addLargerThanCustomSize(32, forThreshold: MFSizeMostlySweetSpotThreshold) + let sizeObject = MFSizeObject(standardSize: HorizontalMarginSpacing)! + sizeObject.addLargerThanCustomSize(LargeMarginSpacingLarge, forThreshold: MFSizeMostlySweetSpotThreshold) return sizeObject.getValueBased(onSize: size) } public static func verticalPaddingForSize(_ size: CGFloat) -> CGFloat { MFSizeObject(scalingStandardSize: VerticalMarginSpacing)?.getValueBased(onSize: size) ?? VerticalMarginSpacing } + + public static func gutterFor(size: CGFloat) -> CGFloat { + let sizeObject = MFSizeObject(standardSize: HorizontalGutterSpacing)! + sizeObject.addLargerThanCustomSize(LargeHorizontalGutterSpacing, forThreshold: MFSizeMostlySweetSpotThreshold) + return sizeObject.getValueBased(onSize: size) + } } }