Получить окончательные кадры подпредставлений во время перехода контроллера представления

Я реализую пользовательский переход между контроллерами представления в 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.

Вместо того, чтобы устанавливать абсолютный центр, отрегулируйте центр с помощью дельты.

Другие вопросы по тегам