Warum der Beobachter onKeyboardDisplayed vor textViewDidBeginEditing aufgerufen wird
Meine App ist schnell. Wenn ich ein UITextField bearbeite, verbirgt manchmal die Tastatur das Feld. Daher verwende ich den Delegaten textFieldDidBeginEditing, um ein "activeTextField" festzulegen (und textFieldDidEndEditing, um es auf null zurückzusetzen). Dann füge ich in viewDidLoad einen Beobachter hinzu, der mit einer onKeyboardDisplayed-Funktion verknüpft ist, in der ich den Wert von "activeTextField" teste, damit ich den Bildschirm bei Bedarf nach oben wischen kann. Und es funktioniert gut :)
Das schlechte Neue ist, dass ich versucht habe, dasselbe für eine UITextView zu tun, indem ich den Delegaten textViewDidBeginEditing verwendet habe, um eine "activeTextView" festzulegen. Im Gegensatz zu UITextField wird der Delegat jedoch nach onKeyboardDisplayed aufgerufen, sodass die Tastatur meine UITextView weiterhin verbirgt.
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)
}
}
}
Kennen Sie einen Weg, das zu beheben?
Antworten
Schließlich habe ich hier eine Lösung gefunden: Tastaturereignisse, die vor UITextView-Delegatereignissen aufgerufen wurden
Ich habe keyboardWillShowNotification geändert
NotificationCenter.default.addObserver(self, selector: #selector(onKeyboardDisplayed(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil)
von keyboardDidShowNotification
NotificationCenter.default.addObserver(self, selector: #selector(onKeyboardDisplayed(notification:)), name: UIResponder.keyboardDidShowNotification, object: nil)
Und jetzt funktioniert es gut: Meine Funktion onKeyboardDisplayed wird nach dem Delegaten textViewDidBeginEditing aufgerufen
Die Standardmethode für den Umgang mit der Tastatur ist die folgende
In Ihrem 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
}
Dadurch wird der Ansichtsrahmen entsprechend der Höhe der Tastatur auf und ab bewegt. Wenn ich Ihre Frage richtig verstehe, glaube ich, dass dies Ihnen helfen kann