MPMoviePlayerViewController |允许横向模式

时间:2013-06-24 13:37:39

标签: ios mpmovieplayercontroller landscape

我正在尝试在我的应用中流式传输视频。我发现的方法是:

NSURL *theMovieURL = [NSURL URLWithString:self.data.trailer];
        if (theMovieURL)
        {
            self.movieController = [[MPMoviePlayerViewController alloc] initWithContentURL:theMovieURL];
            [self presentMoviePlayerViewControllerAnimated:self.movieController];
            [self.movieController.moviePlayer play];
        }

我不确定它是否是最传统的,但它确实有效。

问题在于我无法弄清楚如何仅为视频提供横向模式。我应该使用shouldAutorotateshouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation之类的内容吗?

仅供参考,整个应用程序仅允许纵向模式。

感谢您的帮助。

4 个答案:

答案 0 :(得分:34)

从iOS 6开始,

shouldAutoRotate已被弃用,除非您打算使用< 6。

相反,您需要覆盖supportedInterfaceOrientationspreferredInterfaceOrientationForPresentation方法。

在这种情况下,如果您不想为媒体播放器创建子类,则可以覆盖app委托中的方法,如下所示:

- (NSUInteger) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    if ([[self.window.rootViewController presentedViewController] isKindOfClass:[MPMoviePlayerViewController class]])
    {
        return UIInterfaceOrientationMaskAllButUpsideDown;
    }
    else
    {
        return UIInterfaceOrientationMaskPortrait;
    }
}

答案 1 :(得分:17)

@peko说正确的方法。当用户退出全屏视频时,此方法再次使用MPMoviePlayerViewController类调用。你应该检查它是否被解雇,如果你不这样做,当用户退出视频时,主窗口将保持横向模式,你也忘记了MPInlineVideoFullscreenViewController课程。当你使用嵌入播放器(不是全屏)时,会使用该类名调用它。

我是这样做的。它对我有用。

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)windowx
{
    if ([[self.window.rootViewController presentedViewController] isKindOfClass:[MPMoviePlayerViewController class]] ||
    [[self.window.rootViewController presentedViewController] isKindOfClass:NSClassFromString(@"MPInlineVideoFullscreenViewController")])
    {
        if ([self.window.rootViewController presentedViewController].isBeingDismissed)
        {
            return UIInterfaceOrientationMaskPortrait;
        }
        else
        {
            return UIInterfaceOrientationMaskAllButUpsideDown;
        }
    }
    else
    {
        return UIInterfaceOrientationMaskPortrait;
    }
}

答案 2 :(得分:0)

电影播放器​​可能不是第一个呈现的视图控制器,所以你应该做这样的事情

- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
    UIViewController* playerController = self.window.rootViewController.presentedViewController;
    while (playerController && ![playerController isKindOfClass:[MPMoviePlayerViewController class]]) {
        playerController = playerController.presentedViewController;
    }
    if (playerController && !playerController.isBeingDismissed) {
        return UIInterfaceOrientationMaskAllButUpsideDown;
    } else {
        return UIInterfaceOrientationMaskPortrait;
    }
}

虽然{@ 1}}已被弃用,但您应该使用MPMoviePlayerViewController代替并在此循环中检查其类。

答案 3 :(得分:0)

到目前为止,最好的方法是实现此AppDelegate函数并检查rootViewController是否有AVPlayerViewControllerMPMoviePlayerViewController类型的子项,然后返回[.portrait, .landscapeLeft, .landscapeRight]和其他{ {1}}。

.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 } 的{​​{1}},因为Apple会在另一个keyWindow中显示此viewController,因此如果您尝试对UIApplication中声明的窗口进行检查1}}这不会起作用所以要小心。