MPMoviePlayerController 在全屏模式后使 App 的方向不正确

Posted

技术标签:

【中文标题】MPMoviePlayerController 在全屏模式后使 App 的方向不正确【英文标题】:MPMoviePlayerController leaves App in incorrect orientation after fullscreen mode 【发布时间】:2012-04-10 15:06:10 【问题描述】:

所以我们构建了一个只支持横向的 iPad 应用。这是通过在 plist 中将 Supported interface orientations (iPad) 设置为 Landscape (left/right home button) 来强制执行的。此外,所有UIViewControllers 都实现了shouldAutorotateToInterfaceOrientation:,如下所示:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

    return UIInterfaceOrientationIsLandscape(interfaceOrientation);

这工作正常,应用程序被锁定为横向。现在我们在其中一个视图中嵌入了MPMoviePlayerController。当用户全屏观看这部电影时,他可以旋转到纵向。电影播放器​​似乎绕过了我们所有的横向设置。这对我来说很好,但是当用户在仍然处于纵向时点击done 按钮时,我们所有的UIViewControllers 也都是纵向的并且看起来很糟糕!

用户必须将 iPad 旋转到横向以使画面再次看起来不错,然后将无法按预期旋转回纵向。

那么为什么即使所有shouldAutorotateToInterfaceOrientation 都告诉ios 不要旋转到纵向,我的视图也会旋转到纵向?以及如何确保电影播放器​​不会旋转我的视图?

如果您的解决方案还将电影播放器​​本身锁定为横向,那我没问题。只要我的观点不旋转,我就很高兴! :)

【问题讨论】:

您是否尝试过将 MPMoviePlayerController 子类化,然后覆盖 shouldAutorotateToInterfaceOrientation: 以使其与您的其他视图控制器匹配? shouldAutorotateToInterfaceOrientation: 不会在 MPMoviePlayerController 类上调用。 MPMoviePlayerViewController 有一个,但覆盖那个并没有帮助。似乎无法强制电影播放器​​为横向。 我的意思是 MPMovePlayerViewController。我的手指没有收到消息。 MPMoviePlayerViewController 继承自 UIViewController,并且 UIViewController 确实有一个 shouldAutorotateToInterfaceOrientation: 方法,您应该可以在 MPMoviePlayerViewController 的子类中重写该方法。我没有时间尝试,但我认为值得一试。 试过了,但没有结果。 shouldAutorotateToInterfaceOrientation: 方法在旋转之前甚至不会被调用。如果您能给我提供一个工作示例,那就太好了! 当视图控制器旋转方法没有被调用时,通常意味着视图控制器控制当前视图层次结构中的一个子视图,而不是整个视图层次结构。我注意到你说,“[W]e 在我们的一个视图中嵌入了一个 MPMoviePlayerController。”这可能是问题的根源。如果我是你,我会实例化一个 MPMoviePlayerViewController,然后从其他视图控制器中以模态方式呈现它。我希望我有时间制作一个工作示例,因为这是一个有趣的问题。 【参考方案1】:

那么,即使所有 shouldAutorotateToInterfaceOrientation 都告诉 iOS 不要旋转到纵向,为什么我的视图会旋转到纵向?以及如何确保电影播放器​​不会旋转我的视图?

如果您的解决方案还将电影播放器​​本身锁定为横向,那我没问题。只要我的观点不旋转,我就没事! :)

我在使用这个视图层次结构时遇到了这个确切的问题:

       +------------------------+  +-------------------+
       |                        |  |                   |
       | UINavigationController +->| Some Intermediate |
       |                        |  | View Controllers  |
       +------------------------+  |                   |
                                   +---------------+---+
                                                   |
                                                   v
                                          +--------------------------+
                                          |  MPMoviePlayerController |
                                          |       (embed)            |
                                          +--------------------------+

所有中间视图控制器都被锁定为横向,因此应用永远不会处于纵向,除非 MPMoviePlayerController 处于全屏状态(导致与 OP 完全相同的问题)。

解决方案是通过创建一个覆盖shouldAutorotateToInterfaceOrientation 的子类来将UINavigationController 锁定为横向。这样 MPMoviePlayerController 不再旋转到纵向。我怀疑进入全屏时它会将自己添加到主窗口的 rootViewController,在我的例子中是 UINavigationController(或者更确切地说是我的子类)。

希望这会有所帮助!

【讨论】:

感谢 Taum。它真的对我有帮助。伟大的解决方案兄弟。 :)

以上是关于MPMoviePlayerController 在全屏模式后使 App 的方向不正确的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MPMoviePlayerController 上处理多个 SRT 文件

在 MPMoviePlayerController 上执行捏合手势时屏幕黑屏

在 UITableViewCell 中嵌入 MPMoviePlayerController

MPMoviePlayerController 在影片结尾更改控件样式

后台的 MPMoviePlayerController / AVAudioSession 在来电后不会重新开始播放

MPMoviePlayerController 在启动前显示空白屏幕?