我在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尚未出现而无法实现,那么我如何设置子视图动画才能达到此效果呢?
答案 0 :(得分:7)
在开始动画之前,您可以在toViewController的视图中调用layoutIfNeeded()。这应该布局您的子视图,并为您提供toButton的最终框架。
答案 1 :(得分:0)
不是设置绝对中心,而是通过增量调整中心。