#ios #ios7 #uitabbarcontroller #transitions
#iOS #ios7 #uitabbarcontroller #переходы
Вопрос:
Я хочу анимировать переходы между вкладками UITabBarController
. По какой-то причине этот метод из UIViewControllerAnimatedTransitioning
протокола вызывается дважды:
- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
Трассировка стека:
И сразу после:
Также - (void)animationEnded:(BOOL)transitionCompleted
метод вызывается дважды.
Я понятия не имею, почему.
Это код:
- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext {
UIView *containerView = [transitionContext containerView];
UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIViewController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
[toVC.view setTransform:CGAffineTransformMakeTranslation(320, 0)];
[containerView addSubview:toVC.view];
[UIView animateWithDuration:0.5 animations:^{
[toVC.view setTransform:CGAffineTransformIdentity];
[fromVC.view setTransform:CGAffineTransformMakeTranslation(-320, 0)];
} completion:^(BOOL finished) {
[fromVC.view setTransform:CGAffineTransformIdentity];
[toVC.view setTransform:CGAffineTransformIdentity];
[transitionContext completeTransition:YES];
}];
}
Комментарии:
1. Как вы начинаете переход? Segue? Метод вызова?
Ответ №1:
Для первого впечатления я полагаю, что - (void)animationEnded:(BOOL)transitionCompleted
вызывается дважды, потому что вы вызываете [transitionContext completeTransition:YES]
, что основано на документах Apple:
Вызовите этот метод после завершения анимации, чтобы уведомить систему о том, что анимация перехода выполнена. Реализация этого метода по умолчанию вызывает метод animationEnded: аниматора, чтобы дать ему возможность выполнить любую очистку в последнюю минуту.
И если UIViewControllerAnimatedTransitioning
вызывается дважды, то вот так.
Для дальнейшего анализа того, почему UIViewControllerAnimatedTransitioning
вызывается дважды, я был бы рад увидеть вашу animationControllerForPresentedController
и animationControllerForDismissedController
реализацию.