MPMoviePlayerViewController无法自动旋转

22
我遇到了一些奇怪的问题,我的MPMoviePlayerViewControllerorientation改变时没有进行auto旋转。但是,我在一个新项目中重建了同样的视图层次结构,并且当MPMoviePlayerViewController播放器出现时,它会旋转到每个方向。我已经搜寻了整个项目,找到了可能明确设置方向的任何东西,但是还是没有解决问题。
以下是所有相关信息和我迄今为止尝试过的事情。
视图层次结构如下:
  • 导航控制器
  • "Root"视图控制器<- 导航控制器的'rootViewController'
  • "Feed"视图控制器<- 由Root VC将其推入导航堆栈中
  • "Preview"视图控制器<- 作为模态VC从Feed中呈现
  • MPMoviePlayerViewController子类<- 由Feed VC通过'presentMoviePlayerViewControllerAnimated'呈现
视图层次结构中的每个类都仅对UIInterfaceOrientationPortrait响应shouldAutorotateToInterfaceOrientation并返回YES。
我尝试过的事情:
  • 手动将shouldAutorotateToInterfaceOrientation从“Root”VC发送到MPMoviePlayerViewController
  • 覆盖MPMoviePlayerViewController子类的shouldAutorotateToInterfaceOrientation实现,将横向方向的YES和所有方向的YES都返回
  • 在项目摘要选项卡中设置“支持的设备方向”。
  • 从其他VC(如Feed VC)调用presentMoviePlayerViewControllerAnimated
如果在具有相同视图层次结构的新项目中电影播放器正确旋转,那么可能会遇到什么问题。任何想法关于方向可能被困住在哪里?

5
如果使用UINavigationController(或UITabBarController)的应用程序仅在所有可显示的(堆叠/选项卡式)viewControllers同意旋转时才会旋转。在您的情况下,请确保MPMoviePlayerViewController子类在shouldAutorotateToInterfaceOrientation中被询问时,在所有情况下都返回YES。 - Till
@Till 我当然理解,但正如我所说:在一个测试项目中,具有相同视图层次结构的情况下,所有视图都同意一个旋转方向(纵向),电影播放器可以在任何方向上旋转而没有问题。编辑:你回答的后半部分已在我的问题中的“我尝试过的事情”下得到了回答。谢谢! - dzl
1
请检查我的编辑注释,因为我最开始没有完全理解你的UI层级。 - Till
哦,您提到了仅适用于横向的YES - 而不是所有方向的YES。 - Till
@Till 谢谢,我不小心在问题中漏掉了那部分,所以我进行了编辑。我确实尝试过横屏和所有方向。 - dzl
1
总的来说,这似乎是一个非常局部化的问题 - 特别是因为您已经做对了事情;尝试在最小项目中重新创建问题。由于您未能在该最小项目场景中重新创建该问题,因此您的问题显然存在于两个项目之间的差异中。 如果我处于您的情况下,我会非常仔细地查看您的 MPMoviePlayerViewController 子类和呈现视图控制器("Preview")。如果所有这些都失败了,请在 VC 层次结构中向更高处查看。 - Till
12个回答

7

我建议您不要使用presentMoviePlayerViewControllerAnimated,而是将其添加为子视图。我认为这将很好地解决您的问题。

MPMoviePlayerViewController *mpviewController = [[MPMoviePlayerViewController alloc]
                    initWithContentURL:[NSURL fileURLWithPath:self.filePath]];
[self.view addSubview:mpviewController.view];
[self setWantsFullScreenLayout:YES]; 

当检测到MPMoviePlayerPlaybackDidFinishNotification时,请移除mpviewController.view。让我看看你的成功...


