3

我有一个UIView,占用iPhone上的整个窗口。当它旋转到风景时,边缘会得到小黑条,直到它卡入到位,就像我期望的那样。我可以在没有黑条的情况下旋转UIView吗?

我想使uiview大于屏幕,以便旋转它不会显示那些黑条,但会显示视图中通常不在屏幕上的部分。我试图增加视图的框架和范围,但似乎并没有这样做。

有没有人成功做过这件事?

回答

2

您需要做两件事才能做到这一点。

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

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

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    UIWindow *window = self.view.window; 
    [window bringSubviewToFront:window.rootViewController.view]; 
} 
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; 
      } 
     } 
    } 
} 
+0

这对我很好。 – David 2014-08-25 16:19:54

0

我目前的工作。为了在我自己开始旋转之前停止黑色旋转矩形剪裁视图(以标准旋转速度),我只需选中常规 - >部署信息 - >需要全屏旁边的框。

enter image description here

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

0

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

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

相关问题