Подтвердить что ты не робот

Как использовать кривую UIAnimation по умолчанию iOS7

анимации iOS7 ведут себя не так, как в iOS6. Похоже, что они используют другую кривую Безье. В тех случаях, когда iOS6 использует своего рода "lightInOutSine", iOS7 больше похожа на "easeInOutExpo". (http://matthewlein.com/ceaser/)

Есть ли способ использовать эту кривую? Я хочу синхронизировать мои анимации, когда клавиатура открывается/закрывается.

4b9b3361

Ответ 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, а также изменяет константу на панели инструментов, которая перемещается с клавиатуры.