Swift
override func viewDidLoad() {
self.registerForKeyboardNotifications()
}
private func registerForKeyboardNotifications() {
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWasShown(notification:)), name: .UIKeyboardDidShow, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillBeHidden(notification:)), name: .UIKeyboardWillHide, object: nil)
}
@objc func keyboardWasShown(notification: Notification) {
if let info = notification.userInfo,
let kbSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue,
let activeTextField = self.activeTextField {
let inputAccesoryViewHeight = activeTextField.inputAccessoryView?.frame.height ?? 0
if (keyboardHeight ?? 0) < kbSize.height {
keyboardHeight = kbSize.height
}
let finalHeight = keyboardHeight! + inputAccesoryViewHeight
let contentInsets = UIEdgeInsetsMake(0, 0, finalHeight, 0)
self.scrollView.contentInset = contentInsets
self.scrollView.scrollIndicatorInsets = contentInsets
var aRect = self.view.frame
aRect.size.height -= keyboardHeight!
let frame = self.scrollView.convert(activeTextField.frame, from: activeTextField.superview)
var visibleRect = CGRect()
visibleRect.origin = self.scrollView.contentOffset
visibleRect.size = self.scrollView.bounds.size
if (!aRect.contains(frame.origin)) {
self.scrollView.scrollRectToVisible(frame, animated: true)
}
}
}
@objc func keyboardWillBeHidden(notification: Notification) {
let contentInsets = UIEdgeInsets.zero
self.scrollView.contentInset = contentInsets
self.scrollView.scrollIndicatorInsets = contentInsets
}
// UITextFieldDelegate
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
self.activeTextField = textField
return true
}
func textFieldDidEndEditing(_ textField: UITextField) {
if textField == self.activeTextField {
self.activeTextField = nil
}
}
No hay comentarios:
Publicar un comentario