我有一个UIView,占用iPhone上的整个窗口。当它旋转到风景时,边缘会得到小黑条,直到它卡入到位,就像我期望的那样。我可以在没有黑条的情况下旋转UIView吗?
我想使uiview大于屏幕,以便旋转它不会显示那些黑条,但会显示视图中通常不在屏幕上的部分。我试图增加视图的框架和范围,但似乎并没有这样做。
有没有人成功做过这件事?
我有一个UIView,占用iPhone上的整个窗口。当它旋转到风景时,边缘会得到小黑条,直到它卡入到位,就像我期望的那样。我可以在没有黑条的情况下旋转UIView吗?
我想使uiview大于屏幕,以便旋转它不会显示那些黑条,但会显示视图中通常不在屏幕上的部分。我试图增加视图的框架和范围,但似乎并没有这样做。
有没有人成功做过这件事?
您需要做两件事才能做到这一点。
首先,窗口的根视图控制器将始终将其视图的大小调整为窗口的大小。因此,您的大视图需要是根视图控制器视图的子视图(以防止它被调整大小),并且您的根视图控制器的视图需要将clipsToBounds
设置为NO。事实上,所有的大观点的祖先都需要将clipsToBounds
设置为NO。
其次,当窗口旋转时,它会给自己的黑色子视图显式隐藏任何视图,否则会出现在窗口的边界之外。它将这些黑色子视图放在其根视图控制器视图的前面。您需要将根视图控制器的视图移动到前面,这样的:
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
UIWindow *window = self.view.window;
[window bringSubviewToFront:window.rootViewController.view];
}
我发现当你有两个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;
}
}
}
}
UINavigationController和UITabBarController都具有默认情况下将layer.masksToBounds设置为YES的系统子视图(UINavigationController:UINavigationTransitionView; UITabBarController:UITransitionView和UIViewControllerWrapperView)。为了消除旋转过程中的黑色边缘,您必须将这些和所有其他层次视图的layer.masksToBounds设置为NO。
但是,我不确定更改上述系统视图图层的效果是什么,所以我建议您在完成动画后将其layer.masksToBounds重置为YES。
这对我很好。 – David 2014-08-25 16:19:54