2014-10-11 37 views
10

Rozważenie nowej sekcji klawiatury QuickType.Używanie tylko powiadomienia UIKeyboardWillChangeFrameNotification

Czy to do końca prawdą, że można użyć TYLKO zgłoszenie na UIKeyboardWillChangeFrameNotification,

i po prostu „nie przejmuj się z” „starszym” UIKeyboardWillShowNotification i UIKeyboardWillHideNotification?

Testowanie zdaje się pokazywać, że działa idealnie, używając TYLKO keyboardFrameDidChange - ale może nam brakować czegoś?

BTW tutaj jest przykład jak używać UIKeyboardWillChangeFrameNotification https://stackoverflow.com/a/26226732/294884

Odpowiedz

33

Jest to z pewnością możliwe i może zmniejszyć swój kod tylko o połowę. Poniższy przykład wykorzystuje Automatyczny układ dla wielu podnoszenia ciężkich przedmiotów.

NSNotificationCenter.defaultCenter().addObserverForName(
    UIKeyboardWillChangeFrameNotification, 
    object: nil, 
    queue: nil 
) { (notification) in 
    var userInfo = notification.userInfo! 

    let frameEnd = userInfo[UIKeyboardFrameEndUserInfoKey]!.CGRectValue 
    let convertedFrameEnd = self.view.convertRect(frameEnd, fromView: nil) 
    let heightOffset = self.view.bounds.size.height - convertedFrameEnd.origin.y 
    self.messageFieldBottomConstraint.constant = heightOffset 

    let curve = userInfo[UIKeyboardAnimationCurveUserInfoKey]!.unsignedIntValue 
    let options = UIViewAnimationOptions(rawValue: UInt(curve) << 16) 

    UIView.animateWithDuration(
     userInfo[UIKeyboardAnimationDurationUserInfoKey]!.doubleValue, 
     delay: 0, 
     options: options, 
     animations: { 
      self.view.layoutIfNeeded() 
     }, 
     completion: nil 
    ) 
} 

self.messageFieldBottomConstraint jest NSLayoutConstraint, które wiąże się z głębi pola tekstowego na dole moim zdaniem. Ten kod animuje pole, gdy klawiatura pojawia się i znika, gdy znika.

Wszystko to było możliwe w iOS < 8 przy użyciu kombinacji UIKeyboardWillShowNotification i UIKeyboardWillHideNotification. Ale! Jak już mówisz, iOS 8 wprowadza sekcję QuickType, którą użytkownik może zwinąć lub rozwinąć. To rozwiązanie spowoduje prawidłowe animowanie pola tekstowego, tak aby zawsze było ono dołączone do górnej części klawiatury, niezależnie od tego, czy QuickType jest otwarty.

+1

dobry. Pozdrawiam – Fattie

+0

Czy istnieje sposób, aby kontrolować, kiedy przewija? W przypadku iPhone'a 6 nie trzeba przewijać pól, gdy użytkownik edytuje pole tekstowe w górnej części tekstu, ale gdy edytuje dolne pole tekstowe, powinien przewinąć w celu zrobienia miejsca. –

+0

Czy użycie opcji UIViewAnimationOptions (UInt (curve)) jest poprawne? Dokumentacja mówi, że 'curve' jest' UIViewAnimationCurve', i patrząc na definicje, nie wydaje się, aby to było zgodne z wartościami dla 'UIViewAnimationOptions'. Jeszcze lepiej, wartość 'curve' zwrócona w praktyce w tym powiadomieniu to' 7' - wartość prywatna/niezdefiniowana, więc prosta instrukcja przełączania, aby przekonwertować między nimi, nie zmniejszy jej ... –