2014-10-11 9 views
10

Учитывая новый раздел QuickType на клавиатуре.Использование только уведомления UIKeyboardWillChangeFrameNotification

Это совершенно верно, что можно использовать ТОЛЬКО уведомление для UIKeyboardWillChangeFrameNotification,

и просто «не беспокоить с» «старой» UIKeyboardWillShowNotification и UIKeyboardWillHideNotification?

Тестирование, похоже, показывает, что оно отлично работает, используя ТОЛЬКО keyboardFrameDidChange - но мы могли что-то упустить?

Кстати, вот пример того, как использовать UIKeyboardWillChangeFrameNotification https://stackoverflow.com/a/26226732/294884

ответ

33

Это, безусловно, возможно, и может сократить свой код примерно в два раза. В следующем примере используется автоматический макет для большой тяжелой работы.

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 является NSLayoutConstraint, который связывает нижнюю часть моего текстового поля в нижней части моего зрения. Этот код оживляет поле вверх, когда клавиатура появляется и исчезает, когда она исчезает.

Все это было возможно в iOS < 8 с использованием комбинации UIKeyboardWillShowNotification и UIKeyboardWillHideNotification. Но! Как вы говорите, в iOS 8 представлен раздел QuickType, который может быть скомпенсирован или расширен пользователем. Это решение будет анимировать текстовое поле правильно, чтобы оно всегда было прикреплено к верхней части клавиатуры, независимо от того, открыт или нет QuickType.

+1

хорошо один. cheers – Fattie

+0

Есть ли способ контролировать, когда он прокручивается? На iphone 6 мне не нужны поля для прокрутки, когда пользователь редактирует верхнее текстовое поле, но когда редактирует нижнее текстовое поле, оно должно прокручиваться, чтобы освободить место. –

+0

Используется ли 'UIViewAnimationOptions (UInt (кривая)) правильно? В документации говорится, что 'curve' является' UIViewAnimationCurve', и, глядя на определения, это, похоже, не соответствует значениям для 'UIViewAnimationOptions'. Более того, значение «кривая», возвращаемое на практике в этом уведомлении, равно '7' - частное/неопределенное значение, поэтому простой оператор switch для преобразования между ними не будет обрезать его ... –