我可以在没有黑条的情况下旋转UIView吗?

时间:2012-04-06 00:46:05

标签: ios uiview uiviewcontroller uiinterfaceorientation uideviceorientation

我有一个UIView占据了iPhone上的整个窗口。当它旋转到横向时,边缘会变成小黑条,直到它卡入到位,正如我所料。

我想让uiview比屏幕大,所以旋转它不会显示那些黑条,但会显示通常在屏幕外的视图部分。我已经尝试过增加视图的边框和边界,但这似乎没有办法。

有没有人成功地完成了这项工作?

4 个答案:

答案 0 :(得分:3)

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

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

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

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    UIWindow *window = self.view.window;
    [window bringSubviewToFront:window.rootViewController.view];
}

答案 1 :(得分: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;
            }
        }
    }
}

答案 2 :(得分:0)

我目前正在开发一款需要屏幕以低于标准速度旋转的应用。为了在我自己的旋转开始之前停止黑色旋转矩形剪切视图(以标准旋转速度),我只需选中常规 - >旁边的框。部署信息 - >需要全屏

enter image description here

虽然未选中隐藏状态栏框,但我也在视图控制器上隐藏了状态栏。

答案 3 :(得分:0)

UINavigationController和UITabBarController都有系统子视图(UINavigationController:UINavigationTransitionView; UITabBarController:UITransitionView和UIViewControllerWrapperView),默认情况下layer.masksToBounds设置为YES。为了在旋转期间消除黑边,您必须将这些和所有其他分层视图的layer.masksToBounds设置为NO。

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