【问题标题】:Can I rotate a UIView without the black bars?我可以旋转没有黑条的 UIView 吗?
【发布时间】:2012-04-19 17:50:20
【问题描述】:
我有一个 UIView,它占据了 iphone 上的整个窗口。当它旋转到横向时,边缘会出现小黑条,直到它卡入到位,正如我所期望的那样。
我想让那个 uiview 比屏幕大,这样旋转它就不会显示那些黑条,而是显示通常不在屏幕上的视图部分。我已经尝试增加视图的框架和边界,但这似乎不起作用。
有人成功过吗?
【问题讨论】:
标签:
ios
uiview
uiviewcontroller
uiinterfaceorientation
uideviceorientation
【解决方案1】:
您需要做两件事来实现这一点。
首先,窗口的根视图控制器将始终将其视图大小调整为窗口的大小。因此,您的大视图需要是根视图控制器视图的子视图(以防止它被缩小),并且您的根视图控制器的视图需要将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;
}
}
}
}
【解决方案3】:
我目前正在开发一个要求屏幕以低于标准速度旋转的应用。为了在我自己的旋转开始之前停止黑色旋转矩形裁剪视图(以标准旋转速度),我只是选中了 General -> Deployment Info -> Requires Full Screen 旁边的框。。 p>
虽然没有选中隐藏状态栏框,但我也确实在视图控制器上隐藏了状态栏。
【解决方案4】:
UINavigationController 和 UITabBarController 都有系统子视图(UINavigationController:UINavigationTransitionView;UITabBarController:UITransitionView 和 UIViewControllerWrapperView),默认情况下 layer.masksToBounds 设置为 YES。为了消除旋转过程中的黑边,您必须将这些以及所有其他分层视图的 layer.masksToBounds 设置为 NO。
但是,我不确定更改上述系统视图层的效果是什么,所以我建议在完成动画后将它们的 layer.masksToBounds 重置为 YES。