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