iOS 6方向在MoviePlayer上按下时自动旋转回肖像

时间:2013-01-17 22:21:11

标签: objective-c ios6 storyboard orientation

我正在使用MoviePlayer控制器在我的iOS应用中播放视频。我正在使用这样的定向通知

if(deviceOrientation ==UIDeviceOrientationLandscapeLeft)

{
     NSLog(@"Replay is in Landscape");

     self.fullScreenFlag = YES;

     [self.moviePlayer setFullscreen:YES animated:NO];

}

当用户将手机转为横向时,这使我的视频屏幕可以全屏播放。但是当我在moviePlayer控件上按下完成按钮时,我会进入下面的方法

- (void)movieWillExitFullscreen:(NSNotification*)notification
{

 UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;

if(deviceOrientation ==UIDeviceOrientationLandscapeLeft)  {
    NSLog(@"Pressed Done in Landscape");
    //Problem: Here I want to force my VideoViewController to rotate back to portrait  Mode
  }
}

一旦用户按下完成按钮或视频停止播放,我不知道怎么能让VC回到肖像画。我知道moviePlayerNotificationMethods但我应该在这些方法中调用什么方向不明确。

3 个答案:

答案 0 :(得分:2)

我通过为视频播放提供单独的视图控制器解决了这个问题。

所以,你会有两个视图控制器

  • SomeViewController
  • MoviePlayerViewController

在SomeViewController中,当你想播放电影时:

MoviePlayerViewController *vc = [[MoviePlayerViewController alloc] initWithNibName:@"MoviePlayerViewController" bundle:nil];
[vc setPathToMovie:path];
[self.navigationController pushViewController:vc animated:YES];
[vc release];

然后在你的MoviePlayerViewController

- (void) moviePlayBackDidFinish:(NSNotification*)notification
{
    [[self navigationController] popViewControllerAnimated:YES];    
}

然后您可以将SomeViewController锁定为肖像,如果用户在观看视频时处于风景中,则在弹回SomeViewController时它们将返回到肖像。

我从未找到使用deviceOrientation方法和模态MPMoviePlayerController的解决方案。虽然可能有一个!

答案 1 :(得分:0)

我在“moviePlayBackDidFinish”

中解决了这个问题
  UIViewController* forcePortrait = [[UIViewController alloc] init];
  [self presentViewController:forcePortrait animated:NO completion:^{
  [forcePortrait dismissViewControllerAnimated:NO completion:nil];
  }];

它不漂亮,但它的魅力就像一个魅力:-)

答案 2 :(得分:0)

根据您是在ViewController中使用MPMoviePlayerController还是作为单独的ViewController,答案如下: -

首先: - 这个link会解释如何将某些视图限制为纵向并允许其他人旋转?

在该链接中,您将在更改后的NavigationViewController中看到: -

-(BOOL)shouldAutorotate
{
    return [[self.viewControllers lastObject] shouldAutorotate];
}

-(NSUInteger)supportedInterfaceOrientations
{
    return [[self.viewControllers lastObject] supportedInterfaceOrientations];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
}

它的作用是,如果孩子想要自动旋转,它会让孩子做出自己的决定。

接下来,包含MoviePlayer的ViewController应该这样做: -

-(BOOL)shouldAutorotate
{
    return YES;
}

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

完成此操作后,它会为您的ViewController提供AutoRotation的强大功能。

现在这里是一个棘手的部分,请参阅我假设您可能已将ViewController限制为纵向,并且由于电影播放器​​允许您在旋转屏幕时全屏显示全屏,因此它将转为横向,现在如果你按下完成按钮它就不会变成肖像,而是会在横向自身中退出全屏。在这种情况下,你应该做的是: -

- (BOOL)shouldAutorotate
{

    UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];

    if (orientation == UIInterfaceOrientationLandscapeRight || orientation == UIInterfaceOrientationLandscapeLeft) {
            if ([[[self.navigationViewController.viewControllers] lastObject] class] == [MoviePlayerViewController class] ) {
                return YES;
            }
            return NO;
        }

        return NO;
}

所以,它的作用是,只有当方向是横向而不是纵向时,你才应该自动旋转。

到目前为止一切顺利,接下来是MoviePlayer,考虑到你已经播放了视频,你唯一感兴趣的是当我们点击" Done"按钮它应该自动旋转到肖像。

注册您的MoviePlayer通知

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerWillExitFullScreen:) name:MPMoviePlayerWillExitFullscreenNotification object:_moviePlayer];

然后在选择器中:

- (void) moviePlayerWillExitFullScreen:(NSNotification*)notification{

    NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationPortrait];
    [[UIDevice currentDevice] setValue:value forKey:@"orientation"];

    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerWillExitFullscreenNotification object:_moviePlayer];
}

多田!魔术完成了!尝试让我知道; - )