1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
//
// LoginViewController.swift
// MullvadVPN
//
// Created by pronebird on 19/03/2019.
// Copyright © 2019 Amagicom AB. All rights reserved.
//
import UIKit
class LoginViewController: UIViewController, HeaderBarViewControllerDelegate {
@IBOutlet var keyboardToolbar: UIToolbar!
@IBOutlet var accountTextField: UITextField!
@IBOutlet var loginForm: UIView!
@IBOutlet var loginFormWrapperBottomConstraint: NSLayoutConstraint!
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if case .embedHeader? = SegueIdentifier.Login.from(segue: segue) {
let headerBarController = segue.destination as? HeaderBarViewController
headerBarController?.delegate = self
}
}
override func viewDidLoad() {
super.viewDidLoad()
accountTextField.inputAccessoryView = keyboardToolbar
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: UIWindow.keyboardWillShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChangeFrame(_:)), name: UIWindow.keyboardWillChangeFrameNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: UIWindow.keyboardWillHideNotification, object: nil)
}
// MARK: - HeaderBarViewControllerDelegate
func headerBarViewControllerShouldOpenSettings(_ controller: HeaderBarViewController) {
performSegue(withIdentifier: SegueIdentifier.Login.showSettings.rawValue, sender: self)
}
// MARK: - Keyboard notifications
@objc private func keyboardWillShow(_ notification: Notification) {
guard let keyboardFrameValue = notification.userInfo?[UIWindow.keyboardFrameEndUserInfoKey] as? NSValue else { return }
makeLoginFormVisible(keyboardFrame: keyboardFrameValue.cgRectValue)
}
@objc private func keyboardWillChangeFrame(_ notification: Notification) {
guard let keyboardFrameValue = notification.userInfo?[UIWindow.keyboardFrameEndUserInfoKey] as? NSValue else { return }
makeLoginFormVisible(keyboardFrame: keyboardFrameValue.cgRectValue)
}
@objc private func keyboardWillHide(_ notification: Notification) {
loginFormWrapperBottomConstraint.constant = 0
view.layoutIfNeeded()
}
// MARK: - IBActions
@IBAction func cancelLogin() {
view.endEditing(true)
}
@IBAction func doLogin() {
view.endEditing(true)
// TODO: Add the code to initiate the log in
performSegue(withIdentifier: "ShowConnect", sender: self)
}
// MARK: - Private
private func makeLoginFormVisible(keyboardFrame: CGRect) {
let convertedKeyboardFrame = view.convert(keyboardFrame, from: nil)
let (_, remainder) = view.frame.divided(atDistance: convertedKeyboardFrame.minY, from: CGRectEdge.minYEdge)
loginFormWrapperBottomConstraint.constant = remainder.height
view.layoutIfNeeded()
}
}
|