22

我有一些奇怪的行为,当我发生变化时我MPMoviePlayerViewController没有auto旋转orientation。但是,我在一个新项目中重新创建了相同的视图层次结构,当MPMoviePlayerViewController播放器启动时,它会旋转到每个方向。我已经搜索了该项目,寻找任何可能明确设置方向的东西,但什么都没有。

我将在这里列出所有相关信息以及到目前为止我尝试过的事情。

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

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

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

我尝试过的事情:

  • 手动将shouldAutorotateToInterfaceOrientation向上堆栈从“根”VC 发送到MPMoviePlayerViewController
  • 覆盖MPMoviePlayerViewController子类的实现,shouldAutorotateToInterfaceOrientation为横向返回 YES,所有方向返回 YES。
  • 在项目的摘要选项卡中设置“支持的设备方向”。
  • presentMoviePlayerViewControllerAnimated从 Feed VC 等其他 VC调用

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

4

12 回答 12

7

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

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

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

于 2012-05-24T05:15:45.483 回答
3

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

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

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

于 2012-05-22T13:49:39.763 回答
2

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

还要确保您没有将 2 个子视图添加到此处UIWindow指定的主视图:

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

[...]

  • 视图控制器的 UIView 属性嵌入在 UIWindow 中,但与附加的视图控制器并列。

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

于 2012-05-24T07:35:41.300 回答
1

一些想法:

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

解决方案:

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

self.window.rootViewController = navController; 

是正确的

self.window.rootViewController = rootViewController;

不是

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

于 2012-06-18T15:49:10.690 回答
0

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

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

于 2012-05-23T21:54:52.810 回答
0

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

***您正在调用MPMoviePlayerViewController.. 所以应用 AutoOrientation"Feed" View Controller并尝试通过 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 目标设置并应用启用所有方向..

于 2012-05-28T06:13:15.850 回答
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; }
}

我在这里所做的是创建我的电影视图并将“风景”BOOL 设置为 YES。

然后“shouldAutorotateToInterfaceOrientation”将检测到这一点并自动旋转您的视图。

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

于 2012-05-29T22:09:53.743 回答
0

我有一个类似的问题。

解决者:

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

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

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

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

于 2012-09-27T16:59:01.680 回答
0

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

iOS6 和自转提示

于 2014-07-15T10:11:50.627 回答
0

我对 MPMoviePlayerViewController 感到很痛苦,它应该是唯一能够从纵向旋转到横向的控制器,反之亦然。它是带有故事板的 iOS7、iOS8 应用程序。

这是解决方案:

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

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

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

于 2015-06-12T14:01:52.460 回答
0

在 AppDelegate.m 中添加此方法

-(NSUInteger)应用程序:(UIApplication *)应用程序支持InterfaceOrientationsForWindow:(UIWindow *)window {

if(!ISIPAD)

  {

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

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

}

于 2015-07-22T13:52:54.150 回答