好的思路,但是这次没有成功 :-(。稍后我将重试创建测试项目,不仅使用相同的视图层次结构,而且还要使用生产环境中相同的类。会随时更新 -- 谢谢! - dzl

3
我发现MPMoviePlayerViewController对象会遵守项目的Info.plist设置支持的界面方向。在我的一个项目中,我只允许文件中的横向视图,所以即使在shouldAutorotateToInterfaceOrientation:中返回横向方向为YES,电影播放器也不会旋转。

编辑:好吧,试图解决问题:你在任何UIViewController子类中实现了automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers吗?如果是这样,并且它返回NO,则您的子类必须在方向更改时将适当的方法转发给任何子控制器。

否则是否有任何方法可以查看您的代码?


谢谢,但不幸的是这对我也没有用。我尝试将project-info.plist文件设置为接受所有方向,以及仅横向,但都没有成功。 - dzl

2
我知道这可能是一个愚蠢的建议,但请确保你的MPMoviePlayerViewController子类中的shouldAutorotateToInterfaceOrientation方法被调用。也许出了点问题...
此外,请确保您没有向主UIWindow添加2个子视图,如此处所述: 问:为什么我的UIViewController没有随设备旋转? [...] - 视图控制器的UIView属性嵌入在UIWindow中,但与另一个视图控制器并排放置。
我认为这也可能会给您带来一些问题。您可以在上面的链接中找到更多关于可能出现的问题的信息。

1
解决方案:
对于遇到此问题的任何人,视频未旋转的原因是我无意中将RootViewController添加为窗口的rootViewController,而不是UINavigationController。
self.window.rootViewController = navController; 

是正确的

self.window.rootViewController = rootViewController;

不是

感谢大家一路以来的帮助和意见。


1
一些想法:
  • 你的应用程序的 UIWindowrootViewController 属性是否设置为 UINavigationController?你没有提到这一点。你应该这样做,而不是将导航控制器的视图添加到窗口中。
  • 如果您正在一次性构建整个层次结构,请尝试将其拆分。您可以在每个阶段添加一个按钮,该按钮将下一个视图控制器添加到层次结构中。
  • 尝试从视图控制器层次结构构建中删除任何动画。同时进行多个动画可能会有问题。例如,在 UINavigationController 中连续推送两个视图控制器时,使用 animated:YES 是不允许的。您可能会遇到类似的问题。
  • 确保您在主线程上构建整个视图控制器层次结构。
  • 确保没有其他视图控制器“接管”旋转(正如 @MihaiFratu 所写 - 这是旋转问题如此常见的原因,我不得不重复它 :-) )。

0

我在使用MPMoviePlayerViewController时遇到了很多问题,因为它应该是唯一能够从纵向旋转到横向并反之的控制器。这是一个带有故事板的iOS7、iOS8应用程序。

以下是解决方案:

  1. 应用程序应启用所有可能需要的方向As on the image
  2. 每个需要支持仅竖屏模式的UIViewController,都应该像这样实现下面的方法

    -(BOOL)shouldAutorotate
    {
        return YES;
    }
    
    -(NSUInteger)supportedInterfaceOrientations
    {
        return UIInterfaceOrientationMaskPortrait;
    }
    
  3. MPMoviePlayerViewController 应该被扩展,并且应该像这样覆盖下面的方法

    -(BOOL)shouldAutorotate
    {
      return YES;
    }
    
    -(NSUInteger)supportedInterfaceOrientations
    {
      return UIInterfaceOrientationMaskAllButUpsideDown;
    }
    
  4. 使用 presentMoviePlayerViewControllerAnimated 来显示 MPMoviePlayerViewController


0

你的查询背后有一些原因...

***你正在调用 MPMoviePlayerViewController.. 所以在 "Feed" 视图控制器 上应用 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中使用。 - Solid Soft

0
你应该尝试这个(对我有用):
在.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; }
}

我在这里所做的是创建我的电影视图并将“landscape” BOOL 设置为YES。
然后,“shouldAutorotateToInterfaceOrientation”将检测到此并自动旋转您的视图。
当电影播放完毕时,我将“landscape”设置为NO,以便视图恢复旋转。

0

这个指南帮助我检查了一些步骤,以便只允许视频播放器在横向模式下查看,而将应用程序的其余部分固定在纵向模式下:

iOS6和自动旋转提示


0

我曾经遇到过类似的问题。

解决方法如下:

  1. 在“支持的设备方向”(目标 > 概述)中启用所有方向
  2. 现在您的应用程序将开始在所有方向上旋转,如果您不想这样做,则跳过第1步,只需在appDelegate中添加以下方法即可

    • (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{ return UIInterfaceOrientationMaskAll; }
  3. 删除 shouldAutorotateToInterfaceOrientation 方法

  4. 为了支持您的应用程序所需的方向,在视图控制器中添加以下方法

    • (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; }
  5. 您可以在 MPMoviePlayerViewController 的子类中添加与步骤4相同的方法,以支持视频播放器所需的任何方向


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接