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

我有一个UIView,占用iPhone上的整个窗口。 当它旋转到风景,边缘得到小黑条,直到它卡入到位,我所期望的。

我想使uiview比屏幕更大,所以旋转它不会显示那些黑条,而是显示视图中通常不在屏幕上的部分。 我试图增加视图的框架和边界,但是这似乎并没有做到这一点。

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

你需要做两件事情来做到这一点。

首先,窗口的根视图控制器总是将视图的大小调整为窗口的大小。 所以你的大视图需要是根视图控制器视图的子视图(以防止它被resize),而你的根视图控制器的视图需要将clipsToBounds设置为NO。 实际上所有的大观点的祖先都需要将clipsToBounds设置为NO。

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

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

当我有两个UIWindows重叠时,我find了一种替代方法。 (如果你想在背景中使用不可旋转的内容,可能会出现这种情况,可旋转的界面会浮在上面)。这个想法是在调用willAnimateRotationToInterfaceOrientation的时候直接在最前面的UIWindow中search黑条子视图,并且明确地隐藏它们。 以下代码深度search两个级别:

 -(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; } } } } 

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

在这里输入图像说明

我也有隐藏在视图控制器上的状态栏,虽然隐藏状态栏没有被选中。

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

但是,我不确定改变上述系统视图的图层的效果是什么,所以我build议一旦你完成animation,将它们的layer.masksToBounds重新设置为YES。