Mengapa pengamat onKeyboardDisplayed dipanggil sebelum textViewDidBeginEditing
Aplikasi saya dengan cepat. Saat saya mengedit UITextField, terkadang keyboard menyembunyikan bidang tersebut. Jadi saya menggunakan textFieldDidBeginEditing delegasi untuk menetapkan "activeTextField" (dan textFieldDidEndEditing untuk mengatur ulang ke nihil). Kemudian pada viewDidLoad saya menambahkan pengamat yang ditautkan ke fungsi onKeyboardDisplayed di mana saya menguji nilai "activeTextField" sehingga saya dapat menggesek layar ke atas jika diperlukan. Dan itu bekerja dengan baik :)
Hal baru yang buruk adalah saya mencoba melakukan hal yang sama untuk UITextView, menggunakan textViewDidBeginEditing delegasi untuk menetapkan "activeTextView". Tetapi tidak seperti UITextField, delegasi dipanggil setelah onKeyboardDisplayed sehingga keyboard masih menyembunyikan UITextView saya.
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)
}
}
}
Apakah Anda tahu cara untuk memperbaikinya?
Jawaban
Akhirnya saya menemukan solusi di sini: Acara keyboard yang dipanggil sebelum acara delegasi UITextView
Saya mengubah keyboardWillShowNotification
NotificationCenter.default.addObserver(self, selector: #selector(onKeyboardDisplayed(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil)
oleh keyboardDidShowNotification
NotificationCenter.default.addObserver(self, selector: #selector(onKeyboardDisplayed(notification:)), name: UIResponder.keyboardDidShowNotification, object: nil)
Dan sekarang berfungsi dengan baik: fungsi onKeyboardDisplayed saya dipanggil setelah textViewDidBeginEditing delegasi
Cara standar untuk menangani kemunculan keyboard adalah ini
Di ViewController Anda:
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
}
Ini menggerakkan bingkai tampilan ke atas dan ke bawah sesuai dengan ketinggian keyboard. Jika saya memahami pertanyaan Anda dengan benar, saya yakin ini dapat membantu Anda