【问题标题】:MPMoviePlayerViewController doesn't auto-rotateMPMoviePlayerViewController 不会自动旋转
【发布时间】: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 层次结构中走得更高。

标签: iphone objective-c ios


【解决方案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. 在支持的界面方向(目标>摘要)中启用所有方向
        2. 现在您的应用将开始在所有方向上旋转,如果您不希望这样做,请跳过第 1 步,仅在 appDelegate 中添加以下方法

          • (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{ 返回 UIInterfaceOrientationMaskAll; }
        3. 在各处移除 shouldAutorotateToInterfaceOrientation

        4. 将以下方法添加到视图控制器以支持您的应用所需的方向

          • (NSUInteger)支持的接口方向 { 返回 UIInterfaceOrientationMaskPortrait; }
        5. 您可以在 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 应用,带故事板。

              这里是解决方案:

              1. 应用程序应该启用所有可能需要的方向
              2. 每个只需要支持纵向模式的 UIViewController 都应该实现 next 方法,像这样

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

                -(BOOL)shouldAutorotate
                {
                  return YES;
                }
                
                -(NSUInteger)supportedInterfaceOrientations
                {
                  return UIInterfaceOrientationMaskAllButUpsideDown;
                }
                
              4. 使用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 ;
                

                }

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2011-01-25
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-03-19
                  • 2023-03-29
                  • 2019-10-24
                  • 2011-09-29
                  • 1970-01-01
                  相关资源
                  最近更新 更多