首页 文章

MPMoviePlayerViewController启用横向模式

提问于
浏览
3

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

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

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

提前致谢!

EDIT:

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

enter image description here

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

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

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

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,否则它将无法正常工作 .

  • 0

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

  • 2

    对于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)
    
  • -2

    谢谢你的答案,它帮助了我 .

    对于那些想要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
    }
    

    谢谢,祝你好运!

  • 0

    到目前为止,最好的方法是实现这个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
    }
    

    你应该查看 UIApplicationUIApplication 因为苹果在另一个 UIWindow 中提出了这个viewController所以如果你试图检查 AppDelegate 中声明的窗口,这将无法工作所以要小心 .

相关问题