3

我正在实现自己的自定义UIViewController转换,当我将 TO View Controller 的帧输出到调试器时,我会收到{{0, 0}, {0, 0}}初始帧和最终帧。我认为上下文中的方法应该显示最终转换后的预期帧,以及转换前的初始帧。

这是它应该如何工作的吗?

-(void)startInteractiveTransition:(id<UIViewControllerContextTransitioning>)transitionContext{

    UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

    CGRect initialToFrame = [transitionContext initialFrameForViewController:toVC];
    CGRect finalToFrame = [transitionContext finalFrameForViewController:toVC];
    NSLog(@"initialToFrame: %@, finalToFrame: %@", NSStringFromCGRect(initialToFrame), NSStringFromCGRect(finalToFrame));
}

调试器显示: initialToFrame: {{0, 0}, {0, 0}}, finalToFrame: {{0, 0}, {0, 0}}


此外,调试器还显示以下警告。这是否会导致错误?

Presenting view controllers on detached view controllers is discouraged

4

1 回答 1

1

您应该知道的第一件事是,大约有两种自定义过渡:全屏和非全屏,并且toVC.vew在非全屏过渡中要求最后一帧是没有意义的。

在你没有modalPresentationStyle明确设置或设置它UIModalPresentationFullScreen的情况下(这是默认值)UIKit 知道它toVC.view会覆盖整个屏幕,所以-finalFrameForViewController:toVC会返回正确的帧:主屏幕帧。

通过使用modalPresentationStyle = UIModalPresentationCustom,您指定转换应该是非全屏的,就是这样:toVC.view将部分覆盖fromVC.view(因此fromCV.view将保留在层次结构中),覆盖 toVC.viewfromVC.view位置是您的决定,这就是为什么-finalFrameForViewController:返回CGRectZero

CGRectZero告诉你的是:“嘿,伙计,别管它,把那个视图放在你想要的任何地方”。

查看此演示文稿以获取更多信息:http ://es.slideshare.net/Split82/custom-uiviewcontroller-transitions

希望这可以帮助。

于 2014-09-20T17:47:37.637 回答