13

ビュー コントローラーに MPMoviePlayerController を表示し、YouTube アプリのように、ユーザーがデフォルト コントロールで全画面表示に切り替えられるようにしたいと考えています。必要最小限の例で次のコードを使用しています。

- (void)viewDidLoad {
    [super viewDidLoad];
    self.player = [[MPMoviePlayerController alloc] init];
    self.player.contentURL = theURL;
    self.player.view.frame = self.viewForMovie.bounds;
    self.player.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    [self.viewForMovie addSubview:player.view];
    [self.player play];
}

これは、ユーザーがビデオを全画面表示にし、デバイスを回転させて画面をタップするまでうまく機能します。以下のスクリーンショットに示すように、ステータス バーが間違った位置に表示されます。

スクリーンショット

私は iPad 用のテンプレート Tab Bar Application を使用しています。上記のviewDidLoad、ビュー変数、およびムービープレーヤーを表示するためのUIViewをXIBに追加しただけです。

私は何を間違っていますか?

4

7 に答える 7

3

ええ、私もこの問題を経験しています。それは間違いなくMPMoviePlayerController自体のバグのようです。

私がアプリケーションで解決した回避策は、フルスクリーンモードを終了するときにステータスバーを自分で修正することです。

- (void)playerDidExitFullscreen:(NSNotification *)notification {
    MPMoviePlayerController *moviePlayer = (MPMoviePlayerController *) notification.object;

    if (moviePlayer == self.player) {
        UIApplication *app = [UIApplication sharedApplication];
        if (app.statusBarOrientation != self.interfaceOrientation) {
            [app setStatusBarOrientation:self.interfaceOrientation animated:NO];
        }
    }
}

これにより、フルスクリーンモードでの問題は修正されませんが、後で修正されます。

もちろん、関数を通知に追加する必要があることに注意してください。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playerDidExitFullscreen:) name:MPMoviePlayerDidExitFullscreenNotification object:nil];
于 2010-09-23T15:51:01.407 に答える
2

サポートされているすべての向きに対して、 shouldAutorotateToInterfaceOrientation:interfaceOrientation は YES を返しますか?

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    はいを返します。
}

あなたのコードをもっと提供すれば、それは役に立ちます。

于 2010-05-17T21:45:06.550 に答える
1

UIにインターフェースビルダーを使用していますか? その場合は、ビュー属性インスペクタでビューの向きを「横向き」に設定してください。

于 2010-05-20T14:45:06.997 に答える
1

同じ問題があり、それを整理するのに半日を費やしました。iPad を縦向きにすると、サンプル コード (またはネットで見つけたもの) を使用してビデオを開始するたびに、ビデオとコントロール バーが縦向きにフォーマットされ、画面全体に表示されます。

とにかく、以下は私にとってはうまくいきます。

  /* Call the code like below:
        int iLandscape;
        if( newOrientation==UIInterfaceOrientationLandscapeLeft || newOrientation==UIInterfaceOrientationLandscapeRight )
             iLandscape=1;

        [self PlayVideo:iLandscape fullscreen:1]
    */
        //////////////////////////////////////////////////////////////////////////
        - (void)PlayVideo:(int)iLandscape fullscreen:(int)iFullScreen 
        {
            NSString *url = [[NSBundle mainBundle] pathForResource:@"myvideofile" ofType:@"m4v"];

        if( iFullScreen==0 )
        {
            MPMoviePlayerController *player2 = 
                [[MPMoviePlayerController alloc] 
                    initWithContentURL:[NSURL fileURLWithPath:url]];

            [[NSNotificationCenter defaultCenter] 
                addObserver:self
                   selector:@selector(movieFinishedCallback:)
                       name:MPMoviePlayerPlaybackDidFinishNotification
                     object:player2];

            //---play partial screen---
            player2.view.frame = CGRectMake(0, 0, m_iScreenWidth, m_iScreenHeight);
            [self addSubview:player2.view];
            //---play movie---
            [player2 play];
        }   
        else
        {
            MPMoviePlayerViewController *playerViewController = [[MPMoviePlayerViewController alloc] 
                initWithContentURL:[NSURL fileURLWithPath:url]];

            [[NSNotificationCenter defaultCenter] 
                addObserver:self
                   selector:@selector(movieFinishedCallback:)
                       name:MPMoviePlayerPlaybackDidFinishNotification
                     object:[playerViewController moviePlayer]];

            if( iLandscape )
            {
                playerViewController.view.frame = CGRectMake(0, 0, m_iScreenWidth, m_iScreenHeight);
            }
            [self addSubview:playerViewController.view];
            //play movie
            MPMoviePlayerController *player = [playerViewController moviePlayer];
            player.scalingMode=MPMovieScalingModeAspectFit;
            [player play];
        }
    }


    //////////////////////////////////////////////////////////////////////////
    - (void) movieFinishedCallback:(NSNotification*) aNotification 
    {
        MPMoviePlayerController *player = [aNotification object];
        [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:player];    
        [player autorelease];    
        [player.view removeFromSuperview];
    }
