MPMoviePlayerViewController 不会自动旋转
Posted
技术标签:
【中文标题】MPMoviePlayerViewController 不会自动旋转【英文标题】:MPMoviePlayerViewController doesn't auto-rotate 【发布时间】:2012-05-21 18:00:49 【问题描述】:当orientation
更改时,我的MPMoviePlayerViewController
不是auto
-旋转时出现一些奇怪的行为。但是,我在一个新项目中重新创建了相同的视图层次结构,当MPMoviePlayerViewController
播放器启动时,它会旋转到每个方向。我已经搜索了该项目,寻找任何可能明确设置方向的东西,但什么都没有。
我将在这里列出所有相关信息以及我迄今为止尝试过的事情。
当前视图层次结构如下所示:
导航控制器 “根”视图控制器 “Feed”视图控制器 “预览”视图控制器 MPMoviePlayerViewController 子类视图层次结构中的每个类都以 YES 响应 shouldAutorotateToInterfaceOrientation,仅针对 UIInterfaceOrientationPortrait。
我尝试过的事情:
手动将shouldAutorotateToInterfaceOrientation
向上堆栈从“根”VC 发送到MPMoviePlayerViewController
覆盖shouldAutorotateToInterfaceOrientation
的MPMoviePlayerViewController
子类的实现,以对两个横向返回YES和对所有方向返回YES。
在项目的摘要选项卡中设置“支持的设备方向”。
从 Feed VC 等其他 VC 调用 presentMoviePlayerViewControllerAnimated
如果电影播放器在具有相同视图层次结构的新项目中正确旋转,那么这里可能会出现什么问题。关于方向可能会卡住的任何想法?
【问题讨论】:
使用 UINavigationController(或 UITabBarController)的应用程序仅在 所有 可显示(堆叠/选项卡式)视图控制器同意旋转时旋转。在您的情况下,请确保 MPMoviePlayerViewController 子类在shouldAutorotateToInterfaceOrientation
中被询问时在所有情况下实际上都返回YES
。
@Till 我当然明白这一点,但正如我所说:在具有相同视图层次结构的测试项目中,所有视图都同意一个旋转(纵向),电影播放器旋转到每个方向而不一个问题。编辑:您回复的后半部分在我的问题中的“我尝试过的事情”下得到了回答。谢谢!
对,请检查我编辑的评论,因为我最初并没有完全理解您的 UI 层次结构。
哦,你提到的 YES 仅适用于横向 - 并非适用于所有方向。
总的来说,这似乎是一个非常本地化的问题——尤其是因为你已经做了正确的事情;试图在一个最小的项目中重新创建问题。由于您未能在该最小项目场景中重新创建问题,因此您的问题显然存在于两个项目的差异中。如果我处于您的情况,我会非常仔细查看您的 MPMoviePlayerViewController
子类和呈现的 viewController(“预览”)。如果所有这些都失败了,请在 VC 层次结构中走得更高。
【参考方案1】:
我会建议你不要使用presentMoviePlayerViewControllerAnimated
,而不是添加为子视图。我认为它会很好地解决你的问题。
MPMoviePlayerViewController *mpviewController = [[MPMoviePlayerViewController alloc]
initWithContentURL:[NSURL fileURLWithPath:self.filePath]];
[self.view addSubview:mpviewController.view];
[self setWantsFullScreenLayout:YES];
并在检测到MPMoviePlayerPlaybackDidFinishNotification
时删除mpviewController.view
。让我看看你的成功...
【讨论】:
好主意,但这不起作用:-(。稍后我将重新尝试重新创建测试项目,不仅使用相同的视图层次结构,而且使用与生产中相同的类。将保持更新- - 谢谢!【参考方案2】:我发现MPMoviePlayerViewController
对象将遵循项目的 Info.plist 设置以支持界面方向。在我的一个项目中,我只允许该文件中的横向视图,因此电影播放器不会旋转,即使它在 shouldAutorotateToInterfaceOrientation:
中回答 YES
横向方向。
编辑:好的,抓住稻草:您是否在您的任何UIViewController
子类中实现automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers
?如果是这样,并且它返回 NO
,则您的子类必须在方向更改时将适当的方法转发给任何子控制器。
否则有什么方法可以查看您的代码?
【讨论】:
谢谢,但不幸的是,我也没有这样做。我尝试将 project-info.plist 文件设置为接受每个方向,以及仅接受横向,但无济于事。【参考方案3】:我知道这可能是一个愚蠢的建议,但请确保您的 MPMoviePlayerViewController
子类中的 shouldAutorotateToInterfaceOrientation
方法被调用。也许那里出了点问题……
同时确保您没有将 2 个子视图添加到主 UIWindow
指定的 here:
问:为什么我的 UIViewController 不随设备旋转?
[...]
视图控制器的 UIView 属性嵌入在 UIWindow 中,但是 旁边还有一个额外的视图控制器。
我认为这也可能会给您带来一些问题。您可以在上面的链接中找到有关可能出现问题的更多信息。
【讨论】:
【参考方案4】:一些想法:
UINavigationController
是否设置为您应用的UIWindow
的rootViewController
属性?你没有提到那个。您应该这样做,而不是将导航控制器的视图添加到窗口中。
如果您要一次构建整个层次结构,请尝试将其分解。您可以向每个阶段添加一个按钮,将下一个视图控制器添加到层次结构中。
尝试从视图控制器层次结构中删除任何动画。同时做多个动画可能会很麻烦。例如,不允许将UINavigationController
中的两个视图控制器一个接一个地推入animated:YES
。您可能有类似的问题。
确保在主线程上构建整个视图控制器层次结构。
确保没有其他视图控制器“负责”旋转(正如 @MihaiFratu 所写 - 这是旋转问题的常见原因,我不得不重复它 :-))。
【讨论】:
【参考方案5】:解决方案:
对于任何可能遇到这种情况的人,视频没有旋转的原因是我不小心添加了 RootViewController 具有窗口的 rootViewController,而不是 UINavigationController。
self.window.rootViewController = navController;
是正确的
self.window.rootViewController = rootViewController;
不是
感谢你们一路上的帮助和意见。
【讨论】:
【参考方案6】:你在使用故事板吗?在损坏的项目和测试项目之间比较 UIViewControllers 和 UINavigationController 的方向设置。属性检查器上的“方向”设置可能会将您锁定在一个方向。
您提到了shouldAutorotateToInterfaceOrientation:
和您的 plist 设置,所以我不会深入讨论...
【讨论】:
感谢您的回答,但此项目中没有情节提要。【参考方案7】:您的查询背后有一些原因..
***你正在调用 MPMoviePlayerViewController
.. 所以在 "Feed" View Controller
上应用 AutoOrientation 并尝试通过 PushViewController 调用..
***使用MPMoviePlayerController
而不是MPMoviePlayerViewController
并将子视图添加到FeedViewController
..
MPMoviePlayerController 的示例代码--
NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"filename" ofType:@"type"]];
videoPlayer = [[MPMoviePlayerController alloc] initWithContentURL:url];
videoPlayer.controlStyle = MPMovieControlStyleNone;
videoPlayer.view.frame = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.height, self.view.frame.size.width);
[videoPlayer prepareToPlay];
videoPlayer.view.center = self.view.center;
videoPlayer.fullscreen = YES;
[self.view addSubview:videoPlayer.view];
[videoPlayer play];
***检查您的 Xcode 目标设置并应用启用所有方向..
【讨论】:
如果您在 viewDidLoad 中使用 MPMoviePlayerController,请尝试在 viewWillAppear 中使用..【参考方案8】:我也遇到过类似的问题。
解决者:
-
在支持的界面方向(目标>摘要)中启用所有方向
现在您的应用将开始在所有方向上旋转,如果您不希望这样做,请跳过第 1 步,仅在 appDelegate 中添加以下方法
(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 返回 UIInterfaceOrientationMaskAll;在各处移除 shouldAutorotateToInterfaceOrientation
将以下方法添加到视图控制器以支持您的应用所需的方向
(NSUInteger)支持的接口方向 返回 UIInterfaceOrientationMaskPortrait;您可以在 MPMoviePlayerViewController 的子类中为视频播放器所需的任何方向添加与步骤 4 相同的方法
【讨论】:
【参考方案9】:你应该试试这个(为我工作):
在.h文件中声明:
BOOL landscape;
.m 文件:
-(IBAction)PlayMovie:(NSString *)movieName
landscape = YES;
NSBundle *bundle = [NSBundle mainBundle];
NSString *moviePath = [bundle pathForResource:movieName ofType:@"mp4"];
NSURL *movieURL = [NSURL fileURLWithPath:moviePath];
MPMoviePlayerController *theMovie = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];
theMovie.scalingMode = MPMovieScalingModeAspectFill;
[theMovie play];
MPMoviePlayerViewController *moviePlayer = [[MPMoviePlayerViewController alloc] initWithContentURL:movieURL];
[self presentMoviePlayerViewControllerAnimated:moviePlayer];
-(void)dismissMoviePlayerViewControllerAnimated
landscape = NO;
[self dismissModalViewControllerAnimated:YES];
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
// You can change the return for your needs.
if (landscape == YES)
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
else return NO;
我在这里所做的是创建我的电影视图并将“风景”BOOL 设置为 YES。
然后“shouldAutorotateToInterfaceOrientation”将检测到这一点并自动旋转您的视图。
当电影结束时,我将“风景”设置为 NO,以便视图旋转回来。
【讨论】:
【参考方案10】:本指南帮助我检查了我缺少的一些步骤,以便只允许以横向模式查看视频播放器,而将应用程序的其余部分固定为纵向模式:
ios6 and autorotation tip
【讨论】:
【参考方案11】:我对 MPMoviePlayerViewController 感到很痛苦,它应该是唯一能够从纵向旋转到横向的控制器,反之亦然。是 iOS7、iOS8 应用,带故事板。
这里是解决方案:
-
应用程序应该启用所有可能需要的方向
每个只需要支持纵向模式的 UIViewController 都应该实现 next 方法,像这样
-(BOOL)shouldAutorotate
return YES;
-(NSUInteger)supportedInterfaceOrientations
return UIInterfaceOrientationMaskPortrait;
应该扩展 MPMoviePlayerViewController 并且应该像这样覆盖下一个方法
-(BOOL)shouldAutorotate
return YES;
-(NSUInteger)supportedInterfaceOrientations
return UIInterfaceOrientationMaskAllButUpsideDown;
使用presentMoviePlayerViewControllerAnimated
显示MPMoviePlayerViewController
【讨论】:
【参考方案12】:在AppDelegate.m中添加这个方法
-(NSUInteger) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
if(!ISIPAD)
if ([[self.window.rootViewController presentedViewController] isKindOfClass:[MPMoviePlayerViewController class]] && ![[self.window.rootViewController presentedViewController] isBeingDismissed])
return UIInterfaceOrientationMaskAllButUpsideDown;
else
return UIInterfaceOrientationMaskPortrait;
return UIInterfaceOrientationMaskAllButUpsideDown ;
【讨论】:
以上是关于MPMoviePlayerViewController 不会自动旋转的主要内容,如果未能解决你的问题,请参考以下文章