mvm_core_ui/MVMCoreUI/Molecules/HeadlineBodyButton.swift
2020-01-13 14:02:20 -05:00

136 lines
4.6 KiB
Swift

//
// HeadlineBodyButton.swift
// MVMCoreUI
//
// Created by Kevin Christiano on 9/12/19.
// Copyright © 2019 Verizon Wireless. All rights reserved.
//
import UIKit
@objcMembers open class HeadlineBodyButton: View {
//------------------------------------------------------
// MARK: - Outlets
//------------------------------------------------------
let headlineBody = HeadlineBody(frame: .zero)
let button = PrimaryButton.primaryTinyButton(false)!
//------------------------------------------------------
// MARK: - Properties
//------------------------------------------------------
var buttonHeadlinePadding: CGFloat = 16
//------------------------------------------------------
// MARK: - Constraints
//------------------------------------------------------
var buttonTopConstraint: NSLayoutConstraint?
//------------------------------------------------------
// MARK: - Initialization
//------------------------------------------------------
public convenience init() {
self.init(frame: .zero)
}
public override init(frame: CGRect) {
super.init(frame: frame)
}
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
public convenience init(json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) {
self.init()
setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData)
}
//------------------------------------------------------
// MARK: - View Lifecycle
//------------------------------------------------------
override open func setupView() {
super.setupView()
guard subviews.isEmpty else { return }
defaultState()
addSubview(headlineBody)
addSubview(button)
headlineBody.topAnchor.constraint(equalTo: layoutMarginsGuide.topAnchor).isActive = true
headlineBody.leadingAnchor.constraint(equalTo: layoutMarginsGuide.leadingAnchor).isActive = true
layoutMarginsGuide.trailingAnchor.constraint(equalTo: headlineBody.trailingAnchor).isActive = true
buttonTopConstraint = button.topAnchor.constraint(equalTo: headlineBody.bottomAnchor, constant: buttonHeadlinePadding)
buttonTopConstraint?.isActive = true
button.leadingAnchor.constraint(equalTo: layoutMarginsGuide.leadingAnchor).isActive = true
layoutMarginsGuide.bottomAnchor.constraint(equalTo: button.bottomAnchor).isActive = true
layoutMarginsGuide.trailingAnchor.constraint(greaterThanOrEqualTo: button.trailingAnchor).isActive = true
}
override open func updateView(_ size: CGFloat) {
super.updateView(size)
headlineBody.updateView(size)
button.updateView(size)
buttonTopConstraint?.constant = headlineBody.hasText() && !button.isHidden ? buttonHeadlinePadding : 0
}
private func defaultState() {
headlineBody.headlineLabel.font = MFStyler.fontH3()
headlineBody.messageLabel.font = MFStyler.fontB3()
button.setAsTiny(true)
button.setAsSecondaryCustom()
button.isHidden = false
buttonHeadlinePadding = PaddingTwo
}
//------------------------------------------------------
// MARK: - Molecule
//------------------------------------------------------
override open func reset() {
super.reset()
headlineBody.reset()
button.reset()
defaultState()
}
open override func setAsMolecule() {
super.setAsMolecule()
headlineBody.setAsMolecule()
button.setAsMolecule()
defaultState()
}
open override func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) {
super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData)
guard let dictionary = json else { return }
if let padding = dictionary.optionalCGFloatForKey("buttonHeadlinePadding") {
buttonHeadlinePadding = padding
}
headlineBody.setWithJSON(dictionary.optionalDictionaryForKey("headlineBody"), delegateObject: delegateObject, additionalData: additionalData)
if let buttonDictionary = dictionary.optionalDictionaryForKey("button") {
button.setWithJSON(buttonDictionary, delegateObject: delegateObject, additionalData: additionalData)
} else {
button.isHidden = true
}
}
}