MPMoviePlayerViewController启用横向模式

时间:2014-02-14 00:00:35

标签: ios orientation mpmovieplayercontroller landscape

我正在向我的应用添加一个MPMoviePlayerViewController,如下所示:

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

一切正常,但我无法启用横向模式。我希望我的整个应用程序除了实际的MPMoviePlayerViewController是肖像。我在谷歌搜索,但所有的解决方案都要求在景观中使用其他应用程序。我需要我的应用程序保留在纵向除了在MPMoviePlayerViewController中。

提前致谢!

修改

使用@matt回答我将横向添加到我的设备方向:

enter image description here

接下来我去了我的第一视图控制器(不是MPMoviePlayerViewController)并添加了:

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

然而,该应用程序仍然让主菜单进入横向模式。

5 个答案:

答案 0 :(得分: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,否则它将无效。

答案 1 :(得分:2)

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

答案 2 :(得分: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)

答案 3 :(得分:0)

感谢您的回答对我有所帮助。

对于那些想要在Swift 4中使用它的人,解决方案:

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

这里是度数ToRadian:

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

谢谢,祝你好运!

答案 4 :(得分:-2)

到目前为止,最好的方法是实现此AppDelegate函数并检查rootViewController是否有AVPlayerViewController类型的子项,然后返回[.portrait, .landscapeLeft, .landscapeRight].portrait。< / p>

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    if let _ = UIApplication.shared.keyWindow?.rootViewController?.childViewControllers.first as? AVPlayerViewController {
        return [.portrait, .landscapeLeft, .landscapeRight]
    }
    return .portrait
}

您应该检查keyWindow的{​​{1}},因为Apple会在另一个UIApplication中显示此viewController,因此如果您尝试对UIWindow中声明的窗口进行检查1}}这不会起作用所以要小心。