mvm_core_ui/MVMCoreUI/Molecules/HeadlineBodyButton.swift
2019-09-13 09:08:33 -04:00

135 lines
4.5 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: ViewConstrainingView {
//------------------------------------------------------
// MARK: - Outlets
//------------------------------------------------------
let headline = HeadlineBody(frame: .zero)
let button = PrimaryButton.primaryTinyButton(false)!
//------------------------------------------------------
// MARK: - Properties
//------------------------------------------------------
var buttonHeadlinePadding: CGFloat = 16
//------------------------------------------------------
// MARK: - Constraints
//------------------------------------------------------
var buttonTopConstraint: NSLayoutConstraint?
//------------------------------------------------------
// MARK: - Initialization
//------------------------------------------------------
public init() {
super.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(headline)
addSubview(button)
headline.topAnchor.constraint(equalTo: layoutMarginsGuide.topAnchor).isActive = true
headline.leadingAnchor.constraint(equalTo: layoutMarginsGuide.leadingAnchor).isActive = true
layoutMarginsGuide.trailingAnchor.constraint(equalTo: headline.trailingAnchor).isActive = true
buttonTopConstraint = button.topAnchor.constraint(equalTo: headline.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)
headline.updateView(size)
button.updateView(size)
buttonTopConstraint?.constant = headline.hasText() ? buttonHeadlinePadding : 0
}
private func defaultState() {
headline.headlineLabel.font = MFStyler.fontH3()
headline.messageLabel.font = MFStyler.fontB3()
button.setAsSecondaryCustom()
button.isHidden = false
buttonHeadlinePadding = PaddingTwo
}
//------------------------------------------------------
// MARK: - Molecule
//------------------------------------------------------
override open func reset() {
super.reset()
headline.reset()
button.reset()
defaultState()
}
open override func setAsMolecule() {
super.setAsMolecule()
headline.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
}
headline.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
}
}
}