MPMoviePlayerViewController不会自动旋转

时间:2012-05-21 18:00:50

标签: iphone objective-c ios

我有一些奇怪的行为,MPMoviePlayerViewController不是auto - 在orientation更改时会轮换。但是,我在一个新项目中重新创建了相同的视图层次结构,当MPMoviePlayerViewController播放器启动时,它会旋转到每个方向。我已经仔细研究了这个项目,寻找可能明确设定方向的任何东西,但没有任何东西。

我将在此列出所有相关信息以及迄今为止我尝试过的事情。

视图层次结构目前如下所示:

  • 导航控制器
  • “Root”视图控制器< - 导航控制器的'rootViewController'
  • “Feed”视图控制器< - 由Root VC推送到导航堆栈
  • “预览”视图控制器< - 作为Feed中的模态VC提供
  • MPMoviePlayerViewController子类< - 由Feed VC通过'presentMoviePlayerViewControllerAnimated'
  • 呈现

视图层次结构中的每个类都响应shouldAutorotateToInterfaceOrientation,仅对UIInterfaceOrientationPortrait使用YES。

我尝试过的事情:

  • 从“Root”VC手动发送shouldAutorotateToInterfaceOrientation堆栈到MPMoviePlayerViewController
  • 覆盖MPMoviePlayerViewController的{​​{1}}子类'实现,为所有方向的横向方向 YES返回YES。
  • 在项目的摘要选项卡中设置“支持的设备方向”。
  • 从其他VC中调用shouldAutorotateToInterfaceOrientation,例如Feed VC

如果电影播放器​​在具有相同视图层次结构的新项目中正确旋转,那么可能会遇到什么问题。关于方向可能会被卡住的任何想法?

12 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:3)

我发现MPMoviePlayerViewController个对象将遵循项目的Info.plist设置以获得支持的界面方向。在我的一个项目中,我只允许该文件中的横向视图,因此电影播放器​​不会旋转,即使它在YES中回答shouldAutorotateToInterfaceOrientation:到横向方向。

编辑:好的,抓住吸管:你是否在任何automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers子类中实现了UIViewController?如果是,并返回NO,则子类必须在方向更改时将适当的方法转发给任何子控制器。

否则有什么办法可以看到你的代码?

答案 2 :(得分:2)

我知道这可能是一个愚蠢的建议,但要确保调用shouldAutorotateToInterfaceOrientation子类中的MPMoviePlayerViewController方法。也许那里出了点问题...

另外,请确保您没有按照指定here将2个子视图添加到主UIWindow

  

问:为什么我的UIViewController不会随设备一起旋转?

     

[...]

     
      
  • 视图控制器的UIView属性嵌入在UIWindow中,但是   另外还有一个视图控制器。
  •   

我认为这也可能会给你一些问题。您可以在上面的链接中找到有关可能出现问题的更多信息。

答案 3 :(得分:1)

一些想法:

  • UINavigationController是否设为应用rootViewController的{​​{1}}属性?你没有提到这一点。您应该这样做,而不是将导航控制器的视图添加到窗口。
  • 如果您要一次构建整个层次结构,请尝试将其分解。您可以向每个阶段添加一个按钮,将下一个视图控制器添加到层次结构中。
  • 尝试从视图控制器层次结构构造中删除任何动画。同时做多个动画可能会有麻烦。例如,不允许使用UIWindow一个接一个地推送UINavigationController中的两个视图控制器。您可能有类似的问题。
  • 确保在主线程上构建整个视图控制器层次结构。
  • 确保没有其他视图控制器“负责”旋转(正如@MihaiFratu所写 - 这是旋转问题的常见原因,我不得不重复它:-))。

答案 4 :(得分:1)

<强>解决方案:

对于任何可能遇到这种情况的人来说,视频没有旋转的原因是我不小心添加了RootViewController,它有窗口的rootViewController,而不是UINavigationController。

self.window.rootViewController = navController; 

是正确的

self.window.rootViewController = rootViewController;

不是

谢谢你们的帮助和一路投入。

答案 5 :(得分:0)

你在使用故事板吗?比较破坏的项目和测试项目之间的UIViewControllers和UINavigationController的方向设置。属性检查器上的“方向”设置可能会将您锁定在一个方向。

你提到shouldAutorotateToInterfaceOrientation:和你的plist设置所以我不会进入那个......

答案 6 :(得分:0)

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

***您正在调用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目标设置并应用启用所有方向..

答案 7 :(得分: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”会检测到这一点并自动调整您的视图。

当电影结束时,我将“风景”设置为“否”,以便视图旋转回来。

答案 8 :(得分:0)

我遇到了类似的问题。

解决方案:

  1. 在支持的界面方向中启用所有方向(目标&gt;摘要)
  2. 现在你的应用程序将开始在所有方向旋转,如果你不想要这个,那么跳过步骤1,只在appDelegate中添加以下方法

    • (NSUInteger)应用程序:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { 返回UIInterfaceOrientationMaskAll; }
  3. 将aAutorotateToInterfaceOrientation移到任何地方

  4. 添加以下方法来查看控制器,以支持您的应用所需的方向

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

答案 9 :(得分:0)

本指南帮助我检查了一些我缺少的步骤,以便只允许以横向方式查看视频播放器,让应用程序的其余部分以纵向模式修复:

iOS6 and autorotation tip

答案 10 :(得分: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

答案 11 :(得分:0)

在AppDelegate.m中添加此方法

- (NSUInteger)应用程序:(UIApplication *)应用程序supportedInterfaceOrientationsForWindow:(UIWindow *)窗口 {

if(!ISIPAD)

  {

    if ([[self.window.rootViewController presentedViewController]   isKindOfClass:[MPMoviePlayerViewController class]] && ![[self.window.rootViewController presentedViewController] isBeingDismissed])

    {
        return UIInterfaceOrientationMaskAllButUpsideDown;
    }
    else
    {
        return UIInterfaceOrientationMaskPortrait;
    }
}
return UIInterfaceOrientationMaskAllButUpsideDown ;

}