【问题标题】: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。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-12-09
            • 1970-01-01
            • 2012-12-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-09-18
            相关资源
            最近更新 更多