iOS - 纵向锁定标签控制器应用程序将不允许美化电影播放器

时间:2012-07-07 03:03:21

标签: ios uitabbarcontroller mpmovieplayercontroller landscape-portrait

我的应用程序纯粹是一个带有5个标签(视图)的标签栏控制器。我希望这些观点只是肖像。但是,该应用程序允许播放视频剪辑并使用MPMoviePlayerViewController执行此操作。但是我不能让玩家旋转到风景!

我尝试了以下内容(以及其他许多内容): 对MPMoviePlayerViewController进行子类化并覆盖该类的shouldAutorotateToInterfaceOrientation方法。

允许应用程序具有横向方向,然后尝试将选项卡视图锁定为纵向(不锁定它们,允许它们转到我不想要的横向)。

我已经在StackOverflow和Google上搜索了好几天了! 任何熟悉这个问题的人以及如何让电影播放器​​旋转???

2 个答案:

答案 0 :(得分:0)

尝试实现UIViewController containment。将要显示影片的选项卡的viewController指定为父(或容器)viewController。

您需要覆盖子类中的shouldAutorotateToInterfaceOrientation以仅允许横向,这听起来就像您已经完成的那样。在父视图控制器和tabBarController中,您需要确保它们将autorotate方法转发到您的子类。您可以通过在您的shouldAutorotateToInterfaceOrientation的子类实现中放置NSLog来检查这一点。

然后,当您想要显示视频时,请向其添加MPMoviePlayerViewController的子类。

加载电影播放器​​的子类时,请尝试在父视图控制器中执行此操作:

[self addChildViewController:self.subclassedMoviePlayerViewController];
[self.view addSubview:self.currentViewController.view];
[self.subclassedMoviePlayerViewController didMoveToParentViewController:self];

或者如果您想要为更改设置动画,您可以执行以下操作:

CGRect viewFrame=self.subclassedMoviePlayerViewController.view.frame;
CGFloat viewHeight=inputViewFrame.size.height;

CGRect newFrame=CGRectMake(0, self.view.frame.size.height, viewFrame.size.width, viewFrame.size.height);

self.subclassedMoviePlayerViewController.view.frame=newFrame;
[self addChildViewController:self.subclassedMoviePlayerViewController];

CGRect offSetRect=CGRectOffset(newFrame, 0, -inputViewHeight);

[self.view addSubview:self.subclassedMoviePlayerViewController.view];
[UIView animateWithDuration:0.2
                 animations:^{
                      self.subclassedMoviePlayerViewController.view.frame=offSetRect;
                 }
                 completion:^(BOOL finished){
                     [self.subclassedMoviePlayerViewController didMoveToParentViewController:self];
                 }];

当然,在添加之前,您必须为电影播放器​​视图控制器的子类设置视图的帧。

然后当你想删除它时:

[self.subclassedMoviePlayerViewController willMoveToParentViewController:nil];
[self.subclassedMoviePlayerViewController.view removeFromSuperView];
[self.subclassedMoviePlayerViewController removeFromParentViewController];
祝你好运

答案 1 :(得分:0)

终于解决了这个问题!

好的,有一个重要的方法必须在父视图控制器中覆盖(在我的例子中,是标签视图的控制器):

-(BOOL)automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers {
    return NO;//This must be NO to allow any child views to use their own orientation
}

然后在我子类化的MPMoviePlayerViewController中,将其设置为方向:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return YES;//This allows all orientations, set it to whatever you want
}

然后我从选项卡视图控制器中显示这样的MPMoviePlayerViewController:

- (IBAction)buttonVideo:(id)sender {
    MovieViewController *vc = [[MovieViewController alloc] initWithContentURL:@"http://www.MY-VIDEO-URL.com"];
    [self presentMoviePlayerViewControllerAnimated:vc];  
}

和WA-LA!一个允许纵向锁定,标签栏应用中的所有方向的电影播放器​​!