Получить окончательные кадры подпредставлений во время перехода контроллера представления
Я реализую пользовательский переход между контроллерами представления в iOS 7+. В частности, у меня есть одна и та же кнопка в контроллере вида A и контроллере вида B, единственная разница в его положении (она немного выше в контроллере вида B).
Я хочу, чтобы при переходе от контроллера вида A к контроллеру вида B кнопка от A перемещалась вверх так, чтобы она заканчивалась в конечном положении в контроллере вида B.
Вот мой animateTransition:
метод:
- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
UIView *containerView = [transitionContext containerView];
[containerView insertSubview:toViewController.view belowSubview:fromViewController.view];
UIButton *fromButton = (UIButton *)[containerView viewWithTag:1];
UIButton *toButton = (UIButton *)[containerView viewWithTag:2];
toButton.hidden = YES;
[UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
fromButton.center = toButton.center;
} completion:^(BOOL finished) {
toButton.hidden = NO;
[transitionContext completeTransition:![transitionContext transitionWasCancelled]];
}];
}
Проблема, которую я вижу в том, что toButton.center
НЕ правильная позиция. Это похоже на то, что ограничения AutoLayout еще не были применены (я получаю тот же прямоугольник рамки, что и в IB). Это приводит к тому, что кнопка не заканчивается в правильном положении после завершения перехода.
Где ошибка? Как я могу получить правильные окончательные кадры подпредставлений из представленного контроллера представления? Если это невозможно, поскольку контроллер представления B еще не появился, как я могу анимировать подпредставления для достижения этого эффекта?
2 ответа
Вы можете вызвать layoutIfNeeded() в представлении toViewController перед запуском анимации. Это должно компоновать ваши подпредставления и дать вам окончательный кадр для вашего toButton.
Вместо того, чтобы устанавливать абсолютный центр, отрегулируйте центр с помощью дельты.