mvm_core_ui/MVMCoreUI/Styles/Styler.swift
2020-05-06 14:14:09 -04:00

250 lines
7.5 KiB
Swift

//
// Styler.swift
// MVMCoreUI
//
// Created by Kevin Christiano on 4/1/20.
// Copyright © 2020 Verizon Wireless. All rights reserved.
//
import Foundation
open class Styler {
// MARK:- Font Enum
public enum Font: String, Codable {
case Title2XLarge
case TitleXLarge
case BoldTitleLarge
case RegularTitleLarge
case BoldTitleMedium
case RegularTitleMedium
case BoldBodyLarge
case RegularBodyLarge
case BoldBodySmall
case RegularBodySmall
case BoldMicro
case RegularMicro
// Legacy Fonts
case H1
case H2
case H3
case H32
case B1
case B2
case B3
case B20
/// Returns the font size of the current enum case.
public func pointSize() -> CGFloat {
switch self {
case .H1:
return 40
case .Title2XLarge:
return 36
case .TitleXLarge,
.H32:
return 32
case .H2:
return 25
case .BoldTitleLarge,
.RegularTitleLarge:
return 24
case .BoldTitleMedium,
.RegularTitleMedium,
.B20:
return 20
case .H3:
return 18
case .BoldBodyLarge,
.RegularBodyLarge:
return 16
case .BoldBodySmall,
.RegularBodySmall,
.B1,
.B2:
return 13
case .BoldMicro,
.RegularMicro,
.B3:
return 11
}
}
/// Determines if the selected font case is bold or regular.
public func isBold() -> Bool {
switch self {
case .Title2XLarge,
.TitleXLarge,
.RegularTitleLarge,
.RegularTitleMedium,
.RegularBodyLarge,
.RegularBodySmall,
.RegularMicro,
.B2,
.B3,
.B20:
return false
case .BoldTitleLarge,
.BoldTitleMedium,
.BoldBodyLarge,
.BoldBodySmall,
.BoldMicro,
.H1,
.H2,
.H3,
.H32,
.B1:
return true
}
}
/// Determines if the current enum is a legacy or modern font.
public func isLegacyFont() -> Bool {
switch self {
case .Title2XLarge,
.TitleXLarge,
.RegularTitleLarge,
.RegularTitleMedium,
.RegularBodyLarge,
.RegularBodySmall,
.RegularMicro,
.BoldTitleLarge,
.BoldTitleMedium,
.BoldBodyLarge,
.BoldBodySmall,
.BoldMicro:
return false
case .H1,
.H2,
.H3,
.H32,
.B1,
.B2,
.B3,
.B20:
return true
}
}
/// Returns the font based on the declared enum case.
public func getFont(_ genericScaling: Bool = true) -> UIFont {
let size = genericScaling ? sizeFontGeneric(forCurrentDevice: pointSize()) : pointSize()
if isLegacyFont() {
switch self {
case .B2, .B3, .B20:
return MFFonts.mfFont55Rg(size)
default:
return MFFonts.mfFont75Bd(size)
}
} else {
if isBold() {
return size >= 15 ? MFFonts.mfFontDSBold(size) : MFFonts.mfFontTXBold(size)
} else {
return size >= 15 ? MFFonts.mfFontDSRegular(size) : MFFonts.mfFontTXRegular(size)
}
}
}
/// Styles the provided label to the declared enum Font case.
public func styleLabel(_ label: UILabel, textColor: UIColor = .mvmBlack, genericScaling: Bool = true) {
label.font = getFont(genericScaling)
label.textColor = textColor
}
}
public enum Button {
public enum Style: String, Codable {
case primary
case secondary
}
public enum Size: String, Codable {
case standard
case tiny
func getHeight() -> CGFloat {
switch self {
case .standard:
return 42
case .tiny:
return 20
}
}
}
}
//--------------------------------------------------
// MARK: - Functions
//--------------------------------------------------
open class func sizeObjectGeneric(forCurrentDevice size: CGFloat) -> MFSizeObject? {
let sizeObject = MFSizeObject(standardSize: size, standardiPadPortraitSize: size * 1.3)
sizeObject?.addLargerThanCustomSize(size * 1.4, forThreshold: MFSizeStandardiPadLandscapeThreshold)
sizeObject?.addLargerThanCustomSize(size * 1.5, forThreshold: MFSizeiPadProLandscapeThreshold)
return sizeObject
}
open class func sizeFontGeneric(forCurrentDevice size: CGFloat) -> CGFloat {
return sizeObjectGeneric(forCurrentDevice: size)?.getValueBasedOnApplicationWidth() ?? size
}
//--------------------------------------------------
// MARK: - Spacing
//--------------------------------------------------
open class func setDefaultMarginsFor(_ view: UIView?, size: CGFloat?, horizontal: Bool = true, vertical: Bool = false) {
var horizontalPadding: CGFloat = Padding.Component.HorizontalMarginSpacing
let verticalPadding: CGFloat = vertical ? Padding.Component.VerticalMarginSpacing : 0
if let size = size {
horizontalPadding = horizontal ? Padding.Component.horizontalPaddingForSize(size) : 0
}
DispatchQueue.main.async {
MVMCoreUIUtility.setMarginsFor(view,
leading: horizontalPadding,
top: verticalPadding,
trailing: horizontalPadding,
bottom: verticalPadding)
}
}
open class func setMarginsFor(_ view: UIView?, size: CGFloat, horizontal: CGFloat?, top: CGFloat, bottom: CGFloat) {
let horizontalPadding: CGFloat = horizontal ?? Padding.Component.horizontalPaddingForSize(size)
DispatchQueue.main.async {
MVMCoreUIUtility.setMarginsFor(view,
leading: horizontalPadding,
top: top,
trailing: horizontalPadding,
bottom: bottom)
}
}
}