objective-c - 如何使 MPMoviePlayerViewController 以横向模式启动但仍允许更改方向

标签 objective-c ios orientation mpmovieplayercontroller

这里有很多问题涉及将电影播放锁定为横向模式,或支持使用 MPMoviePlayerViewController 或 MPMoviePlayerController 横向播放电影。我已经拥有横向/纵向功能,而且我不想将播放锁定为任何一种模式。

我所拥有的是按照文档建议使用 MPMoviePlayerViewController 的代码,本质上:

    MPMoviePlayerViewController* movieViewController = 
        [[MPMoviePlayerViewController alloc] initWithContentURL:url];
    [parentViewController presentMoviePlayerViewControllerAnimated:movieViewController];

我的应用主要锁定为纵向模式,但此代码在其自己的 View 中以模态方式呈现电影 Controller ,并支持纵向和横向。所有这些都非常好。

不过这是我的问题。我将展示的 99% 的视频都是横向视频,上面的代码以纵向模式启动电影播放,因为用户(很可能)以纵向模式握住设备。

我想要的是原生 YouTube 应用程序的行为;当您呈现电影 Controller 时,它首先以横向模式呈现,这将提示用户更改其设备的方向。如果他们以后想将其旋转回纵向,则可以这样做。当电影完成(或关闭)时,电影 View Controller 将关闭,设备应处于纵向模式。

似乎无法正确隐藏状态栏(它与全屏控件相关联,无论启动电影之前'hideStatusBar'的状态如何),因此似乎也需要将状态栏放在正确的位置成为其中的一部分。

编辑以添加状态栏方向的调试说明: 如果我在启动电影之前调用 setStatusBarOrientation:UIInterfaceOrientationLandscapeRight,状态栏位于正确的位置,但系统不再以相同的方式调用 shouldAutorotateToInterfaceOrientation

如果我不调用 setStatusBarOrientation,在电影出现之前我会得到以下调用序列:

shouldAutorotateToInterfaceOrientation(Portrait)
shouldAutorotateToInterfaceOrientation(Portrait)
shouldAutorotateToInterfaceOrientation(Portrait)
shouldAutorotateToInterfaceOrientation(Right)
shouldAutorotateToInterfaceOrientation(Portrait)

我只对 Right 回答 YES,电影在 LandscapeRight 中启动,但状态栏在错误的位置。设备方向的后续更改会准确生成您期望的 shouldAutorotateToInterfaceOrientation 调用(例如,如果我旋转到纵向,它会询问我是否可以旋转到纵向)。

如果我调用 setStatusBarOrientation:UIInterfaceOrientationLandscapeRight,我会得到以下序列:

shouldAutorotateToInterfaceOrientation(Right)
shouldAutorotateToInterfaceOrientation(Right)

我对这两个问题的回答都是肯定的。状态栏位于正确的位置,但我不再收到询问纵向模式的 shouldAutorotateToInterfaceOrientation 电话。因此,如果我将设备向右旋转,然后回到纵向,然后再向右旋转,我会看到它调用 shouldAutorotateToInterfaceOrientation(Right) 两次。更奇怪的是,如果我将它一直旋转到左方向,我会得到 shouldAutorotateToInterfaceOrientation(Left) 从那时起一切正常。哪个最烦人。

我认为这一定是 iOS 端的一个错误,这就是为什么 YouTube 应用程序不使用动画 UI 旋转效果的原因。相反,它会隐藏全屏控件(包括状态栏),在后台不可见地旋转,然后重新显示控件。

最佳答案

我建议设置一个计时器;在 shouldAutorotateToInterfaceOrientation: 一开始只允许横向(这将强制旋转到横向),然后在(比如)5 秒后,允许所有方向。

首先,您需要继承 MPMoviePlayerViewController 或在其自己的 View 中创建一个 MPMoviePlayerController。额外的代码看起来像这样:

// On load, init or similar method
BOOL showLandscapeOnly = YES;
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@(allowAllOrientations) userInfo:nil repeats:NO];

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
  if (showLandscapeOnly == YES)
    return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft ||
            interfaceOrientation == UIInterfaceOrientationLandscapeRight);
  else
    return YES;
}

- (void)allowAllOrientations {
  showLandscapeOnly = NO;
}

我认为这将完全满足您的需求;在显示模态视频 Controller 时,它会将方向翻转为横向,因为这是唯一受支持的方向。但是,如果用户将其恢复为纵向,它就会正常响应。

您也可以尝试尝试其他时间间隔;也许2秒会更好?建议你看看测试用户主题做了什么。他们可能会很快地旋转设备。

希望对您有所帮助!

关于objective-c - 如何使 MPMoviePlayerViewController 以横向模式启动但仍允许更改方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6762407/

相关文章:

objective-c - 如何启用 IKImageBrowserView 的特定项目上的拖动?

ios - 为 Objective C TableView 添加加载功能

ios - Xamarin 表单选择器 - iOS 上的 "Done"文本

android - 在android中查找设备的相对方向

objective-c - 使用多层时无法释放未使用的 CALayer 内存

ios - 用于立即分配变量的 block 的运行时开销

ios - 新的iPhone UDID格式的图案

ios - iOS 中的字母间距

android - Android 中的动 Canvas 局方向更改

android - Android Twitter异步任务在横向崩溃