// // 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 } } }