【问题标题】:MPMoviePlayerController rotating in full screen while the parent View Controller only supports portrait orientationMPMoviePlayerController 全屏旋转,而父 View Controller 仅支持纵向
【发布时间】:2012-11-27 09:12:43
【问题描述】:

这个问题只是我问题的一部分。我正在为我现有的应用程序实现 iOS6 旋转和方向支持。

所以我有一个 ViewController,它包含一个嵌入在 ViewController 视图中的 MPMoviePlayerController(我的应用程序需要它)。用户可以播放视频并在嵌入式视图中查看它,或者使用默认播放器控件单击全屏按钮,播放器进入全屏模式。

现在我使用 iOS6 提供的新旋转 API 将视图控制器限制为仅支持纵向。

// New Autorotation support.
- (BOOL)shouldAutorotate;
{
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

这很好用。 ViewController 仅支持纵向和用户在嵌入视图中播放电影。

现在问题来了,当用户进入全屏模式时。在全屏模式下,当我旋转模拟器/设备时,电影会继续旋转。当我在以shouldAutorotatesupportedInterfaceOrientations 中的断点以全屏模式播放电影时旋转设备时,它仍然出现在这两种方法中,分别返回NOUIInterfaceOrientationMaskPortrait,但电影仍在旋转.. .

为什么会这样? ....这是我问题的一部分...第二部分是我希望电影在用户进入全屏模式时以横向模式进入。我希望电影播放器​​锁定在横向模式,直到用户按下 DONE 按钮。

请帮忙....

【问题讨论】:

    标签: iphone objective-c ios ios6 mpmovieplayercontroller


    【解决方案1】:

    你可以试试AppDelegate下面的函数:

    -(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
    {
    
    }
    

    您可以在此处为两种模式设置条件。

    比如如果媒体播放器是全屏的,那么

    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;

    否则return UIInterfaceOrientationMaskPortrait;

    我没有尝试过,但我认为它应该适用于你的情况。

    谢谢

    【讨论】:

    • 对我来说很棒!这是我如何实现它的一个示例:github.com/OpenWatch/OpenWatch-iOS/blob/master/OpenWatch/… 基本上你只需要在MPMoviePlayerWillEnterFullscreenNotificationMPMoviePlayerWillExitFullscreenNotification 上的一些听众。
    • 太棒了,谢谢。有点烦人,您必须不断检查视频才能全屏显示,但是,嘿,这是我发现唯一可行的方法。再次感谢。
    • 感谢@ChrisBallinger,您的解决方案真的很有帮助!我唯一想问你的 - 当播放器以横向关闭时,如何强制包含 MPMoviePlayerController 的控制器以纵向重绘自身?
    【解决方案2】:

    为了清楚起见,这里是完整的代码(它都在你的应用委托中):

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(willExitFullscreen:)
                                                     name:MPMoviePlayerWillExitFullscreenNotification
                                                   object:nil];
    
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(willEnterFullscreen:)
                                                 name:MPMoviePlayerWillEnterFullscreenNotification
                                               object:nil];
    }
    
    - (void)willEnterFullscreen:(NSNotification*)notification
    {
        NSLog(@"willEnterFullscreen");
        isFullScreen = YES;
    }
    
    - (void)willExitFullscreen:(NSNotification*)notification
    {
        NSLog(@"willExitFullscreen");
        isFullScreen = NO;
    }
    
    -(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
    {
        if (isFullScreen)
            return UIInterfaceOrientationMaskLandscapeLeft;
        else
            return UIInterfaceOrientationMaskPortrait;
    }
    

    isFullScreen 是要在 AppDelegate.h 中声明的 BOOL

    【讨论】:

      【解决方案3】:

      我建议改用MPMoviePlayerViewController。继承它并实现supportedInterfaceOrientations 方法并返回UIInterfaceOrientationMaskLandscape

      您可能还必须实现shouldAutorotateToInterfaceOrientation: 方法。

      查看类参考: MPMoviePlayerViewController

      编辑:你也可以看看这个帖子:iphone - force MPMoviePlayerController to play video in landscape mode

      【讨论】:

      • 我已经为我的答案添加了一个链接,也许这会有所帮助
      • 你提到的这个解决方案已经实现了,它在iOS6中不起作用,这实际上是问题..在iOS6之前,这个解决方案工作正常。现在有了 iOS6,我必须实现支持 iOS6 方向的新功能。我在@Woodenlabs 回答的帮助下做到了。但问题是现在 iOS5 不工作了..
      【解决方案4】:

      这耗费了我一段时间,我遇到了许多不同的可怕错误,但最终我最终不是通过 MPMoviePlayerController 而是通过 MPMoviePlayerViewController 来实现的。在展示它之前,我只是旋转了 self.playerView 这是一个属性。我还添加了 NSNotification,它将在视频结束后返回主控件和主 ViewController。以下是我执行它的方法:

              [[NSNotificationCenter defaultCenter] removeObserver:self.playerView
                                                              name:MPMoviePlayerPlaybackDidFinishNotification
                                                            object:self.playerView.moviePlayer];
      
              [[NSNotificationCenter defaultCenter] addObserver:self
                                                       selector:@selector(movieFinishedCallback:)
                                                           name:MPMoviePlayerPlaybackDidFinishNotification
                                                         object:self.playerView.moviePlayer];
      
              self.playerView = [[MPMoviePlayerViewController alloc] initWithContentURL:docUrl];
              self.playerView.view.frame = CGRectMake(10, 10, self.frame.size.width-20, 180);
              [self.playerView.moviePlayer prepareToPlay];
      
              if(IS_IPHONE_6P)
              {
                  [self.playerView.view setBounds:CGRectMake(0, 0, 736, 414)];
                  [self.playerView.view setCenter:CGPointMake(212, 368)];
              }
              else if(IS_IPHONE_6)
              {
                  [self.playerView.view setBounds:CGRectMake(0, 0, 375, 667)];
                  [self.playerView.view setCenter:CGPointMake(187, 333)];
              }
              else if (IS_IPHONE_5)
              {
                  [self.playerView.view setBounds:CGRectMake(0, 0, 736, 414)];
                  [self.playerView.view setCenter:CGPointMake(160, 284)];
              }
              else
              {
                  [self.playerView.view setBounds:CGRectMake(0, 0, 480, 320)];
                  [self.playerView.view setCenter:CGPointMake(160, 240)];
              }
      
              [self.playerView.view setTransform:CGAffineTransformMakeRotation(M_PI / 2)];
              self.playerView.modalPresentationStyle = UIModalPresentationFormSheet;
              self.playerView.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
      
              [self presentViewController:self.playerView animated:YES completion:nil];
      

      而回调movieFinishedCallback:如下,

      - (void)movieFinishedCallback:(NSNotification*)aNotification
      {
          // Obtain the reason why the movie playback finished
          NSNumber *finishReason = [[aNotification userInfo] objectForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey];
      
          // Dismiss the view controller ONLY when the reason is not "playback ended"
          if ([finishReason intValue] != MPMovieFinishReasonPlaybackEnded)
          {
              MPMoviePlayerController *moviePlayer = [aNotification object];
              [[NSNotificationCenter defaultCenter] removeObserver:self
                                                              name:MPMoviePlayerPlaybackDidFinishNotification
                                                            object:moviePlayer];
      
              NSLog(@"Video Closed");
              dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^
              {
                  [self dismissViewControllerAnimated:NO completion:nil];
                  self.playerView = nil;
      
              });
          }
      }
      

      这对我有用。希望对您有所帮助。

      【讨论】:

        【解决方案5】:

        在您的项目中,选择名称项目并在右侧窗口选择信息选项卡。 在自定义 ios 目标属性中 添加键和选择键:“初始界面方向”设置值:Portrait(底部主页按钮)

        • 重建你的项目 -> 好的

        【讨论】:

          【解决方案6】:

          对于 iOS 6,您可以use this answer

          但是如果你支持

          您必须创建自定义导航控制器并向其添加使用根控制器创建的方法和旋转方法。

          它看起来像:m fileh file

          并且在您的 AppDelegate 中必须为 init 调用方法:

          在h文件中:

          #import "IORNavigationController.h"
          

          @property (nonatomic, retain) IORNavigationController*  navigationController;
          

          在m文件中:

          self.navigationController = [[[MyNavigationController alloc] initWithRootViewController:start] autorelease];
          

          【讨论】:

            【解决方案7】:

            使用这个

            moviePlayerController.view.transform = CGAffineTransformMakeRotation(M_PI/2);
            

            它适用于 ios 7

            【讨论】:

              【解决方案8】:

              只需将此代码添加到您的视图控制器中

              -(NSUInteger)supportedInterfaceOrientations {
              
                  return UIInterfaceOrientationMaskPortrait;
              }
              
              - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
              {
                  return UIInterfaceOrientationPortrait;
              }
              

              【讨论】:

                猜你喜欢
                • 2013-12-15
                • 2012-01-15
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-06-28
                • 2011-03-06
                • 1970-01-01
                相关资源
                最近更新 更多