Ответ 1
Это определенно возможно и может сократить ваш код примерно вдвое. В следующем примере используется автоматический макет для большой тяжелой работы.
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.