我有一个 UIView 占据了 iphone 上的整个窗口。当它旋转到横向时,边缘会出现小黑条,直到它卡入到位,正如我所期望的那样。
我想让那个 uiview 比屏幕大,这样旋转它就不会显示那些黑条,而是显示通常不在屏幕上的视图部分。我已经尝试增加视图的框架和边界,但这似乎并没有奏效。
有没有人成功地做到了这一点?
我有一个 UIView 占据了 iphone 上的整个窗口。当它旋转到横向时,边缘会出现小黑条,直到它卡入到位,正如我所期望的那样。
我想让那个 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 都有系统子视图(UINavigationController: UINavigationTransitionView; UITabBarController: UITransitionView 和 UIViewControllerWrapperView),它们的 layer.masksToBounds 默认设置为 YES。为了消除旋转过程中的黑边,您必须将这些以及所有其他分层视图的 layer.masksToBounds 设置为 NO。
但是,我不确定更改上述系统视图层的效果是什么,因此我建议在完成动画后将它们的 layer.masksToBounds 重置为 YES。