// // CommonKeyboard.swift // PayCash // // 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: WalletApplicationDelegate { // swiftlint:disable force_cast return UIApplication.shared.delegate as! WalletApplicationDelegate } }