initial
This commit is contained in:
130
Pods/SwiftEntryKit/Source/MessageViews/EKFormMessageView.swift
generated
Normal file
130
Pods/SwiftEntryKit/Source/MessageViews/EKFormMessageView.swift
generated
Normal file
@@ -0,0 +1,130 @@
|
||||
//
|
||||
// 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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user