斯威夫特 > 4.++
您可以使用协议和协议扩展。
让我们创建 KeyboardListener 协议
protocol KeyboardListener: class {
func registerKeyboardObserver()
func keyboardDidUpdate(keyboardHeight: CGFloat)
func removeObserver()
}
然后在 UIViewController 扩展中创建 @objc 函数
extension UIViewController {
@objc func adjustForKeyboard(notification: Notification) {
guard let keyboardValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else { return }
let keyboardScreenEndFrame = keyboardValue.cgRectValue
let keyboardViewEndFrame = view.convert(keyboardScreenEndFrame, from: view.window)
if notification.name == UIResponder.keyboardWillHideNotification {
if let keyboardLister = self as? KeyboardListener {
keyboardLister.keyboardDidUpdate(keyboardHeight: .zero)
}
} else {
if let keyboardLister = self as? KeyboardListener {
keyboardLister.keyboardDidUpdate(keyboardHeight: keyboardViewEndFrame.height - view.safeAreaInsets.bottom)
}
}
}
}
然后,为默认实现使用键盘侦听器扩展
extension KeyboardListener where Self: UIViewController {
func registerKeyboardObserver() {
let notificationCenter = NotificationCenter.default
notificationCenter.addObserver(self, selector: #selector(adjustForKeyboard), name: UIResponder.keyboardWillHideNotification, object: nil)
notificationCenter.addObserver(self, selector: #selector(adjustForKeyboard), name: UIResponder.keyboardWillChangeFrameNotification, object: nil)
}
func removeObserver() {
NotificationCenter.default.removeObserver(self)
}
}
最后,我们可以在 ViewController 类中使用它
extension EditProfileVC: KeyboardListener {
func keyboardDidUpdate(keyboardHeight: CGFloat) {
//update view when keyboard appear,
}
}
并从 viewwillAppear 调用 register 并从 deinit 调用 removeObserver
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
registerKeyboardObserver()
}
deinit {
removeObserver()
}