क्यों पर्यवेक्षक onKeyboardDisplayed textViewDidBeginEditing से पहले कहा जाता है
मेरा ऐप स्विफ्ट में है। जब मैं एक UITextField को संपादित करता हूं, तो कभी-कभी कीबोर्ड फ़ील्ड को छुपाता है। तो मैं एक "activeTextField" (और textFieldDidEndEditing को इसे रीसेट करने के लिए रीसेट करने के लिए) सेट करने के लिए डेलिगेट टेक्स्टफीडबिडिजाइनिंग का उपयोग करता हूं। फिर viewDidLoad पर मैं एक onKeyboardDisplayed फ़ंक्शन से जुड़ा एक पर्यवेक्षक जोड़ता हूं, जहां मैं "activeTextField" के मूल्य का परीक्षण करता हूं ताकि जरूरत पड़ने पर स्क्रीन को स्वाइप कर सकूं। और यह अच्छी तरह से काम करता है :)
बुरा नया यह है कि मैंने UITextView के लिए भी ऐसा ही करने की कोशिश की, "ActiveTextView" सेट करने के लिए डेलिगेट टेक्स्टडीडबिजाइन ईडिटिंग का उपयोग करके। लेकिन UITextField के विपरीत, प्रतिनिधि को onKeyboardDisplayed के बाद कहा जाता है, इसलिए कीबोर्ड अभी भी मेरे UvextView को छुपाता है।
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 प्रतिनिधि घटनाओं से पहले बुलाए गए कीबोर्ड इवेंट
मैंने कीबोर्ड बदल दिया
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 प्रतिनिधि प्रतिनिधि के बाद कहा जाता है
कीबोर्ड प्रदर्शित होने से निपटने का मानक तरीका यह है
आपके 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
}
यह कीबोर्ड की ऊंचाई के अनुसार व्यू फ्रेम को ऊपर और नीचे ले जाता है। अगर मैं आपके सवाल को सही ढंग से समझती हूं, तो मेरा मानना है कि यह आपकी मदद कर सकता है