Я столкнулся с несколькими проблемами, пытаясь заставить мой текстовый просмотр правильно прокручиваться и анимироваться для iOS 7 и iOS 8, а также с новой функцией QuickType. Сначала я сосредоточился на анимации вставок вида прокрутки, но поведение было разным в iOS 7 и 8, и я не мог заставить его работать правильно для обоих.
Тогда я понял, что могу упростить вещи, просто сосредоточившись на кадре, и это сработало для меня с гораздо более простым кодом. В итоге:
- зарегистрируйтесь для
UIKeyboardDidChangeFrameNotification
(это будет уведомлять, когда QuickType также будет показан / скрыт).
- выясните, сколько вертикального пространства вам нужно, чтобы изменить рамку вашего текстового представления.
- анимация изменения размера кадра.
Вот код, иллюстрирующий вышесказанное:
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidChangeFrameWithNotification:) name:UIKeyboardDidChangeFrameNotification object:nil];
}
- (void)keyboardDidChangeFrameWithNotification:(NSNotification *)notification {
CGFloat keyboardVerticalIncrease = [self keyboardVerticalIncreaseForNotification:notification];
[self animateTextViewFrameForVerticalOffset:keyboardVerticalIncrease];
}
- (CGFloat)keyboardVerticalIncreaseForNotification:(NSNotification *)notification {
CGFloat keyboardBeginY = [notification.userInfo[UIKeyboardFrameBeginUserInfoKey] CGRectValue].origin.y;
CGFloat keyboardEndY = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue].origin.y;
CGFloat keyboardVerticalIncrease = keyboardBeginY - keyboardEndY;
return keyboardVerticalIncrease;
}
- (void)animateTextViewFrameForVerticalOffset:(CGFloat)offset {
CGFloat constant = self.bottomConstraint.constant;
CGFloat newConstant = constant + offset;
self.bottomConstraint.constant = newConstant;
[self.view layoutIfNeeded];
[UIView animateWithDuration:0.5 animations:^{
[self.view layoutIfNeeded];
}];
}
Краткое примечание по анимации. Я использовал Autolayout, поэтому я решил анимировать NSAutoLayoutConstraint текстового представления, а не непосредственно фрейм. И чтобы сделать это, я вызываю [self.view layoutIfNeeded]
перед и внутри блока анимации. Это правильный способ анимации ограничений. Я нашел этот совет здесь .