Почему наблюдатель onKeyboardDisplayed вызывается перед textViewDidBeginEditing
Мое приложение работает быстро. Когда я редактирую UITextField, иногда клавиатура скрывает поле. Поэтому я использую делегат textFieldDidBeginEditing, чтобы установить «activeTextField» (и textFieldDidEndEditing, чтобы сбросить его до нуля). Затем в viewDidLoad я добавляю наблюдателя, связанного с функцией onKeyboardDisplayed, где я проверяю значение «activeTextField», чтобы при необходимости можно было провести по экрану вверх. И работает хорошо :)
Плохая новость заключается в том, что я попытался сделать то же самое для UITextView, используя делегат textViewDidBeginEditing для установки «activeTextView». Но в отличие от UITextField, делегат вызывается после onKeyboardDisplayed, поэтому клавиатура по-прежнему скрывает мой UITextView.
NotificationCenter.default.addObserver(self, selector: #selector(onKeyboardDisplayed(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil)
@objc func onKeyboardDisplayed(notification: Notification) {
guard let keyboardRect = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else {
return
}
var visibleRect : CGRect = self.view.frame
visibleRect.size.height -= keyboardRect.height
if (activeTextField != nil) {
// Get y position of active textField bottom.
let textFieldBottomPosition = activeTextField!.convert(CGPoint.zero, to: nil).y + activeTextField!.frame.height
if(textFieldBottomPosition > visibleRect.size.height) {
// swipe up
view.frame.origin.y = (visibleRect.size.height - textFieldBottomPosition - 6)
}
}
if (activeTextView != nil) {
// Get y position of active textView bottom.
let textViewBottomPosition = activeTextView!.convert(CGPoint.zero, to: nil).y + activeTextView!.frame.height
if(textViewBottomPosition > visibleRect.size.height) {
// swipe up
view.frame.origin.y = (visibleRect.size.height - textViewBottomPosition - 6)
}
}
}
Вы знаете, как это исправить?
Ответы
Наконец, я нашел здесь решение: события клавиатуры, вызываемые перед событиями делегата UITextView
Я сменил keyboardWillShowNotification
NotificationCenter.default.addObserver(self, selector: #selector(onKeyboardDisplayed(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil)
по keyboardDidShowNotification
NotificationCenter.default.addObserver(self, selector: #selector(onKeyboardDisplayed(notification:)), name: UIResponder.keyboardDidShowNotification, object: nil)
И теперь все работает хорошо: моя функция onKeyboardDisplayed вызывается после делегата textViewDidBeginEditing
Стандартный способ борьбы с появлением клавиатуры:
В вашем ViewController:
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(handleKeyboardWillShow), name: UIControl.keyboardWillShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(handleKeyboardWillHide), name: UIControl.keyboardWillHideNotification, object: nil)
}
@objc private func handleKeyboardWillShow(notification: NSNotification){
guard let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else{
return
}
self.view.frame.origin.y -= keyboardSize.height
}
@objc private func handleKeyboardWillHide(notification: NSNotification){
self.view.frame.origin.y = 0
}
Это перемещает рамку обзора вверх и вниз в соответствии с высотой клавиатуры. Если я правильно понимаю ваш вопрос, я считаю, что это может вам помочь