क्यों पर्यवेक्षक onKeyboardDisplayed textViewDidBeginEditing से पहले कहा जाता है

Dec 23 2020

मेरा ऐप स्विफ्ट में है। जब मैं एक 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)
        }
    }
}

क्या आप इसे ठीक करने का कोई तरीका जानते हैं?

जवाब

2 syntiz Dec 23 2020 at 20:36

अंत में मुझे यहाँ एक हल मिला: 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 प्रतिनिधि प्रतिनिधि के बाद कहा जाता है

1 LucaSfragara Dec 23 2020 at 18:54

कीबोर्ड प्रदर्शित होने से निपटने का मानक तरीका यह है

आपके 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
}

यह कीबोर्ड की ऊंचाई के अनुसार व्यू फ्रेम को ऊपर और नीचे ले जाता है। अगर मैं आपके सवाल को सही ढंग से समझती हूं, तो मेरा मानना ​​है कि यह आपकी मदद कर सकता है