2017-11-14 22 views
8

मैंने एक चैट यूआई बनाया है जिसमें मैंने constraint को tableView के लिए स्क्रीन के नीचे जोड़ा है। मैं कुंजीपटल जो छोड़कर iPhone एक्सआईफोन एक्स कीबोर्ड अतिरिक्त स्थान दिखा रहा है

यूआई सभी उपकरणों में ठीक काम कर रहा है की ऊंचाई जोड़ने जब कुंजी बोर्ड दिखाई नहीं देता है द्वारा बाधा मान परिवर्तित कर रहा हूँ:

enter image description here

कौन सा ठीक है।

enter image description here

मैं इसके लिए एक अलग दृष्टिकोण के लिए प्रयास करने के लिए है या यह की कमी का उपयोग कर हल किया जा सकता कार्य करें: जब कीबोर्ड दिखाई रिक्त स्थान TextView और कीबोर्ड के बीच में दिख रहा है

समस्या है?

उत्तर

9

अपनी बाधा के मूल्य की गणना करते समय सुरक्षित क्षेत्र के निचले इन्सेट की ऊंचाई घटाकर आज़माएं।

यहां एक नमूना कार्यान्वयन है जो UIKeyboardWillChangeFrame अधिसूचना को संभालता है।

@objc private func keyboardWillChange(_ notification: Notification) { 
    guard let userInfo = (notification as Notification).userInfo, let value = userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue else { return } 
    let newHeight: CGFloat 
    if #available(iOS 11.0, *) { 
     newHeight = value.cgRectValue.height - view.safeAreaInsets.bottom 
    } else { 
     newHeight = value.cgRectValue.height 
    } 
    myConstraint.value = newHeight 
} 
+0

जैसे कुछ के साथ डिवाइस के बीच अंतर कर सकते हैं धन्यवाद ब्रो। मैं केवल इस तर्क को लागू करने जा रहा था लेकिन आपने ठीक से जवाब दिया। क्या यह थोड़ा अजीब नहीं है कि हमें ओएस की जांच करनी है? 'UIKeyboardFrameEndUserInfoKey 'को सुरक्षित क्षेत्र इंसेट काटने में ऊंचाई वापस करनी चाहिए। – Amit

+0

@ प्रवेश करें यदि आपको आईओएस 11 से पहले 'सुरक्षित एरियाइन्ससेट' मौजूद नहीं है, तो आपको अपना डिप्लॉयमेंट लक्ष्य <11.0 है, तो आपको एक संस्करण जांच करना होगा। – nathan

0

अपने ViewController पर अपनी बाधा के लिए आउटलेट बनाएं। मैं इसे अब के लिए yourConstraint के रूप में संदर्भित करूंगा। फिर कुंजीपटल दिखाए जाने पर और जब इसे खारिज किया जा रहा है, तो यह पता लगाने के लिए कोड जोड़ें। वहां आप बाधा के constant को तदनुसार बदलते हैं। यह आपको बाधाओं का उपयोग करने की अनुमति देता है।

viewWillAppear में:

NotificationCenter.default.addObserver(self, selector: #selector(YourViewController.keyboardWillShow), name:  NSNotification.Name.UIKeyboardWillShow, object: nil) // <=== Replace YourViewController with name of your view controller 
NotificationCenter.default.addObserver(self, selector: #selector(YourViewController.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil) // <=== Replace YourViewController with name of your view controller 

viewWillDisappear में:

NotificationCenter.default.removeObserver(self) 

में अपने UIViewController

@objc private func keyboardWillShow(notification: Notification) { 
    guard let keyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else { 
     yourConstraint.isActive = false // <=== 
     view.layoutIfNeeded() 
     return 
    } 
    let duration: TimeInterval = ((notification.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue) ?? 0.4 
    yourConstraint.constant = newValue // <=== 
    UIView.animate(withDuration: duration) { 
     self.view.layoutIfNeeded() 
    } 
} 

@objc private func keyboardWillHide(notification: Notification) { 
    let duration: TimeInterval = ((notification.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue) ?? 0.4 
    yourConstraint.constant = oldValue 
    UIView.animate(withDuration: duration) { 
     self.view.layoutIfNeeded() 
    } 
} 

UIView.animate आवश्यक नहीं (ब्लॉक के अंदर है) है, लेकिन यह संक्रमण अच्छा लग रहा है।

+0

मैंने वही किया। समस्या 'newValue' है। मैंने 'newValue' को 'keyboardSize.height' के रूप में जोड़ा है जो आईफोन एक्स को छोड़कर सभी उपकरणों में सही काम करता है। जैसा कि आप पहली छवि में देख सकते हैं, एप्लिकेशन को बंद करने के लिए नीचे दी गई नई सुविधा के लिए सफेद जगह है। मुझे लगता है कि कुंजीपटल दिखाई देने पर अंतरिक्ष जोड़ रहा है। – Amit

+0

मैं देखता हूं। अपने प्रयासों को डुप्लिकेट करने के लिए खेद है ... क्या आप शायद अपने स्टोरीबोर्ड में अपने दृश्य पदानुक्रम का एक स्क्रीनशॉट पोस्ट कर सकते हैं? क्या आपने आईफोन एक्स के लिए सिर्फ एक अलग बाधा स्थापित करने का प्रयास किया था? आप इस https://stackoverflow.com/a/26962452/7270113 – erikmartens

संबंधित मुद्दे