I've been building UIs with Storyboards. Added an NSObject file to the Storyboard to handle keyboard open/close detection within the NSObject file.
This is NSObject file code.
import UIKit
final class KeyboardEvader: NSObject {
@IBOutlet private weak var scrollView: UIScrollView?
override func awakeFromNib() {
super.awakeFromNib()
registerForKeyboardNotifications()
}
private func registerForKeyboardNotifications() {
NotificationCenter.default.addObserver(
self,
selector: #selector(onShowKeyboard(_:)),
name: UIResponder.keyboardWillShowNotification,
object: nil
)
NotificationCenter.default.addObserver(
self,
selector: #selector(onHideKeyboard(_:)),
name: UIResponder.keyboardWillHideNotification,
object: nil
)
}
@objc private func onShowKeyboard(_ notification: Notification) {
print("scrollView", scrollView)
print("onShowKeyboard")
guard let scrollView = scrollView else { return }
guard let keyboardFrame = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect else { return }
let insets = UIEdgeInsets(top: 0, left: 0, bottom: keyboardFrame.height, right: 0)
print(insets)
scrollView.contentInset = insets
scrollView.scrollIndicatorInsets = insets
}
@objc private func onHideKeyboard(_ notification: Notification) {
print("zero")
guard let scrollView = scrollView else { return }
scrollView.contentInset = .zero
scrollView.scrollIndicatorInsets = .zero
}
}
onShowKeyboard is called from within the ViewController created as a Storyboard, but does not work when created with a Xib.
Maybe it has something to do with UIResponder Chain? How do I solve it?