2017-10-15 2 views
1
@objc func keyboardWasShown(_ notification:NSNotification) { 

    var userinfo = notification.userInfo! 

    let kbSize:NSValue = userinfo[UIKeyboardFrameBeginUserInfoKey] as! NSValue 

    let kbRectSize = kbSize.cgRectValue 

    let edgeInsects = UIEdgeInsetsMake(0, 0,kbRectSize.height + 10, 0) 

    self.scrollView.contentInset = edgeInsects 
    self.scrollView.scrollIndicatorInsets = edgeInsects 



    // active text field 

    var aRect:CGRect = self.view.frame 
    aRect.size.height -= kbRectSize.height 


    if(!aRect.contains(activeField.frame.origin)){ 
     scrollView.isScrollEnabled = true 
    scrollView.scrollRectToVisible(activeField.frame, animated: true) 
     aRect = CGRect.zero 
    } 
} 

Der Bildlauf wird zum ersten Mal wie beabsichtigt durchgeblättert und reagiert dann nicht mehr. Der Code funktionierte einwandfrei bis Xcode 8.3 ohne irgendwelche Probleme.UIKeyboard Notification.userInfo Schlüsselfehler in Xcode 9

Bitte bestätigen Sie, ob es ein Fehler ist oder nicht und wie man es umgehen kann.Vielen Dank im Voraus.

+0

Siehe - https://developer.apple.com/library/content/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html#//apple_ref/doc/uid/TP40009542-CH5-SW7 – user1046037

Antwort

0
    // ==== solution =====// 
      // ==== USE UIKeyboardFrameEndUserInfoKey === 

    // as UIKeyboardFrameBeginUserInfoKey return height as 0 for some 
     //reason on second call onwards , some weird bug indeed. 


    var userinfo = notification.userInfo! 

         // === bug fix ===== 
    let kbSize:NSValue = userinfo[UIKeyboardFrameEndUserInfoKey] as! NSValue 

    let kbRectSize = kbSize.cgRectValue 

    let edgeInsects = UIEdgeInsetsMake(0, 0,kbRectSize.height + 10, 0) 

    self.scrollView.contentInset = edgeInsects 
    self.scrollView.scrollIndicatorInsets = edgeInsects 


    // active text field 

    var aRect:CGRect = self.view.frame 
    aRect.size.height -= kbRectSize.height 

    if(!aRect.contains(activeField.frame.origin)){ 
     scrollView.isScrollEnabled = true 
     scrollView.scrollRectToVisible(activeField.frame, animated: true) 
     aRect = CGRect.zero 
    } 

Lösung gefunden, in Xcode 9, scheint es einige Wechsel in Schlüssel zu sein - Wert-Paare von Tasten Benachrichtigung userinfo Wörterbuch.

Verwenden UIKeyboardFrameEndUserInfoKey statt UIKeyboardFrameBeginUserInfoKey,

Als Wert für UIKeyboardFrameBeginUserInfoKey aus irgendeinem Grund nicht die richtige Größe der Tastatur auf den zweiten Anruf ab zurückgibt.

0

Ich habe auch das gleiche Problem und durch einige Änderungen funktioniert es gut. In Ihrem Szenario Code unten versuchen und sehen, ob es funktioniert:

@objc func keyboardWasShown(_ notification:NSNotification) { 

    var keyboardHeight: CGFloat = 260 

    var userinfo = notification.userInfo! 

    let keyboardSize = (userinfo[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size 

    if keyboardSize!.height > 10.0{ 
     keyboardHeight = keyboardSize!.height 
    } 

    let edgeInsects = UIEdgeInsetsMake(0, 0, keyboardHeight + 10, 0) 

    self.scrollView.contentInset = edgeInsects 
    self.scrollView.scrollIndicatorInsets = edgeInsects 

    // active text field 

    var aRect:CGRect = self.view.frame 
    aRect.size.height -= kbRectSize.height 

    if(!aRect.contains(activeField.frame.origin)){ 
     scrollView.isScrollEnabled = true 
     scrollView.scrollRectToVisible(activeField.frame, animated: true) 
     aRect = CGRect.zero 
    } 
} 

ich Code unten in meinem Projekt verwendet habe, für Bildschirm-Zeichen und es funktioniert völlig in Ordnung:

func keyboardWasShown(notification: NSNotification){ 
    //Need to calculate keyboard exact size due to Apple suggestions 
    var keyboardHeight: CGFloat = 260 

    self.scrollView.isScrollEnabled = true 

    var info = notification.userInfo! 
    let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size 
    if keyboardSize!.height > 10.0{ 
     keyboardHeight = keyboardSize!.height 
    } 

    let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardHeight, 0.0) 

    self.scrollView.contentInset = contentInsets 
    self.scrollView.scrollIndicatorInsets = contentInsets 

    var aRect : CGRect = self.view.frame 
    aRect.size.height -= keyboardHeight 

    if let activeField = self.activeField { 
     if (!aRect.contains(activeField.frame.origin)){ 
      self.scrollView.scrollRectToVisible(activeField.frame, animated: true) 
     } 
    } 
} 

func keyboardWillBeHidden(notification: NSNotification){ 
    //Once keyboard disappears, restore original positions 

    self.scrollView.contentInset = UIEdgeInsets.zero 
    self.scrollView.scrollIndicatorInsets = UIEdgeInsets.zero 
    self.scrollView.isScrollEnabled = false 

} 

Versuchen Sie einfach, und zu debuggen mit noch einige Änderungen nach Ihren Anforderungen. Hoffe, es funktioniert.

+0

ich es versucht schon, keine Hilfe – CodeDev