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 覆盖shouldAutorotateToInterfaceOrientationMPMoviePlayerViewController 子类的实现,以对两个横向返回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 是否设置为您应用的UIWindowrootViewController 属性?你没有提到那个。您应该这样做,而不是将导航控制器的视图添加到窗口中。 如果您要一次构建整个层次结构,请尝试将其分解。您可以向每个阶段添加一个按钮,将下一个视图控制器添加到层次结构中。 尝试从视图控制器层次结构中删除任何动画。同时做多个动画可能会很麻烦。例如,不允许将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 不会自动旋转的主要内容,如果未能解决你的问题,请参考以下文章