在视图控制器转换过程中获取子视图的最终帧

9

我正在实现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尚未出现,那么如何动画化子视图以实现此效果?


1
你找到解决这个问题的方法了吗?我也遇到了同样的问题。 - Alex
@Alex 暂时还没有解决方案。 - Juan Herrero Diaz
2个回答

8

在开始动画之前,您可以在要转换的视图控制器的视图上调用layoutIfNeeded()。这将布局您的子视图并为toButton提供最终框架。


把这个放在那里,先调用setNeedsLayout(),然后你就可以开始了。 - GoldenJoe

0

不要设置绝对中心,而是通过增量调整中心。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接