mvm_core_ui/MVMCoreUI/Styles/Styler.swift
Kevin G Christiano 29465f8281 refresh styler
2020-04-01 14:18:51 -04:00

1208 lines
42 KiB
Swift

//
// Styler.swift
// MVMCoreUI
//
// Created by Kevin Christiano on 4/1/20.
// Copyright © 2020 Verizon Wireless. All rights reserved.
//
import Foundation
import MVMCore
public protocol VogueProtocol {
}
public protocol VogueViewProtocol {
}
public protocol VogueTextProtocol: VogueProtocol {
func styleFont(_ font: UIFont)
func styleTextColor(_ textColor: UIColor)
}
struct Padding {
static let One: CGFloat = 6
static let Two: CGFloat = 12
static let Three: CGFloat = 18
static let Four: CGFloat = 24
static let Five: CGFloat = 30
static let Six: CGFloat = 36
static let Seven: CGFloat = 42
static let Eight: CGFloat = 48
static let Nine: CGFloat = 54
static let Ten: CGFloat = 60
static let TableCellParagraphSpace: CGFloat = 3
static let FooterLabelParagraphSpace: CGFloat = 4
static let WebViewInset: CGFloat = 8
static let HeightTableSeperatorHeight: CGFloat = 1
static let MFHeightForSwitch: CGFloat = 22
static let MFWidthForSwitch: CGFloat = 42
static let DisableOppacity: CGFloat = 0.5
static let PaymentMethodViewHeightWidthMultiplier: CGFloat = 0.55
static let MinCellHeight: CGFloat = 96
static let HeightIphone5: CGFloat = 568
static let DefaultOptionCellHeight: CGFloat = 120
static let PromoViewHeight: CGFloat = 41.9
static let BetweenFields: CGFloat = 24
static let LabelWithInternalButtonLineSpace: CGFloat = 2
static let PrimaryButtonTop: CGFloat = 36
struct Default {
static let Standard: CGFloat = 24
static let HorizontalSpacing: CGFloat = 32
static let VerticalSpacing: CGFloat = 32
static let VerticalSpacing3: CGFloat = 24
}
struct Horizontal {
static let HeadlineWhiteView: CGFloat = 60
static let Large: CGFloat = 72
static let BetweenRelatedItems: CGFloat = 16
}
struct Vertical {
static let WhiteGrayView: CGFloat = 72
static let HeadlineAlternate: CGFloat = 48
}
}
public class Styler {
enum MFViewBorder: Int {
case top
case left
case bottom
case right
}
enum MFTimeFormatUnit: Int {
case mfTimeFormatColon = 0 //!{days} : {hour} : {minutes} : {seconds}
case mfTimeFormatNormal = 1 // will end with days hours minutes seconds, when left days less than 2, it will change to 'day'
}
//--------------------------------------------------
// MARK: - Enum
//--------------------------------------------------
public enum Style: String {
case H1
case H2
case H3
case H32
case B1
case B2
case B3
case B20
func font(_ genericScaling: Bool = true) -> UIFont? {
var size: CGFloat = 0
switch self {
case .H1:
size = genericScaling ? sizeFontGeneric(forCurrentDevice: size) : 40
return MFFonts.mfFont75Bd(size)
case .H2:
size = genericScaling ? sizeFontGeneric(forCurrentDevice: size) : 25
return MFFonts.mfFont75Bd(size)
case .H3:
size = genericScaling ? sizeFontGeneric(forCurrentDevice: size) : 18
return MFFonts.mfFont75Bd(size)
case .H32:
size = genericScaling ? sizeFontGeneric(forCurrentDevice: size) : 32
return MFFonts.mfFont75Bd(size)
case .B1:
size = genericScaling ? sizeFontGeneric(forCurrentDevice: size) : 13
return MFFonts.mfFont75Bd(size)
case .B2:
size = genericScaling ? sizeFontGeneric(forCurrentDevice: size) : 13
return MFFonts.mfFont55Rg(size)
case .B3:
size = genericScaling ? sizeFontGeneric(forCurrentDevice: size) : 11
return MFFonts.mfFont55Rg(size)
case .B20:
size = genericScaling ? sizeFontGeneric(forCurrentDevice: size) : 20
return MFFonts.mfFont55Rg(size)
}
}
}
public enum Tier {
case primary
case secondary
case ternary
case quaternary
}
//--------------------------------------------------
// MARK: - Functions
//--------------------------------------------------
class func splitTextFieldWidth() -> CGFloat {
return splitTextFieldWidth(forViewWidth: MVMCoreUISplitViewController.getDetailViewWidth())
}
class func splitTextFieldWidth(forViewWidth width: CGFloat) -> CGFloat {
return (width - CGFloat(PaddingOne)) / 2 - defaultHorizontalPaddingForApplicationWidth()
}
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
}
class func sizeFontGeneric(forCurrentDevice size: CGFloat) -> CGFloat {
return sizeObjectGeneric(forCurrentDevice: size)?.getValueBasedOnApplicationWidth() ?? 0
}
//--------------------------------------------------
// MARK: - Spacing
//--------------------------------------------------
class func defaultHorizontalPaddingForApplicationWidth() -> CGFloat {
return MFSizeObject(scalingStandardSize: PaddingDefaultHorizontalSpacing)?.getValueBasedOnApplicationWidth() ?? 0
}
class func defaultVerticalPaddingForApplicationWidth() -> CGFloat {
return MFSizeObject(scalingStandardSize: PaddingDefaultVerticalSpacing)?.getValueBasedOnApplicationWidth() ?? 0
}
class func defaultHorizontalPadding(forSize size: CGFloat) -> CGFloat {
return MFSizeObject(scalingStandardSize: PaddingDefaultHorizontalSpacing)?.getValueBased(onSize: size) ?? 0
}
class func defaultVerticalPadding(forSize size: CGFloat) -> CGFloat {
return MFSizeObject(scalingStandardSize: PaddingDefaultVerticalSpacing)?.getValueBased(onSize: size) ?? 0
}
class func setDefaultMarginsFor(_ view: UIView?, size: CGFloat) {
setDefaultMarginsFor(view, size: size, horizontal: true, vertical: false)
}
class func setDefaultMarginsFor(_ view: UIView?, size: CGFloat, horizontal: Bool, vertical: Bool) {
let horizontalPadding: CGFloat = horizontal ? defaultHorizontalPadding(forSize: size) : 0
let verticalPadding: CGFloat = vertical ? PaddingDefaultVerticalSpacing3 : 0
DispatchQueue.main.async {
MVMCoreUIUtility.setMarginsFor(view, leading: horizontalPadding, top: verticalPadding, trailing: horizontalPadding, bottom: verticalPadding)
}
}
class func setMarginsFor(_ view: UIView?, size: CGFloat, defaultHorizontal horizontal: Bool, top: CGFloat, bottom: CGFloat) {
let horizontalPadding: CGFloat = horizontal ? defaultHorizontalPadding(forSize: size) : 0
DispatchQueue.main.async {
MVMCoreUIUtility.setMarginsFor(view, leading: horizontalPadding, top: top, trailing: horizontalPadding, bottom: bottom)
}
}
//--------------------------------------------------
// MARK: - Fonts
//--------------------------------------------------
class func fontH1(_ genericScaling: Bool = true) -> UIFont? {
var size: CGFloat = 40
if genericScaling {
size = sizeFontGeneric(forCurrentDevice: size)
}
return MFFonts.mfFont75Bd(size)
}
class func fontH2(_ genericScaling: Bool = true) -> UIFont? {
var size: CGFloat = 25
if genericScaling {
size = sizeFontGeneric(forCurrentDevice: size)
}
return MFFonts.mfFont75Bd(size)
}
class func fontH3(_ genericScaling: Bool = true) -> UIFont? {
var size: CGFloat = 18
if genericScaling {
size = sizeFontGeneric(forCurrentDevice: size)
}
return MFFonts.mfFont75Bd(size)
}
class func fontH32(_ genericScaling: Bool = true) -> UIFont? {
var size: CGFloat = 32
if genericScaling {
size = sizeFontGeneric(forCurrentDevice: size)
}
return MFFonts.mfFont75Bd(size)
}
class func fontB1(_ genericScaling: Bool = true) -> UIFont? {
var size: CGFloat = 13
if genericScaling {
size = sizeFontGeneric(forCurrentDevice: size)
}
return MFFonts.mfFont75Bd(size)
}
class func fontB2(_ genericScaling: Bool = true) -> UIFont? {
var size: CGFloat = 13
if genericScaling {
size = sizeFontGeneric(forCurrentDevice: size)
}
return MFFonts.mfFont55Rg(size)
}
class func fontB3(_ genericScaling: Bool = true) -> UIFont? {
var size: CGFloat = 11
if genericScaling {
size = sizeFontGeneric(forCurrentDevice: size)
}
return MFFonts.mfFont55Rg(size)
}
class func fontB20(_ genericScaling: Bool = true) -> UIFont? {
var size: CGFloat = 20
if genericScaling {
size = sizeFontGeneric(forCurrentDevice: size)
}
return MFFonts.mfFont55Rg(size)
}
//--------------------------------------------------
// MARK: - Styles
//--------------------------------------------------
class func styleLabel(_ label: VogueTextProtocol, withStyle style: Style, genericScaling: Bool) {
switch style {
case .H1:
styleLabelH1(label, genericScaling: genericScaling)
case .H2:
styleLabelH2(label, genericScaling: genericScaling)
case .H3:
styleLabelH3(label, genericScaling: genericScaling)
case .H32:
styleLabelH32(label, genericScaling: genericScaling)
case .B1:
styleLabelB1(label, genericScaling: genericScaling)
case .B2:
styleLabelB2(label, genericScaling: genericScaling)
case .B3:
styleLabelB3(label, genericScaling: genericScaling)
case .B20:
styleLabelB20(label, genericScaling: genericScaling)
}
}
class func styleLabel(_ label: UILabel, withStyle style: Style) {
styleLabel(label, withStyle: style, genericScaling: true)
}
class func styleLabelH1(_ label: VogueTextProtocol, genericScaling: Bool = true) {
label.styleTextColor(.black)
if let h1 = fontH1(genericScaling) {
label.styleFont(h1)
}
}
class func styleLabelH2(_ label: VogueTextProtocol, genericScaling: Bool = true) {
label.styleTextColor(.black)
if let h2 = fontH2(genericScaling) {
label.styleFont(h2)
}
}
class func styleLabelH3(_ label: VogueTextProtocol, genericScaling: Bool = true) {
label.styleTextColor(.black)
if let h3 = fontH3(genericScaling) {
label.styleFont(h3)
}
}
class func styleLabelH32(_ label: VogueTextProtocol, genericScaling: Bool = true) {
label.styleTextColor(.black)
if let h32 = fontH32(genericScaling) {
label.styleFont(h32)
}
}
class func styleLabelB1(_ label: VogueTextProtocol, genericScaling: Bool = true) {
label.styleTextColor(.black)
if let b1 = fontB1(genericScaling) {
label.styleFont(b1)
}
}
class func styleLabelB2(_ label: VogueTextProtocol, genericScaling: Bool = true) {
label.styleTextColor(.black)
if let b2 = fontB2(genericScaling) {
label.styleFont(b2)
}
}
class func styleLabelB2(_ label: UILabel, size: CGFloat, genericScaling: Bool = true) {
label.font = fontForBody(withSize: size, genericScaling: genericScaling)
}
class func styleLabelB3(_ label: VogueTextProtocol, genericScaling: Bool = true) {
label.styleTextColor(.mfBackgroundGray())
if let b3 = fontB3(genericScaling) {
label.styleFont(b3)
}
}
class func styleLabelB20(_ label: VogueTextProtocol, genericScaling: Bool = true) {
label.styleTextColor(.black)
if let b20 = fontB20(genericScaling) {
label.styleFont(b20)
}
}
class func styleLabelTextStyle2(_ label: VogueTextProtocol, genericScaling: Bool = true) {
label.styleTextColor(.mfBattleshipGrey())
if let b2 = fontB2(genericScaling) {
label.styleFont(b2)
}
}
class func fontForBody(withSize size: CGFloat, genericScaling: Bool) -> UIFont? {
var size = size
if genericScaling {
size = sizeFontGeneric(forCurrentDevice: size)
}
return MFFonts.mfFont55Rg(size)
}
class func fontForBody(withSize size: CGFloat, forWidth width: CGFloat) -> UIFont? {
let size = sizeObjectGeneric(forCurrentDevice: size)?.getValueBased(onSize: width) ?? size
return MFFonts.mfFont55Rg(size)
}
//--------------------------------------------------
// MARK: - 1.0 Fonts
//--------------------------------------------------
class func font(forPlan genericScaling: Bool = true) -> UIFont? {
var size: CGFloat = 100
if genericScaling {
size = sizeFontGeneric(forCurrentDevice: size)
}
return MFFonts.mfFont75Bd(size)
}
class func font(forBiggerHeadLine genericScaling: Bool = true) -> UIFont? {
var size: CGFloat = 48
if genericScaling {
size = sizeFontGeneric(forCurrentDevice: size)
}
return MFFonts.mfFont75Bd(size)
}
class func font(forHeadlineSmall genericScaling: Bool = true) -> UIFont? {
var size: CGFloat = 15
if genericScaling {
size = sizeFontGeneric(forCurrentDevice: size)
}
return MFFonts.mfFont75Bd(size)
}
class func font(forHeadlineSmall2 genericScaling: Bool = true) -> UIFont? {
var size: CGFloat = 16
if genericScaling {
size = sizeFontGeneric(forCurrentDevice: size)
}
return MFFonts.mfFont75Bd(size)
}
class func fontForHeadlineSmall2(forWidth size: CGFloat) -> UIFont? {
var pointSize: CGFloat = 16
pointSize = Styler.sizeObjectGeneric(forCurrentDevice: pointSize)!.getValueBased(onSize: size)
return MFFonts.mfFont75Bd(pointSize)
}
class func fontB1(forWidth size: CGFloat) -> UIFont? {
var pointSize: CGFloat = 13
pointSize = Styler.sizeObjectGeneric(forCurrentDevice: pointSize)!.getValueBased(onSize: size)
return MFFonts.mfFont75Bd(pointSize)
}
//--------------------------------------------------
// MARK: - 1.0 Styles
//--------------------------------------------------
class func styleFeedCardTitleLabel(_ label: UILabel) {
label.font = Styler.fontForFeedCardTitle()
label.textColor = .black
}
class func styleFeedCardTagLabel(_ label: UILabel) {
label.font = Styler.fontB3()
label.textColor = .mfBrownishGrey()
}
class func styleStandardSeparatorView(_ view: UIView) {
view.backgroundColor = .mfBackgroundGray()
}
class func styleLabelHeadlineSmall(_ label: UILabel, genericScaling: Bool) {
label.font = Styler.font(forHeadlineSmall: genericScaling)
label.textColor = .black
}
class func styleFeedCardTitleLabel(_ label: UILabel, genericScaling: Bool) {
label.font = Styler.font(forFeedCardTitle: genericScaling)
label.textColor = UIColor.black
}
class func styleFeedCardTagLabel(_ label: UILabel, genericScaling: Bool) {
label.font = Styler.fontB3(genericScaling)
label.textColor = UIColor.mfBrownishGrey()
}
class func fontB2(forWidth size: CGFloat) -> UIFont? {
var pointSize: CGFloat = 13
pointSize = Styler.sizeObjectGeneric(forCurrentDevice: pointSize)!.getValueBased(onSize: size)
return MFFonts.mfFont55Rg(pointSize)
}
class func fontforChatText(_ genericScaling: Bool = false) -> UIFont? {
var size: CGFloat = 14
if genericScaling {
size = sizeFontGeneric(forCurrentDevice: size)
}
return MFFonts.mfFont55Rg(size)
}
class func font(forAccountLandingGreeting genericScaling: Bool = true) -> UIFont? {
var size: CGFloat = 16
if genericScaling {
size = sizeFontGeneric(forCurrentDevice: size)
}
return MFFonts.mfFont55Rg(size)
}
class func font(forProgressBarBottomLabel genericScaling: Bool = true) -> UIFont? {
var size: CGFloat = 10
if genericScaling {
size = sizeFontGeneric(forCurrentDevice: size)
}
return MFFonts.mfFont55Rg(size)
}
class func font(forFeedCardTitle genericScaling: Bool = true) -> UIFont? {
var size: CGFloat = 16
if genericScaling {
size = sizeFontGeneric(forCurrentDevice: size)
}
return MFFonts.mfFont75Bd(size)
}
class func font(forPrimaryButton genericScaling: Bool = true) -> UIFont? {
var size: CGFloat = 14
if genericScaling {
size = sizeFontGeneric(forCurrentDevice: size)
}
return MFFonts.mfFont75Bd(size)
}
class func fontForPrimaryButton(forWidth size: CGFloat) -> UIFont? {
var pointSize: CGFloat = 14
pointSize = Styler.sizeObjectGeneric(forCurrentDevice: pointSize)!.getValueBased(onSize: size)
return MFFonts.mfFont75Bd(pointSize)
}
class func font(forSmallButton genericScaling: Bool = true) -> UIFont? {
var size: CGFloat = 11
if genericScaling {
size = sizeFontGeneric(forCurrentDevice: size)
}
return MFFonts.mfFont75Bd(size)
}
class func fontForSmallButton(forWidth size: CGFloat) -> UIFont? {
var pointSize: CGFloat = 11
pointSize = Styler.sizeObjectGeneric(forCurrentDevice: pointSize)!.getValueBased(onSize: size)
return MFFonts.mfFont75Bd(pointSize)
}
class func font(forTextField genericScaling: Bool = true) -> UIFont? {
var size: CGFloat = 16
if genericScaling {
size = sizeFontGeneric(forCurrentDevice: size)
}
return MFFonts.mfFont55Rg(size)
}
class func font(forTextFieldUnderLabel genericScaling: Bool = true) -> UIFont? {
var size: CGFloat = 12
if genericScaling {
size = sizeFontGeneric(forCurrentDevice: size)
}
return MFFonts.mfFont55Rg(size)
}
class func fontForUnreadMessage(onSupport genericScaling: Bool = false) -> UIFont? {
var size: CGFloat = 10
if genericScaling {
size = sizeFontGeneric(forCurrentDevice: size)
}
return MFFonts.mfFont75Bd(size)
}
class func font5GMessage(_ genericScaling: Bool) -> UIFont? {
var size: CGFloat = 16
if genericScaling {
size = sizeFontGeneric(forCurrentDevice: size)
}
return MFFonts.mfFont55Rg(size)
}
class func font5GMessage() -> UIFont? {
return font5GMessage(true)
}
class func font(forHeadlineAlternative genericScaling: Bool = true) -> UIFont? {
var size: CGFloat = 24
if genericScaling {
size = sizeFontGeneric(forCurrentDevice: size)
}
return MFFonts.mfFont55Rg(size)
}
class func fontForHeadlineAlternative(forWidth size: CGFloat) -> UIFont? {
var pointSize: CGFloat = 24
pointSize = Styler.sizeObjectGeneric(forCurrentDevice: pointSize)!.getValueBased(onSize: size)
return MFFonts.mfFont55Rg(pointSize)
}
class func fontH255(_ genericScaling: Bool) -> UIFont? {
var size: CGFloat = 25
if genericScaling {
size = sizeFontGeneric(forCurrentDevice: size)
}
return MFFonts.mfFont55Rg(size)
}
class func font(forLargeLoyaltyHeaderTitle genericScaling: Bool = true) -> UIFont? {
var size: CGFloat = 60
if genericScaling {
size = sizeFontGeneric(forCurrentDevice: size)
}
return MFFonts.mfFont75Bd(size)
}
class func font(forLoyaltyTitleSmall genericScaling: Bool = true) -> UIFont? {
var size: CGFloat = 42
if genericScaling {
size = sizeFontGeneric(forCurrentDevice: size)
}
return MFFonts.mfFont75Bd(size)
}
class func font(forLoyaltyMessage genericScaling: Bool = true) -> UIFont? {
var size: CGFloat = 20
if genericScaling {
size = sizeFontGeneric(forCurrentDevice: size)
}
return MFFonts.mfFont55Rg(size)
}
class func font(forPtPCard genericScaling: Bool) -> UIFont? {
var size: CGFloat = 22
if genericScaling {
size = sizeFontGeneric(forCurrentDevice: size)
}
return MFFonts.mfFont75Bd(size)
}
class func fontForLabelWithTopLeftCircle(withSize size: CGFloat, genericScaling: Bool) -> UIFont? {
var size = size
if genericScaling {
size = sizeFontGeneric(forCurrentDevice: size)
}
return MFFonts.mfFont75Bd(size)
}
class func fontOcratxtWitSize(_ size: CGFloat, genericScaling: Bool) -> UIFont? {
var size = size
if genericScaling {
size = sizeFontGeneric(forCurrentDevice: size)
}
return MFFonts.mfFontOcratxt(size)
}
class func boldFont(forScaledSize size: CGFloat) -> UIFont {
return MFFonts.mfFont75Bd(sizeFontGeneric(forCurrentDevice: size))!
}
class func regularFont(forScaledSize size: CGFloat) -> UIFont {
return MFFonts.mfFont55Rg(sizeFontGeneric(forCurrentDevice: size))!
}
//--------------------------------------------------
// MARK: - 1.0 Attributed Strings Style
//--------------------------------------------------
class func styleGetAttributedString(_ string: String?, withStyle style: String?) -> NSAttributedString {
return styleGetAttributedString(string, withStyle: Styler.Style(rawValue: style!)!, genericScaling: true)
}
class func styleGetAttributedString(_ string: String?, withStyle style: Style, genericScaling: Bool) -> NSAttributedString {
switch style {
case .H1:
return styleGetH1AttributedString(string, genericScaling: genericScaling)
case .H2:
return styleGetH2AttributedString(string, genericScaling: genericScaling)
case .H3:
return styleGetH3AttributedString(string, genericScaling: genericScaling)
case .H32:
return styleGetH32AttributedString(string, genericScaling: genericScaling)
case .B1:
return styleGetB1AttributedString(string, genericScaling: genericScaling)
case .B2:
return styleGetB2AttributedString(string, genericScaling: genericScaling)
case .B3:
return styleGetB3AttributedString(string, genericScaling: genericScaling)
case .B20:
return styleGetB20AttributedString(string, genericScaling: genericScaling)
}
}
class func styleGetAttributedString(_ string: String?, font: UIFont, color: UIColor) -> NSAttributedString {
var attributedString: NSAttributedString? = nil
if let string = string, !string.isEmpty {
attributedString = NSAttributedString(string: string, attributes: [NSAttributedString.Key.font: font,
NSAttributedString.Key.foregroundColor: color])
} else {
attributedString = NSAttributedString(string: "")
}
return attributedString!
}
class func styleGetH1AttributedString(_ string: String?, genericScaling: Bool = true) -> NSAttributedString {
return styleGetAttributedString(string, font: fontH1(genericScaling)!, color: .black)
}
class func styleGetH2AttributedString(_ string: String?, genericScaling: Bool = true) -> NSAttributedString {
return styleGetAttributedString(string, font: fontH2(genericScaling)!, color: .black)
}
class func styleGetH3AttributedString(_ string: String?, genericScaling: Bool = true) -> NSAttributedString {
return styleGetAttributedString(string, font: fontH3(genericScaling)!, color: .black)
}
class func styleGetH32AttributedString(_ string: String?, genericScaling: Bool = true) -> NSAttributedString {
return styleGetAttributedString(string, font: fontH32(genericScaling)!, color: .black)
}
class func styleGetB1AttributedString(_ string: String?, genericScaling: Bool = true) -> NSAttributedString {
return styleGetAttributedString(string, font: fontB1(genericScaling)!, color: .black)
}
class func styleGetB2AttributedString(_ string: String?, genericScaling: Bool = true) -> NSAttributedString {
return styleGetAttributedString(string, font: fontB2(genericScaling)!, color: .black)
}
class func styleGetB3AttributedString(_ string: String?, genericScaling: Bool = true) -> NSAttributedString {
return styleGetAttributedString(string, font: fontB3(genericScaling)!, color: .mfBattleshipGrey())
}
class func styleGetB20AttributedString(_ string: String?, genericScaling: Bool = true) -> NSAttributedString {
return styleGetAttributedString(string, font: fontB20(genericScaling)!, color: .black)
}
class func styleGetTopAlignedAttributeString(withLeftStringRightTop left: String?, center: String, rightString right: String?, withCenterStringFontSize fontSize: CGFloat, andColor color: UIColor) -> NSAttributedString {
var left = left ?? ""
var center = center
var right = right ?? ""
let text = "\(left)\(center)\(right)"
let attribs = [NSAttributedString.Key.foregroundColor: color]
var attributedText = NSMutableAttributedString(string: text, attributes: attribs)
let centerRange = (text as NSString).range(of: center)
let centerFont = MFFonts.mfFont75Bd(fontSize)
let centerHeight = centerFont?.capHeight ?? 0.0
attributedText.addAttributes([NSAttributedString.Key.font: MFFonts.mfFont75Bd(fontSize) as Any], range: centerRange)
let leftRange = (text as NSString).range(of: left)
let leftFont = MFFonts.mfFont75Bd(fontSize * 0.34)
let leftHeight = leftFont?.capHeight ?? 0.0
if let leftFont = leftFont {
attributedText.addAttributes([NSAttributedString.Key.font: leftFont,
NSAttributedString.Key.baselineOffset: NSNumber(value: Float(centerHeight - leftHeight))], range: leftRange)
}
let rightRange = NSRange(location: centerRange.location + centerRange.length, length: right.count )
let rightFont = MFFonts.mfFont75Bd(fontSize * 0.34)
let offset = Float((centerFont?.pointSize ?? 0.0) - (centerFont?.capHeight ?? 0.0) + (rightFont?.pointSize ?? 0.0) / 2)
if let rightFont = rightFont {
attributedText.addAttributes([NSAttributedString.Key.font: rightFont,
NSAttributedString.Key.baselineOffset: offset],
range: rightRange)
}
return attributedText
}
class func styleGetAlignCenteredAttrituedString(_ string: inout NSMutableAttributedString?) {
if let string = string, string.length > 0 {
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = .center
string.addAttribute(.paragraphStyle, value: paragraphStyle, range: NSRange(location: 0, length: string.length))
}
}
class func styleGetBoldString(with inputFont: UIFont?, from inputString: String?) -> NSAttributedString? {
let openingRange = (inputString as NSString?)?.range(of: "{")
let closingRange = (inputString as NSString?)?.range(of: "}")
let attrString = NSMutableAttributedString(string: inputString ?? "")
if openingRange?.location != NSNotFound && closingRange?.location != NSNotFound {
let boldLength = (closingRange?.location ?? 0) - (openingRange?.location ?? 0)
if let inputFont = inputFont {
attrString.setAttributes([NSAttributedString.Key.font: inputFont], range: NSRange(location: openingRange?.location ?? 0, length: boldLength))
}
if let closingRange = closingRange {
attrString.replaceCharacters(in: closingRange, with: "")
}
if let openingRange = openingRange {
attrString.replaceCharacters(in: openingRange, with: "")
}
}
return attrString
}
//--------------------------------------------------
// MARK: - Gradient Colors
//--------------------------------------------------
class func gradientSpecialTicketGold() -> [AnyHashable] {
return [UIColor(red: 0.72, green: 0.6, blue: 0.33, alpha: 1),
UIColor(red: 1, green: 0.85, blue: 0.52, alpha: 1),
UIColor(red: 1, green: 0.85, blue: 0.52, alpha: 1),
UIColor(red: 1, green: 0.85, blue: 0.52, alpha: 1),
UIColor(red: 0.6, green: 0.42, blue: 0.07, alpha: 1)]
}
class func gradientSpecialTicketGoldCGColor() -> [AnyHashable] {
return [UIColor(red: 0.72, green: 0.6, blue: 0.33, alpha: 1).cgColor,
UIColor(red: 1, green: 0.85, blue: 0.52, alpha: 1).cgColor,
UIColor(red: 1, green: 0.85, blue: 0.52, alpha: 1).cgColor,
UIColor(red: 1, green: 0.85, blue: 0.52, alpha: 1).cgColor,
UIColor(red: 0.6, green: 0.42, blue: 0.07, alpha: 1).cgColor].compactMap { $0 }
}
class func styleGetLowCaseSpace(_ inputString: String?) -> String? {
if (inputString?.count ?? 0) > 0 {
let trimmedString = inputString?.lowercased().trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
return trimmedString
}
return ""
}
class func labelStrokeAttributes(_ color: UIColor?) -> [AnyHashable : Any]? {
guard let color = color else { return nil }
return [NSAttributedString.Key.strokeColor: color,
NSAttributedString.Key.strokeWidth: -1.0]
}
class func mfStyleBlackPageControl(_ pageControl: UIPageControl?) {
pageControl?.pageIndicatorTintColor = .mfLighterGray()
pageControl?.currentPageIndicatorTintColor = .black
}
//--------------------------------------------------
// MARK: - Custom Styling Views
//--------------------------------------------------
class func styleView(_ view: UIView, show border: MFViewBorder, with color: UIColor?, borderLineWidth: CGFloat, borderLineLength borderLineLengh: CGFloat) {
let borderLine = UIView(frame: .zero)
borderLine.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(borderLine)
switch border {
case .top:
NSLayoutConstraint.constraintPinSubview(borderLine, pinTop: true, pinBottom: false, pinLeft: false, pinRight: false)
NSLayoutConstraint.constraintPinView(borderLine, heightConstraint: true, heightConstant: borderLineWidth, widthConstraint: true, widthConstant: borderLineLengh)
NSLayoutConstraint.constraintPinSubview(borderLine, pinCenterX: true, pinCenterY: false)
case .left:
NSLayoutConstraint.constraintPinSubview(borderLine, pinTop: false, pinBottom: false, pinLeft: true, pinRight: false)
NSLayoutConstraint.constraintPinView(borderLine, heightConstraint: true, heightConstant: borderLineLengh, widthConstraint: true, widthConstant: borderLineWidth)
NSLayoutConstraint.constraintPinSubview(borderLine, pinCenterX: false, pinCenterY: true)
case .bottom:
NSLayoutConstraint.constraintPinSubview(borderLine, pinTop: false, pinBottom: true, pinLeft: false, pinRight: false)
NSLayoutConstraint.constraintPinView(borderLine, heightConstraint: true, heightConstant: borderLineWidth, widthConstraint: true, widthConstant: borderLineLengh)
NSLayoutConstraint.constraintPinSubview(borderLine, pinCenterX: true, pinCenterY: false)
case .right:
NSLayoutConstraint.constraintPinSubview(borderLine, pinTop: false, pinBottom: false, pinLeft: false, pinRight: true)
NSLayoutConstraint.constraintPinView(borderLine, heightConstraint: true, heightConstant: borderLineLengh, widthConstraint: true, widthConstant: borderLineWidth)
NSLayoutConstraint.constraintPinSubview(borderLine, pinCenterX: false, pinCenterY: true)
default:
break
}
borderLine.backgroundColor = color
}
class func mfStylePageControl(_ pageControl: UIPageControl?) {
pageControl?.pageIndicatorTintColor = .mfLighterGray()
pageControl?.currentPageIndicatorTintColor = .mfRed()
}
class func styleTextField(_ textField: UITextField) {
textField.font = fontForTextField()
// As per AKQA
/* If the length of the text field exceeds the amount of space, the size of the text drops down.
So, the entire line of copy can be read.
16 point font size is the lowest recommended size.
*/
textField.minimumFontSize = 16
textField.adjustsFontSizeToFitWidth = true // default is NO. if YES, text will shrink to minFontSize along baseline
}
/*
class func setGradientTo(_ label: UILabel, withColors colors: [AnyHashable]) {
var textSize: CGSize? = nil
if let font = UIFont(name: label.font.fontName, size: label.font.lineHeight) {
textSize = label.text?.size(withAttributes: [NSAttributedString.Key.baselineOffset: 0,
NSAttributedString.Key.font: font])
}
let width = (textSize?.width ?? 0.0) > 1024 ? 1024 : textSize?.width ?? 0.0 // max 1024 due to Core Graphics limitations
let height = (textSize?.height ?? 0.0) > 1024 ? 1024 : textSize?.height ?? 0.0 // max 1024 due to Core Graphics limitations
// create a new bitmap image context
UIGraphicsBeginImageContext(CGSize(width: width, height: height))
let context = UIGraphicsGetCurrentContext()
// push context to make it current (need to do this manually because we are not drawing in a UIView)
if let context = context {
UIGraphicsPushContext(context)
}
var glossGradient: CGGradient?
var rgbColorspace: CGColorSpace?
let num_locations = colors.count
var locations = [CGFloat](repeating: 0.0, count: colors.count)
let components = [CGFloat](repeating: 0.0, count: colors.count * 4)
var componentIndex = 0
for i in 0..<colors.count {
locations[i] = CGFloat((1.0 / Float(colors.count)) * Float(i))
let color = colors[i] as? UIColor
let colorComponents = color?.cgColor.components
for component in 0..<4 {
components[componentIndex] = colorComponents?[component] ?? 0.0
componentIndex += 1
}
}
rgbColorspace = CGColorSpaceCreateDeviceRGB()
glossGradient = CGGradient(colorSpace: rgbColorspace!, colorComponents: components, locations: locations, count: num_locations) as? CGGradient
let topCenter = CGPoint(x: 0, y: 0)
let bottomCenter = CGPoint(x: textSize!.width, y: 0)
context!.drawLinearGradient(glossGradient, start: topCenter, end: bottomCenter, options: [])
UIGraphicsPopContext()
// get a UIImage from the image context
let gradientImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
if let gradientImage = gradientImage {
label.textColor = UIColor(patternImage: gradientImage)
}
}
*/
class func grayscaleImage(_ image: UIImage?) -> UIImage? {
UIGraphicsBeginImageContextWithOptions(image?.size ?? CGSize.zero, _: true, _: 1.0)
let imageRect = CGRect(x: 0, y: 0, width: image?.size.width ?? 0.0, height: image?.size.height ?? 0.0)
// Draw the image with the luminosity blend mode.
// On top of a white background, this will give a black and white image.
image?.draw(in: imageRect, blendMode: .luminosity, alpha: 1.0)
// Get the resulting image.
let filteredImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return filteredImage
}
/*
class func getCountTime(_ leftTime: Int, timeformat timeFormat: String?, time timeUnit: MFTimeFormatUnit, timeSuffix suffix: String?) -> String? {
var seconds = leftTime % 60
var minutes = (leftTime / 60) % 60
var hours = (leftTime / 3600) % 24
let days = leftTime / 86400
guard let times = timeFormat?.components(separatedBy: ":") else { return nil }
var timeString = ""
if times.contains("DD") {
timeString += String(format: "%02ld", days)
if timeUnit == .mfTimeFormatNormal {
let dayKey = (days <= 1) ? "CountDownDay" : "CountDownDays"
let dayUnit = MVMCoreUIUtility.hardcodedString(withKey: dayKey)
timeString += dayUnit!
} else if timeUnit == MFTimeFormatColon && times?.last != "DD" {
timeString += " : "
}
if times.last != "DD" && suffix != nil {
timeString += suffix ?? ""
}
}
if times.contains("HH") {
if !times.contains("DD") {
hours = leftTime / 3600
}
timeString += String(format: "%02d", hours)
if timeUnit == .mfTimeFormatNormal {
let hourKey = (hours <= 1) ? "CountDownHour" : "CountDownHours"
let hourUnit = MVMCoreUIUtility.hardcodedString(withKey: hourKey)!
timeString += hourUnit
} else if timeUnit == MFTimeFormatColon && times?.last != "HH" {
timeString += " : "
}
if times.last != "HH" && suffix != nil {
timeString += suffix ?? ""
}
}
if times.contains("MM") {
if !times.contains("HH") {
if !times.contains("DD") {
minutes = leftTime / 60
} else {
minutes = (leftTime - days * 86400) / 60
}
}
timeString += String(format: "%02d", minutes)
if times.contains("SS") {
if !times.contains("MM") {
if !times.contains("HH") {
if !times.contains("DD") {
seconds = leftTime
} else {
seconds = leftTime % 86400
}
} else {
seconds = leftTime % 3600
}
}
timeString += String(format: "%02d", seconds)
if timeUnit == .mfTimeFormatNormal {
let secondKey = (seconds <= 1) ? "CountDownSec" : "CountDownSecs"
let secondUnit = MVMCoreUIUtility.hardcodedString(withKey: secondKey)
timeString += secondUnit!
}
}
return timeString
}
}
*/
}