MPMoviePlayerController全屏旋转,而父视图控制器仅支持纵向方向

时间:2012-11-27 09:12:44

标签: iphone objective-c ios ios6 mpmovieplayercontroller

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

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

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

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

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

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

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

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

请帮忙......

8 个答案:

答案 0 :(得分:22)

您可以在AppDelegate中尝试以下功能:

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

}

你可以为这两种模式制定条件。

如果媒体播放器全屏显示,那么

return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;

否则return UIInterfaceOrientationMaskPortrait;

我没有尝试过,但我想,它应该适用于您的情况。

感谢

答案 1 :(得分:7)

为清楚起见,这里是完整的代码(它全部进入你的app委托):

- (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

答案 2 :(得分:1)

我建议改用MPMoviePlayerViewController。对其进行子类化并实现supportedInterfaceOrientations方法并返回UIInterfaceOrientationMaskLandscape

您可能还需要实施shouldAutorotateToInterfaceOrientation:方法。

参见课程参考: MPMoviePlayerViewController

修改:您还可以查看以下帖子:iphone - force MPMoviePlayerController to play video in landscape mode

答案 3 :(得分:1)

这耗费了我一段时间,我得到了许多不同的恐怖错误,但最终我没有通过 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;

        });
    }
}

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

答案 4 :(得分:0)

在项目中

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

  • 重建您的项目 - >确定

答案 5 :(得分:0)

对于iOS 6,您可以use this answer

但如果你支持< iOS 6需要不同的方法。

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

它看起来像是:m fileh file

在你的AppDelegate中必须调用init的方法:

在h文件中:

#import "IORNavigationController.h"

@property (nonatomic, retain) IORNavigationController*  navigationController;

在m档案中:

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

答案 6 :(得分:0)

使用此

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

适用于ios 7

答案 7 :(得分:0)

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

即可
-(NSUInteger)supportedInterfaceOrientations {

    return UIInterfaceOrientationMaskPortrait;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationPortrait;
}