Как использовать кривую UIAnimation по умолчанию iOS7
анимации iOS7 ведут себя не так, как в iOS6. Похоже, что они используют другую кривую Безье. В тех случаях, когда iOS6 использует своего рода "lightInOutSine", iOS7 больше похожа на "easeInOutExpo". (http://matthewlein.com/ceaser/)
Есть ли способ использовать эту кривую? Я хочу синхронизировать мои анимации, когда клавиатура открывается/закрывается.
Ответы
Ответ 1
Вот как я это делаю (по крайней мере, когда клавиатура будет показана)
- (void)keyboardWillShow:(NSNotification *)notification {
NSDictionary *keyboardAnimationDetail = [notification userInfo];
UIViewAnimationCurve animationCurve = [keyboardAnimationDetail[UIKeyboardAnimationCurveUserInfoKey] integerValue];
CGFloat duration = [keyboardAnimationDetail[UIKeyboardAnimationDurationUserInfoKey] floatValue];
[UIView animateWithDuration:duration delay:0.0 options:(animationCurve << 16) animations:^{
// Set the new properties to be animated here
} completion:nil];
}
Вы получаете кривую анимации из уведомления о клавиатуре, как обычно, и переводите ее в вариант анимации путем ее смещения.
Ответ 2
Обновление, исправленное в 7.1. Больше не нужно.
По какой-либо причине кривая анимации, сообщенная об увольнении клавиатуры, неверна. Кажется, что на самом деле это 6 < 16 вместо 7 < 17.
Вот что я делаю с UIKeyboardWillChangeFrameNotification
, чтобы определить, какую анимационную кривую использовать.
NSDictionary *keyboardAnimationDetail = [notification userInfo];
CGRect keyboardEndFrameWindow = [keyboardAnimationDetail[UIKeyboardFrameEndUserInfoKey] CGRectValue];
double keyboardTransitionDuration = [keyboardAnimationDetail[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
// gives incorrect value of 7 on dismissal
// UIViewAnimationCurve keyboardTransitionAnimationCurve = [keyboardAnimationDetail[UIKeyboardAnimationCurveUserInfoKey] integerValue];
CGRect keyboardEndFrameView = [self.view convertRect:keyboardEndFrameWindow fromView:nil];
CGFloat newConstant = (self.view.frame.size.height - keyboardEndFrameView.origin.y);
[UIView animateWithDuration:keyboardTransitionDuration
delay:0.0f
options:newConstant == 0 ? (6 << 16) : (7 << 16)
animations:^{
self.tableView.contentInset = UIEdgeInsetsMake(self.tableView.contentInset.top, 0, self.view.frame.size.height - keyboardEndFrameView.origin.y + self.commentToolbar.frame.size.height, 0);
self.tableView.scrollIndicatorInsets = UIEdgeInsetsMake(self.tableView.scrollIndicatorInsets.top, 0, self.view.frame.size.height - keyboardEndFrameView.origin.y + self.commentToolbar.frame.size.height, 0);
self.commentViewToSuperviewBottomConstraint.constant = (self.view.frame.size.height - keyboardEndFrameView.origin.y);
[self.view layoutIfNeeded];
}
completion:^(__unused BOOL finished){
}];
В основном, я определяю, скрывается ли рамка клавиатуры, если новое начало y будет находиться вне рамки нашего представления (newConstant
). Затем, основываясь на этом, я использую либо 6, либо 7:
newConstant == 0 ? (6 << 16) : (7 << 16)
Остальное просто корректирует мои tableView
contentInset
и scrollIndicatorInsets
, а также изменяет константу на панели инструментов, которая перемещается с клавиатуры.