于 2010-06-11T20:33:05.163 に答える
0

この問題は解決しましたか?

[[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationPortrait animated:NO];

このコードはあなたを助けるかもしれません。

于 2010-07-22T13:15:01.177 に答える
0

これを試して

 - (void)willEnterFullscreen:(NSNotification*)notification {
     NSLog(@"willEnterFullscreen");

    [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:NO];
  }

 - (void)enteredFullscreen:(NSNotification*)notification {
     NSLog(@"enteredFullscreen");
 }

- (void)willExitFullscreen:(NSNotification*)notification {
    NSLog(@"willExitFullscreen");

    [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO];


}

- (void)exitedFullscreen:(NSNotification*)notification {
    NSLog(@"exitedFullscreen");

    [[NSNotificationCenter defaultCenter] removeObserver:self];
}
于 2013-09-17T15:10:22.313 に答える
0

それを見つけた。

同じ問題がありました-これが私がしたことです。プロジェクトにコードを 1 つずつ追加して、その動作を正確に確認することをお勧めします。

まず - 私はポートレート モードです。

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO];

次に、ムービーをステータス バーに押し込みました。注 - これは、ビデオのアスペクト比が 4x3 であることを前提としています

theVideo = [[MPMoviePlayerController alloc] initWithContentURL: [NSURL fileURLWithPath : path]];
float aspectRatio = (3.0f/4.0f);
float theMovieHeight = [self view].bounds.size.width * aspectRatio;
[[theVideo view] setFrame:(CGRectMake(0, [self view].bounds.size.height - theMovieHeight, [self view].bounds.size.width, theMovieHeight ))]; 

次に、アプリケーションが起動する場所 (私のプロジェクトでは、didFinishLaunchingWithOptions関数内にあります) で - とにかく、window オブジェクトにアクセスする必要があります。

float aspectRatio = (3.0f/4.0f);
float theMovieHeight = self.window.bounds.size.width * aspectRatio;
float theSpaceAboveTheMovie = self.window.bounds.size.height - theMovieHeight;
float whereTheMovieShouldBeCentered = (self.window.bounds.size.height - theMovieHeight) / 2;

CGAffineTransform theTransform = CGAffineTransformMakeTranslation(0,0);

theTransform = CGAffineTransformScale(theTransform, 1.0f/aspectRatio, 1.0f/aspectRatio);
theTransform = CGAffineTransformTranslate(theTransform, -whereTheMovieShouldBeCentered, 0);
theTransform = CGAffineTransformRotate(theTransform, M_PI / 2);
theTransform = CGAffineTransformTranslate(theTransform, 0, -theSpaceAboveTheMovie);

[self.window setTransform:theTransform];

アフィン変換は逆の順序で行われることに注意してください。したがって、各変換が何を行っているかを確認したい場合 (そうすることをお勧めします)、最初の 3 つをコメントアウトします。

ページの中央にムービーとステータス バーが表示されます。

//  theTransform = CGAffineTransformScale(theTransform, 1.0f/aspectRatio, 1.0f/aspectRatio);
//  theTransform = CGAffineTransformTranslate(theTransform, -whereTheMovieShouldBeCentered, 0);
//  theTransform = CGAffineTransformRotate(theTransform, M_PI / 2);
    theTransform = CGAffineTransformTranslate(theTransform, 0, -theSpaceAboveTheMovie);

それから最初の2つ

ここでは、ムービーとステータス バーが回転し、中央に配置されていないことがわかります。

//  theTransform = CGAffineTransformScale(theTransform, 1.0f/aspectRatio, 1.0f/aspectRatio);
//  theTransform = CGAffineTransformTranslate(theTransform, -whereTheMovieShouldBeCentered, 0);
    theTransform = CGAffineTransformRotate(theTransform, M_PI / 2);
    theTransform = CGAffineTransformTranslate(theTransform, 0, -theSpaceAboveTheMovie);

ここで、回転して中央に配置されているはずです

//  theTransform = CGAffineTransformScale(theTransform, 1.0f/aspectRatio, 1.0f/aspectRatio);
    theTransform = CGAffineTransformTranslate(theTransform, -whereTheMovieShouldBeCentered, 0);
    theTransform = CGAffineTransformRotate(theTransform, M_PI / 2);
    theTransform = CGAffineTransformTranslate(theTransform, 0, -theSpaceAboveTheMovie);

そして、それらすべてで、回転してフルスクリーンになります

サンプル コードはこちらからダウンロードできます。

于 2011-01-02T22:55:37.687 に答える