19

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

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

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

问题是我无法弄清楚如何允许横向模式,仅用于视频。shouldAutorotate我应该使用or之类的东西shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation,以及如何使用?

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

谢谢你的帮助。

4

4 回答 4

34

shouldAutoRotate自 iOS 6 起已弃用,除非您要使用 < 6 ,否则应避免使用。

相反,您想要覆盖supportedInterfaceOrientationsandpreferredInterfaceOrientationForPresentation方法。

在这种情况下,如果您不想子类化媒体播放器,您可以覆盖应用程序委托中的方法,如下所示:

- (NSUInteger) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    if ([[self.window.rootViewController presentedViewController] isKindOfClass:[MPMoviePlayerViewController class]])
    {
        return UIInterfaceOrientationMaskAllButUpsideDown;
    }
    else
    {
        return UIInterfaceOrientationMaskPortrait;
    }
}
于 2013-06-26T17:45:16.550 回答
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;
    }
}
于 2014-09-24T20:21:29.877 回答
0

到目前为止最好的方法是实现这个 AppDelegate 函数并检查是否rootViewController有一个子类型AVPlayerViewController或者MPMoviePlayerViewController然后你返回[.portrait, .landscapeLeft, .landscapeRight]and else .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
}

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

于 2016-11-14T16:08:40.280 回答
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;
    }
}

虽然MPMoviePlayerViewController已被弃用,但您应该AVPlayerViewController在此循环中使用并检查其类。

于 2016-05-11T08:41:12.667 回答