0

苹果文档(https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/presentViewController:animated:completion :) 说“在 iPhone 和 iPod touch 上,呈现的视图始终是全屏的。” 但在 iOS 7 中,有自定义视图控制器转换 API。已经有很多演示表明“presentedViewController”可以是我们想要的任何大小。在这种情况下,Apple 的 Doc 不是真的吗?

4

1 回答 1

4

我相信苹果仍然是正确的,尽管可能会产生误导。默认情况下它将全屏显示,但如果您提供自定义转换委托,您可以对框架执行任何您想要的操作,等等......

Apple 所说的全屏(在这种情况下,我认为)的意思是它的边缘延伸到设备的最大高度和宽度。以前它会受到可能已添加的导航栏或其他工具栏之类的限制,但在 iOS 7 中默认情况下它们不再尊重它们。

但是,使用自定义过渡,您现在可以通过在过渡期间更改其框架的大小来让较小的视图控制器覆盖另一个视图控制器。有关示例,请参见 Teehan & Lax 的精彩转换 API 帖子:

http://www.teehanlax.com/blog/custom-uiviewcontroller-transitions/

这是-animateTransition视图控制器上的框架设置为显然不会全屏的值的方法。请注意设置变量的行:endFrame

- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext {
    // Grab the from and to view controllers from the context
    UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

    // Set our ending frame. We'll modify this later if we have to
    CGRect endFrame = CGRectMake(80, 280, 160, 100);   // <- frame is only 160 x 100

    if (self.presenting) {
        fromViewController.view.userInteractionEnabled = NO;

        [transitionContext.containerView addSubview:fromViewController.view];
        [transitionContext.containerView addSubview:toViewController.view];

        CGRect startFrame = endFrame;
        startFrame.origin.x += 320;

        toViewController.view.frame = startFrame;

        [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
            fromViewController.view.tintAdjustmentMode = UIViewTintAdjustmentModeDimmed;
            toViewController.view.frame = endFrame;
        } completion:^(BOOL finished) {
            [transitionContext completeTransition:YES];
        }];
    }
    else {
        toViewController.view.userInteractionEnabled = YES;

        [transitionContext.containerView addSubview:toViewController.view];
        [transitionContext.containerView addSubview:fromViewController.view];

        endFrame.origin.x += 320;

        [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
            toViewController.view.tintAdjustmentMode = UIViewTintAdjustmentModeAutomatic;
            fromViewController.view.frame = endFrame;
        } completion:^(BOOL finished) {
            [transitionContext completeTransition:YES];
        }];
    }
}

因此,当提供自定义转换时,您和转换的视图控制器将具有您为它们指定的任何边缘和/或框架。当您开始自定义转换时,它们不会突然变成全屏,所以 Apple 是对的,但在对当前方法描述的解释中可能并不完全彻底。

于 2014-03-24T17:18:26.907 回答