6

MPMoviePlayerController Playerは、完了ボタンを押した後、プレーヤーコントロールを永続的に非表示にします。

moviePlayer.controlStyle = MPMovieControlStyleEmbeddedの埋め込みプレーヤーがあり、ユーザーがmoviePlayerDidEnterFullscreen通知でフルスクリーンモードをタップすると、[moviePlayer setFullscreen:NO]を作成しています。プレーヤーのビデオをランドスケープモードに変換します

moviePlayer.view.transform = CGAffineTransformMakeRotation(degreesToRadians(-90));

と設定

moviePlayer.controlStyle =  MPMovieControlStyleFullscreen; 

次に、完了ボタンをタップして、moviePlayBackDidFinishで、ビューをポートレートモードに戻し、controlStyleをEmbeddedに設定します。これまでのところ、正常に動作しています。その後、ビデオは一時停止され、再生ボタンをタップすると、再生が開始され、プレーヤーはしばらく留まり、永久に非表示になります。ビデオを録画した後、プレーヤーは表示されなくなります。遅延後にプレーヤーコントロールを埋め込みに設定しようとしました。しかし、何も機能していません。この問題で助けてください。

この問題は、iOS6より前のバージョンでのみ発生します

コード

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(moviePlayBackDidFinish:)
                                             name:MPMoviePlayerPlaybackDidFinishNotification
                                           object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(moviePlayerDidEnterFullscreen:)
                                             name:MPMoviePlayerDidEnterFullscreenNotification
                                           object:nil];


if (mpVideoPlayerController)
{
    [mpVideoPlayerController.moviePlayer pause];
    [mpVideoPlayerController.moviePlayer stop];
}


mpVideoPlayerController = nil;
mpVideoPlayerController = [[VideoPlayerViewController alloc] initWithContentURL: theURL];


mpVideoPlayerController.moviePlayer.movieSourceType = liveStreaming ? MPMovieSourceTypeStreaming : MPMovieSourceTypeUnknown;

if ([mpVideoPlayerController.moviePlayer respondsToSelector:@selector(setAllowsAirPlay:)]) {
    mpVideoPlayerController.moviePlayer.allowsAirPlay = YES;
}

[[mpVideoPlayerController.moviePlayer view] setFrame:viewInsetRect];
mpVideoPlayerController.moviePlayer.controlStyle = MPMovieControlStyleEmbedded;
mpVideoPlayerController.moviePlayer.scalingMode = MPMovieScalingModeAspectFit;
[viewController.view addSubview: [mpVideoPlayerController.moviePlayer view]];
[mpVideoPlayerController.moviePlayer play];
}


-(void) moviePlayerDidEnterFullscreen :(NSNotification*)notification {
    [mpVideoPlayerController.moviePlayer setFullscreen:NO];
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
    [self performSelector:@selector(setControlStyleFullscreen) withObject:nil afterDelay:0.2];
    [UIView animateWithDuration:0.3
                     animations:^{
                         mpVideoPlayerController.moviePlayer.view.transform = CGAffineTransformIdentity;
                         mpVideoPlayerController.moviePlayer.view.transform = CGAffineTransformMakeRotation(degreesToRadians(-90));
                         CGRect frame=[[UIScreen mainScreen] applicationFrame];
                         frame.origin.y=-20;
                         mpVideoPlayerController.moviePlayer.view.frame = frame;//CGRectMake(0.0, 0.0, 480.0, 300.0);
                     } completion:^(BOOL finished) {

                     }];


}

- (void) setControlStyleFullscreen 
         mpVideoPlayerController.moviePlayer.controlStyle =  MPMovieControlStyleFullscreen;

- (void) setControlStyleEmbedded 

        mpVideoPlayerController.moviePlayer.controlStyle =  MPMovieControlStyleEmbedded;



- moviePlayBackDidFinish:

    NSLog(@"moviePlayBackDidFinish:");

    [self rotateToInterfaceOrientation:UIInterfaceOrientationPortrait frameForView:(viewController).videoContentView.frame];

    [[UIApplication sharedApplication] setStatusBarHidden:NO];

    [self performSelector:@selector(setControlStyleEmbedded) withObject:nil afterDelay:0.2];
4

1 に答える 1

1

あなたのコードは一種の欠陥があり、それらのMPMoviePlayerControllerバグを引き起こします。

  • すでにフルスクリーンになっているので、余分なsetFullscreen。
  • すでにフルスクリーンのコントロールスタイルになっているため、不要なsetControlStyle

一般的に言って、MPMoviePlayerControllerですでに行われていることを強制するべきではありません。

- (void)moviePlayerDidEnterFullscreen :(NSNotification*)notification 
{
    //
    //remove both lines from this notification handler
    //
    [mpVideoPlayerController.moviePlayer setFullscreen:NO];
    [self performSelector:@selector(setControlStyleFullscreen) withObject:nil afterDelay:0.2];
    [...]
} 

現在のモードを確認することで、setControlStyleFullscreen/Embeddedの実装を拡張することもできます。それは奇妙に思えるかもしれませんが、それは大いに役立ちます。

- (void)setControlStyleEmbedded
{
    if (mpVideoPlayerController.moviePlayer.controlStyle != MPMovieControlStyleEmbedded)
    {
        mpVideoPlayerController.moviePlayer.controlStyle = MPMovieControlStyleEmbedded;
    }
}

- (void)setControlStyleFullscreen
{
    if (mpVideoPlayerController.moviePlayer.controlStyle != MPMovieControlStyleFullscreen)
    {
        mpVideoPlayerController.moviePlayer.controlStyle = MPMovieControlStyleFullscreen;
    }
}
于 2012-12-21T10:02:07.900 に答える