// // EKFormMessageView.swift // SwiftEntryKit // // Created by Daniel Huri on 5/15/18. // import UIKit final public class EKFormMessageView: UIView { private let scrollViewVerticalOffset: CGFloat = 20 // MARK: Props private let titleLabel = UILabel() private let scrollView = UIScrollView() private let textFieldsContent: [EKProperty.TextFieldContent] private var textFieldViews: [EKTextField] = [] private var buttonBarView: EKButtonBarView! private let titleContent: EKProperty.LabelContent // MARK: Setup public init(with title: EKProperty.LabelContent, textFieldsContent: [EKProperty.TextFieldContent], buttonContent: EKProperty.ButtonContent) { self.titleContent = title self.textFieldsContent = textFieldsContent super.init(frame: UIScreen.main.bounds) setupScrollView() setupTitleLabel() setupTextFields(with: textFieldsContent) setupButton(with: buttonContent) setupTapGestureRecognizer() scrollView.layoutIfNeeded() set(.height, of: scrollView.contentSize.height + scrollViewVerticalOffset * 2, priority: .defaultHigh) } required public init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } private func setupTextFields(with textFieldsContent: [EKProperty.TextFieldContent]) { var textFieldIndex = 0 textFieldViews = textFieldsContent.map { content -> EKTextField in let textField = EKTextField(with: content) scrollView.addSubview(textField) textField.tag = textFieldIndex textFieldIndex += 1 return textField } textFieldViews.first!.layout(.top, to: .bottom, of: titleLabel, offset: 20) textFieldViews.spread(.vertically, offset: 5) textFieldViews.layoutToSuperview(axis: .horizontally) } // Setup tap gesture private func setupTapGestureRecognizer() { let tapGestureRecognizer = UITapGestureRecognizer( target: self, action: #selector(tapGestureRecognized) ) tapGestureRecognizer.numberOfTapsRequired = 1 addGestureRecognizer(tapGestureRecognizer) } private func setupScrollView() { addSubview(scrollView) scrollView.layoutToSuperview(axis: .horizontally, offset: 20) scrollView.layoutToSuperview(axis: .vertically, offset: scrollViewVerticalOffset) scrollView.layoutToSuperview(.width, .height, offset: -scrollViewVerticalOffset * 2) } private func setupTitleLabel() { scrollView.addSubview(titleLabel) titleLabel.layoutToSuperview(.top, .width) titleLabel.layoutToSuperview(axis: .horizontally) titleLabel.forceContentWrap(.vertically) titleLabel.content = titleContent } private func setupButton(with buttonContent: EKProperty.ButtonContent) { var buttonContent = buttonContent let action = buttonContent.action buttonContent.action = { [weak self] in self?.extractTextFieldsContent() action?() } let buttonsBarContent = EKProperty.ButtonBarContent( with: buttonContent, separatorColor: .clear, expandAnimatedly: true ) buttonBarView = EKButtonBarView(with: buttonsBarContent) buttonBarView.clipsToBounds = true scrollView.addSubview(buttonBarView) buttonBarView.expand() buttonBarView.layout(.top, to: .bottom, of: textFieldViews.last!, offset: 20) buttonBarView.layoutToSuperview(.centerX) buttonBarView.layoutToSuperview(.width, offset: -40) buttonBarView.layoutToSuperview(.bottom) buttonBarView.layer.cornerRadius = 5 } private func extractTextFieldsContent() { for (content, textField) in zip(textFieldsContent, textFieldViews) { content.contentWrapper.text = textField.text } } /** Makes a specific text field the first responder */ public func becomeFirstResponder(with textFieldIndex: Int) { textFieldViews[textFieldIndex].makeFirstResponder() } public override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { titleLabel.textColor = titleContent.style.color(for: traitCollection) } // MARK: User Intractions // Tap Gesture @objc func tapGestureRecognized() { endEditing(true) } }