这里有很多问题涉及将电影播放锁定到横向模式,或使用MPMoviePlayerViewController或MPMoviePlayerController支持电影的横向播放。我已经拥有横向/纵向功能,我不想将回放锁定到任何一种模式。
我所拥有的是使用MPMoviePlayerViewController作为文档建议的代码,基本上是:
MPMoviePlayerViewController* movieViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:url]; [parentViewController presentMoviePlayerViewControllerAnimated:movieViewController];
我的应用程序主要锁定为纵向模式,但此代码在其自己的视图中以模态方式呈现电影控制器,并支持纵向和横向方向。所有这些都非常好。
这是我的问题。我将呈现的视频中有99%是风景视频,上述代码以纵向模式启动电影播放,因为用户(可能)将设备保持在纵向模式。
我想要的是原生YouTube应用的行为;当您呈现电影控制器时,它首先以横向模式呈现,这将提示用户更改其设备的方向。如果他们以后想要将其旋转回肖像,则允许他们。电影完成(或解除)后,电影视图控制器将被解除,设备应处于纵向模式。
似乎不可能正确地隐藏状态栏(它与全屏控制相关联,无论启动电影之前'hideStatusBar'的状态如何),所以似乎让状态栏位于正确的位置也需要成为其中的一部分。
已修改为状态栏方向添加调试说明:
如果我在启动电影之前致电setStatusBarOrientation:UIInterfaceOrientationLandscapeRight
,则状态栏位于正确的位置,但系统不再以相同方式调用shouldAutorotateToInterfaceOrientation
。
如果我没有拨打setStatusBarOrientation
,则在电影出现之前,我会收到以下一系列电话:
shouldAutorotateToInterfaceOrientation(Portrait) shouldAutorotateToInterfaceOrientation(Portrait) shouldAutorotateToInterfaceOrientation(Portrait) shouldAutorotateToInterfaceOrientation(Right) shouldAutorotateToInterfaceOrientation(Portrait)
我只向右边回答YES,电影在LandscapeRight中启动,但状态栏位于错误的位置。设备方向的后续更改会产生您期望的shouldAutorotateToInterfaceOrientation
次呼叫(例如,如果我旋转到纵向,它会询问我是否可以旋转到纵向)。
如果我打电话给setStatusBarOrientation:UIInterfaceOrientationLandscapeRight
,我会得到以下顺序:
shouldAutorotateToInterfaceOrientation(Right) shouldAutorotateToInterfaceOrientation(Right)
我都回答“是”。状态栏位于正确的位置,但我不再接到shouldAutorotateToInterfaceOrientation
询问有关人像模式的电话。因此,如果我将设备旋转到右侧,然后再回到纵向,然后再回到右侧,我会看到它呼叫shouldAutorotateToInterfaceOrientation(Right)
两次。更奇怪的是,如果我将它一直旋转到左方向,我会得到shouldAutorotateToInterfaceOrientation(Left)
,从那时起一切正常。哪个最烦人。
我认为它一定是iOS方面的一个错误,这就是YouTube应用不使用动画UI旋转效果的原因。相反,它隐藏了全屏控制,包括状态栏,在后台无形旋转,然后重新显示控件。
答案 0 :(得分:4)
我建议启用一个计时器;首先只允许shouldAutorotateToInterfaceOrientation:
中的横向(这将强制轮转到横向),然后在(比方说)5秒后允许所有方向。
首先,您需要子类化MPMoviePlayerViewController或在其自己的视图中创建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;
}
我认为这会完全呈现你所追求的东西;在显示模态视频控制器时,它会将方向翻转为横向,因为这是唯一支持的方向。但如果用户将其恢复为肖像,那么它将会很好地响应。
您也可以尝试尝试其他时间间隔;也许2秒会更好?建议您查看测试用户主题的作用。他们可能很快就会旋转设备。
希望有所帮助!
答案 1 :(得分:0)
您将不得不旋转电影的帧,然后告诉应用委托代表在听到旋转消息时不会自动旋转。
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return NO;
}