4

我有一个 UIView 占据了 iphone 上的整个窗口。当它旋转到横向时,边缘会出现小黑条,直到它卡入到位,正如我所期望的那样。

我想让那个 uiview 比屏幕大,这样旋转它就不会显示那些黑条,而是显示通常不在屏幕上的视图部分。我已经尝试增加视图的框架和边界,但这似乎并没有奏效。

有没有人成功地做到了这一点?

4

4 回答 4

4

你需要做两件事来实现这一点。

首先,窗口的根视图控制器将始终将其视图调整为窗口的大小。所以你的大视图需要是根视图控制器视图的子视图(以防止它被缩小),并且你的根视图控制器的视图需要clipsToBounds设置为 NO。实际上所有祖先的大视图都需要clipsToBounds设置为NO。

其次,当窗口旋转时,它会为自己提供黑色子视图,以显式隐藏任何会出现在窗口边界之外的视图。它将这些黑色子视图放在其根视图控制器的视图前面。您需要将根视图控制器的视图移到前面,如下所示:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    UIWindow *window = self.view.window;
    [window bringSubviewToFront:window.rootViewController.view];
}
于 2012-04-06T03:16:33.700 回答
2

当您有两个 UIWindows 重叠时,我发现了另一种方法。(如果您希望在后台显示不可旋转的内容,并在顶部浮动一个可旋转的界面,则可能会出现这种情况。)这个想法是在调用 willAnimateRotationToInterfaceOrientation 时直接搜索最前面的 UIWindow 中的黑条子视图,并显式隐藏它们. 以下代码搜索两层深度:

-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration {
    UIWindow* window = self.view.window;
    for (UIView* view in [window subviews]) {
        if (!CGRectIntersectsRect(window.bounds, view.frame)) {
            view.hidden = YES;
        }

        for (UIView* view_ in [view subviews]) {
            CGRect frame = [view_ convertRect:view_.frame toView:window];
            if (!CGRectIntersectsRect(window.bounds, frame)) {
                view_.hidden = YES;
            }
        }
    }
}
于 2014-06-18T07:58:30.123 回答
0

我目前正在开发一个需要屏幕以低于标准速度旋转的应用程序。为了在我自己的旋转开始之前停止黑色旋转矩形裁剪视图(以标准旋转速度),我只需选中General -> Deployment Info -> Requires Full Screen旁边的框。

在此处输入图像描述

尽管未选中隐藏状态栏框,但我也确实在视图控制器上隐藏了状态栏。

于 2015-11-30T09:58:25.330 回答
0

UINavigationController 和 UITabBarController 都有系统子视图(UINavigationController: UINavigationTransitionView; UITabBarController: UITransitionView 和 UIViewControllerWrapperView),它们的 layer.masksToBounds 默认设置为 YES。为了消除旋转过程中的黑边,您必须将这些以及所有其他分层视图的 layer.masksToBounds 设置为 NO。

但是,我不确定更改上述系统视图层的效果是什么,因此我建议在完成动画后将它们的 layer.masksToBounds 重置为 YES。

于 2017-05-10T15:16:26.000 回答