防止 MPMoviePlayerController 在全屏时旋转和缩放为纵向
Posted
技术标签:
【中文标题】防止 MPMoviePlayerController 在全屏时旋转和缩放为纵向【英文标题】:Prevent MPMoviePlayerController rotating and scaling to portrait when in fullscreen 【发布时间】:2012-06-27 16:10:24 【问题描述】:在 iPhone 4/4s 的 ios5 应用程序中,我有一个 UIViewController,其中添加了一个 MPMoviePlayerController 视图:
[self.view insertSubview:self.fullscreenMoviePlayerController.view atIndex:2];
UIViewController 只支持横向:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation
// Return YES for supported orientations.
return interfaceOrientation == UIInterfaceOrientationLandscapeLeft ||
interfaceOrientation == UIInterfaceOrientationLandscapeRight;
这可以正确地将旋转锁定为仅横向。但是,当我将 MPVideoPlayerController 设置为全屏显示时,这将被忽略,并且视频不再被限制为横向并旋转到手机所在的任何方向。
如何防止 MPMoviePlayerController 的视频全屏旋转到纵向?当手机旋转到纵向时,视频不旋转是至关重要的。
我已经尝试继承 MPVideoPlayerController 并覆盖 shouldAutorotateToInterfaceOrientation:
但这没有效果。
MPMoviePlayerController 只是视图的一部分,因此绝对不能使用 MPMoviePlayerViewCotroller。
【问题讨论】:
您需要什么才能始终以横向模式播放视频?是吗 是的。无论是否全屏,我都需要视频仅以横向显示。 你是在 iPad 还是 iPhone 上工作? 为什么不使用 AVPlayer 并将 AVPlayerLayer 添加到显示视图而不是使用 MPVideoPlayerController? @StevenVeltema 如果我在开始时就知道 MPMoviePlayerController 有多么错误,我会这样做并且我肯定会在未来的项目中这样做,但我已经做到了这一点,其他一切都是现在工作正常(经过大量变通后),所以我不愿意放弃这一切,不得不从头开始构建所有 UI。 【参考方案1】:如果您真的想避免使用 MPMoviePlayerViewController,这似乎相当困难。 一个选项,即使你在全屏模式下似乎也有效,是手动设置 MPMoviePlayerController 视图的框架。 (请注意,在其他 iOS 问题中,有时使用背景视图会产生不同的结果,但值得一试)。
MyMPMoviePlayerController.view.frame = CGRectMake(0, 0, your numbers, here);
但是,Apple 在他们的文档中说,控制器的框架应该设置为其父视图的框架。
[MyMPMoviePlayerController.view setFrame: parentView.bounds];
不太优雅的解决方案,但即使不是这样也可能有效:
监听 UIDeviceOrientationDidChangeNotification 并获取电影播放器的视图。在其上应用变换、边界和中心(或框架等),使其仍适合横向视图。基本上每次它试图旋转时都将其转换回来。 (这都是假设你真的不能用 shouldAutorotateToInterfaceOrientation 阻止它旋转:)。
这里唯一的问题是它可能会保持电影纵向但会扭曲视图,这不是预期的结果。
【讨论】:
感谢这是两个很好的攻击计划。我以前也走类似的路,而且很乱,但看起来这个问题没有干净的解决方案。 只是一个想法...如果您将 MPMoviePlayerController 存储在引用中的某个位置,您可以将它添加到任意数量的视图中。然后,您可以侦听 MPMoviePlayerWillEnterFullscreenNotification 并显示另一个视图/UIViewController(您禁用了旋转),其中添加了您的电影播放器(或者可能是 moviePlayer.view),并且不允许旋转。然后听取相反的通知并关闭您的演示文稿。 看起来有可能,但我能找到的最好方法是自己简单地获取设备旋转通知,然后应用旋转(并可能设置一个锚点以便它旋转关于中心...)必要时。显然,忽略那些你不想旋转到的。通过接收有关全屏的通知,您将被允许根据电影的状态单独定义此行为。 我真的很困惑。我想我会查看视图层次结构,我可以看到旋转的根远高于 MPMoviePlayerControllerView。它是 UINavigationTransitionView 的一个实例。层次结构如下所示: MPMovieView UINavigationTransitionView 我几乎尝试了所有方法,然后最终意识到我可以通过将控件样式设置为全屏并隐藏状态栏和导航栏而不实际设置全屏来获得完全相同的效果。这给了我完全相同的效果,但因为它实际上不是全屏,所以播放器遵循我指定的方向。【参考方案2】:是的,我看到你说使用 MPMoviePlayerViewController 不是一种选择:
仍然......为什么不尝试将您拥有的 ViewController 的 MPMoviePlayerViewController 包含在您的视图控制器中的 MPMoviePlayerController 和其他项目。关于这一点的好处是 MPMoviePlayerViewController 已经内置了 MPMoviePlayerController。您只需引用它而不是您自己的 viewController 中的 MPMoviePlayerController。具有您可以覆盖的 shouldAutorotateToInterfaceOrientation 并且应该为您做正确的事情。
【讨论】:
【参考方案3】:您可以准备两个视频。如果没有其他选择。
【讨论】:
这并不能回答我的问题。【参考方案4】:请访问此链接,该链接默认情况下仅以横向模式显示视频,它会这样做http://mobiledevelopertips.com/video/getting-mpmovieplayercontroller-to-cooperate-with-ios4-3-2-ipad-and-earlier-versions-of-iphone-sdk.html。我希望它能解决你的问题。
【讨论】:
此链接与我的问题无关,适用于 iOS3。 但是您不需要查看 SDK,只需检查您是否在 self.view 上插入了一个movieplyaer 视图,只需尝试 modalviewcontroller 就像在示例中一样,您可以完成您的工作。并感谢 -ve 我只是想帮助你的答案。 我对您的回答投了反对票,因为 1. 您没有回答问题,只是添加了一个链接。 2.链接与我的问题无关。以上是关于防止 MPMoviePlayerController 在全屏时旋转和缩放为纵向的主要内容,如果未能解决你的问题,请参考以下文章