我有一个UIView占据了iPhone上的整个窗口。当它旋转到横向时,边缘会变成小黑条,直到它卡入到位,正如我所料。
我想让uiview比屏幕大,所以旋转它不会显示那些黑条,但会显示通常在屏幕外的视图部分。我已经尝试过增加视图的边框和边界,但这似乎没有办法。
有没有人成功地完成了这项工作?
答案 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)
我目前正在开发一款需要屏幕以低于标准速度旋转的应用。为了在我自己的旋转开始之前停止黑色旋转矩形剪切视图(以标准旋转速度),我只需选中常规 - >旁边的框。部署信息 - >需要全屏。
虽然未选中隐藏状态栏框,但我也在视图控制器上隐藏了状态栏。
答案 3 :(得分:0)
UINavigationController和UITabBarController都有系统子视图(UINavigationController:UINavigationTransitionView; UITabBarController:UITransitionView和UIViewControllerWrapperView),默认情况下layer.masksToBounds设置为YES。为了在旋转期间消除黑边,您必须将这些和所有其他分层视图的layer.masksToBounds设置为NO。
但是,我不确定改变上述系统视图的效果是什么?图层是,所以我建议你完成动画后将它们的layer.masksToBounds重置为YES。