允许MPMoviePlayerViewController在横向播放,同时保留呈现视图控制器的方向

时间:2014-04-07 18:17:53

标签: ios iphone objective-c uiviewcontroller orientation

我有一个MPMoviePlayerViewController(一个子类,而不是XCDYouTubeVideoPlayerViewController),我正在使用以下代码

LPVideo *video = [_videos objectAtIndex: indexPath.row];
XCDYouTubeVideoPlayerViewController *videoPlayerViewController = [[XCDYouTubeVideoPlayerViewController alloc] initWithVideoIdentifier: video.code];
[self presentMoviePlayerViewControllerAnimated:videoPlayerViewController];

我的问题是,当整个应用程序被锁定在纵向模式时,我仍然希望用户在横向播放视频,所以我把它放在我的AppDelegate中

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

这样可以让用户以纵向观看视频;然而,如果视频播放器在纵向模式下被解除,那么呈现的视图控制器也会切换到肖像,这是我不希望发生的事情。

我尝试了各种各样的事情,比如在我的主UINavigationController中实现supportedInterfaceOrientationsshouldAutorotate,但它甚至不会阻止横向。

我知道这是可能的,因为我看过应用程序这样做,但我无法弄清楚如何。我已经看到了一些涉及倾听方向变化并将变换应用到播放器视图的解决方案,但它似乎不必要地复杂化。

我还试图通过viewWillAppear:animated返回“强制”轮换,但是在调用代码时它没有帮助。

我已经尝试了这两个

UIWindow *window = [[UIApplication sharedApplication] keyWindow];
UIView *view = [window.subviews objectAtIndex:0];
[view removeFromSuperview];
[window addSubview:view];

这个

[UIViewController attemptRotationToDeviceOrientation];

两者都没有实现。

2 个答案:

答案 0 :(得分:8)

我遇到了同样的问题,上述解决方案对我不起作用。我通过检查isBeingDismissed

来解决了这个问题
 - (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
    {
        if ([[window.rootViewController presentedViewController] isKindOfClass:[MPMoviePlayerViewController class]] && ![[self.window.rootViewController presentedViewController] isBeingDismissed]) {
            return UIInterfaceOrientationMaskAllButUpsideDown;
        } else {
            return UIInterfaceOrientationMaskPortrait;
        }
    }

但是,嘿,我正在使用Swift:

func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow) -> UIInterfaceOrientationMask {
    //If the video is being presented, let the user change orientation, otherwise don't.
    if let presentedViewController = window.rootViewController?.presentedViewController? {
        if (presentedViewController.isKindOfClass(MPMoviePlayerViewController) && !presentedViewController.isBeingDismissed()) {
            return .AllButUpsideDown
        }
    }
    return .Portrait
}

答案 1 :(得分:3)

问题不是很清楚,如果你想在所有方向上播放视频,那么使用" UIInterfaceOrientationMaskAll"而不是" UIInterfaceOrientationMaskAllButUpsideDown"。 如果它不起作用,请检查您使用的是否有任何库,从而改变方向。