Antidote/Antidote/LoginGenericCreateControlle...

155 lines
5.0 KiB
Swift

// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
import Foundation
import SnapKit
private struct PrivateConstants {
static let FieldsOffset = 20.0
static let VerticalOffset = 30.0
}
class LoginGenericCreateController: LoginBaseController {
fileprivate var containerView: IncompressibleView!
fileprivate var containerViewTopConstraint: Constraint!
var titleLabel: UILabel!
var firstTextField: ExtendedTextField!
var secondTextField: ExtendedTextField!
var bottomButton: RoundedButton!
override func loadView() {
super.loadView()
createGestureRecognizers()
createContainerView()
createTitleLabel()
createExtendedTextFields()
createGoButton()
configureViews()
installConstraints()
}
override func keyboardWillShowAnimated(keyboardFrame frame: CGRect) {
if containerView.frame.isEmpty {
return
}
let underFormHeight = containerView.frame.size.height - secondTextField.frame.maxY
let offset = min(0.0, underFormHeight - frame.height)
containerViewTopConstraint.update(offset: offset)
view.layoutIfNeeded()
}
override func keyboardWillHideAnimated(keyboardFrame frame: CGRect) {
containerViewTopConstraint.update(offset: 0.0)
view.layoutIfNeeded()
}
func configureViews() {
fatalError("override in subclass")
}
}
extension LoginGenericCreateController {
@objc func tapOnView() {
view.endEditing(true)
}
@objc func bottomButtonPressed() {
fatalError("override in subclass")
}
}
extension LoginGenericCreateController: ExtendedTextFieldDelegate {
func loginExtendedTextFieldReturnKeyPressed(_ field: ExtendedTextField) {
if field == firstTextField {
_ = secondTextField.becomeFirstResponder()
}
else if field == secondTextField {
view.endEditing(true)
bottomButtonPressed()
}
}
}
private extension LoginGenericCreateController {
func createGestureRecognizers() {
let tapGR = UITapGestureRecognizer(target: self, action: #selector(LoginCreateAccountController.tapOnView))
view.addGestureRecognizer(tapGR)
}
func createContainerView() {
containerView = IncompressibleView()
containerView.backgroundColor = .clear
view.addSubview(containerView)
}
func createTitleLabel() {
titleLabel = UILabel()
titleLabel.textColor = theme.colorForType(.LoginButtonBackground)
titleLabel.font = UIFont.antidoteFontWithSize(26.0, weight: .light)
titleLabel.backgroundColor = .clear
containerView.addSubview(titleLabel)
}
func createExtendedTextFields() {
firstTextField = ExtendedTextField(theme: theme, type: .login)
firstTextField.delegate = self
firstTextField.returnKeyType = .next
containerView.addSubview(firstTextField)
secondTextField = ExtendedTextField(theme: theme, type: .login)
secondTextField.delegate = self
secondTextField.returnKeyType = .go
containerView.addSubview(secondTextField)
}
func createGoButton() {
bottomButton = RoundedButton(theme: theme, type: .login)
bottomButton.addTarget(self, action: #selector(LoginCreateAccountController.bottomButtonPressed), for: .touchUpInside)
containerView.addSubview(bottomButton)
}
func installConstraints() {
containerView.customIntrinsicContentSize.width = CGFloat(Constants.MaxFormWidth)
containerView.snp.makeConstraints {
containerViewTopConstraint = $0.top.equalTo(view).constraint
$0.centerX.equalTo(view)
$0.width.lessThanOrEqualTo(Constants.MaxFormWidth)
$0.width.lessThanOrEqualTo(view).offset(-2 * Constants.HorizontalOffset)
$0.height.equalTo(view)
}
titleLabel.snp.makeConstraints {
$0.top.equalTo(containerView).offset(PrivateConstants.VerticalOffset)
$0.centerX.equalTo(containerView)
}
firstTextField.snp.makeConstraints {
$0.top.equalTo(titleLabel.snp.bottom).offset(PrivateConstants.FieldsOffset)
$0.leading.equalTo(containerView)
$0.trailing.equalTo(containerView)
}
secondTextField.snp.makeConstraints {
$0.leading.trailing.equalTo(firstTextField)
if firstTextField.isHidden {
$0.top.equalTo(titleLabel.snp.bottom).offset(PrivateConstants.FieldsOffset)
}
else {
$0.top.equalTo(firstTextField.snp.bottom).offset(PrivateConstants.FieldsOffset)
}
}
bottomButton.snp.makeConstraints {
$0.top.equalTo(secondTextField.snp.bottom).offset(PrivateConstants.VerticalOffset)
$0.leading.trailing.equalTo(firstTextField)
}
}
}