MPMoviePlayerViewController启用横屏模式

3

我正在将一个MPMoviePlayerViewController添加到我的应用中,代码如下:

MPMoviePlayerViewController *vc = [[MPMoviePlayerViewController alloc] initWithContentURL:movieURL];;
[self presentMoviePlayerViewControllerAnimated:vc];

一切都在运作,但我无法启用横屏模式。我想让我的整个应用程序除了实际的MPMoviePlayerViewController之外都是竖屏。我在谷歌上搜索了一下,但所有的解决方案都需要将应用程序的其余部分也设置为横屏。我需要我的应用程序保持竖屏,除了在MPMoviePlayerViewController中。

提前感谢!

编辑:

使用@matt的答案,我将设备方向添加到了我的应用程序:

enter image description here

接下来,我进入了我的第一个视图控制器(不是MPMoviePlayerViewController),并添加了以下内容:

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

然而,该应用程序仍然允许主菜单进入横屏模式。

但是,如果第一个视图控制器位于导航控制器或选项卡栏控制器中,则您需要担心的不是第一个视图控制器,而是导航控制器或选项卡栏控制器。 - matt
5个回答

11

实际上,有一种方法可以只将电影播放器横屏,而不会影响其他屏幕的纵向视图。

#define degreesToRadian(x) (M_PI * (x) / 180.0)

MPMoviePlayerViewController *moviePlayerVC = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:@"http://someurl.com"]];

moviePlayerVC.view.transform = CGAffineTransformIdentity;
moviePlayerVC.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90));

[self presentViewController:moviePlayerVC animated:NO completion:NULL];

请确保您使用的是MPMoviePlayerViewController而不是MPMoviePlayerController,否则它将无法正常工作。


谢谢。我尝试了大约10种不同的解决方案,从子类化视图控制器到更改委托等等。这个方法非常有效。 - Andre
谢谢<Chandresh>...节省了我很多时间。 - Prajnaranjan Das
请确保您使用 MPMoviePlayerViewController 而非 MPMoviePlayerController - Fahim Parkar

2
问题在于MPMoviePlayerViewController不是你的类,所以你无法控制它对supportedInterfaceOrientations的响应,而如果这是你自己的视图控制器类,你将使用它来指定呈现视图的方向。因此,你必须把它变成你自己的视图控制器类。你需要创建自己的MPMoviePlayerViewController子类,以便可以重写supportedInterfaceOrientations并表达你想要的方向(即横向)。创建并呈现该子类的实例,而不是内置的超类。

这样做会保持我应用程序的其余部分为竖屏吗? - Abdullah Shafique
通过保持应用程序中其余部分为纵向(即,每个其他视图控制器也必须实现supportedInterfaceOrientations来表示它希望为纵向),您可以使应用程序的其余部分保持为纵向。 - matt

0

对于Xcode 6.4,Swift 1.2,稍微编辑了@Chandresh Panchasara的答案。

let movieC = MPMoviePlayerViewController()
        movieC.moviePlayer.contentURL = self.movieURL
        movieC.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext
        movieC.view.transform = CGAffineTransformIdentity;
        movieC.view.transform = CGAffineTransformMakeRotation(CGFloat((M_PI * (90.0) / 180.0)));
        self.view.window?.rootViewController?.addChildViewController(self)
        self.presentMoviePlayerViewControllerAnimated(movieC)

0

感谢您的回答,它对我很有帮助。

对于那些想要Swift 4的解决方案,这里是:

playerVC.view.transform = CGAffineTransform.identity
playerVC.view.transform = CGAffineTransform.init(rotationAngle: degreesToRadian(90.0))
present(strongPlayerVC, animated: true)

这里是函数degreesToRadian:

func degreesToRadian(_ degrees: CGFloat) -> CGFloat {
    return .pi * degrees / 180.0
}

谢谢,祝你好运!


-2
到目前为止,最好的方法是实现这个AppDelegate函数并检查rootViewController是否有一个类型为AVPlayerViewController的子项,然后返回[.portrait, .landscapeLeft, .landscapeRight],否则返回.portrait
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    if let _ = UIApplication.shared.keyWindow?.rootViewController?.childViewControllers.first as? AVPlayerViewController {
        return [.portrait, .landscapeLeft, .landscapeRight]
    }
    return .portrait
}

你应该检查 UIApplicationkeyWindow,因为苹果在另一个 UIWindow 中呈现了这个视图控制器,所以如果你尝试在 AppDelegate 中声明的窗口上进行检查,这将不起作用,所以要小心。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接