// // CommonKeyboard.swift // Wallet // // Created by Igor on 23.03.2021. // Copyright © 2021 AM. All rights reserved. // import UIKit public struct KeyboardInfo { public let frameBegin: CGRect public let frameEnd: CGRect public let isLocal: Bool public let animationCurve: Int public let duration: TimeInterval } public extension KeyboardInfo { init(notification: Notification) { frameBegin = (notification.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue ?? CGRect.zero frameEnd = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue ?? CGRect.zero isLocal = (notification.userInfo?[UIResponder.keyboardIsLocalUserInfoKey] as? Bool) ?? true animationCurve = (notification.userInfo?[UIResponder.keyboardAnimationCurveUserInfoKey] as? Int) ?? 0 duration = (notification.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? TimeInterval) ?? 0 } } enum KeyboardConnectionType: String { case willShow case didShow case willHide case didHide case willChangeFrame case didChangeFrame fileprivate var notification: NSNotification.Name { ([ .willShow: UIResponder.keyboardWillShowNotification, .didShow: UIResponder.keyboardDidShowNotification, .willHide: UIResponder.keyboardWillHideNotification, .didHide: UIResponder.keyboardDidHideNotification, .willChangeFrame: UIResponder.keyboardWillChangeFrameNotification, .didChangeFrame: UIResponder.keyboardDidChangeFrameNotification ] as [KeyboardConnectionType: NSNotification.Name])[self]! } } extension UIViewController { private struct Keyboard { static var values = "values" } private var keyboard: [KeyboardConnectionType: AnyObject]? { get { Common.Runtime.object(self, key: &Keyboard.values) } set { Common.Runtime.set(self, value: newValue, key: &Keyboard.values) } } func connectKeyboard(action: KeyboardConnectionType, _ handler: ((KeyboardInfo) -> Void)?) { let value = Notification.subscribe(name: action.notification) { (ntf) in handler?(KeyboardInfo(notification: ntf)) } if keyboard == nil { keyboard = [action: value] } else { keyboard?[action] = value } } func disconnectKeyboard() { disconnectKeyboard(action: .willShow) disconnectKeyboard(action: .willHide) disconnectKeyboard(action: .didShow) disconnectKeyboard(action: .didHide) disconnectKeyboard(action: .willChangeFrame) disconnectKeyboard(action: .didChangeFrame) } func disconnectKeyboard(action: KeyboardConnectionType) { guard let object = keyboard?[action] else { return } Notification.unsubscribe(observer: object) keyboard?.removeValue(forKey: action) } var appDelegate: AppDelegate { // swiftlint:disable force_cast return UIApplication.shared.delegate as! AppDelegate } }