Правильно отображаясь и распуская полноэкранный MPMoviePlayerController в (iPad) iOS 3.2

Я испытываю много затруднений, отображающих полноэкранный фильм в моем приложении для iPad и затем разрешающих пользователю отклонить его или с кнопкой Done или с "неполноэкранной" кнопкой на средствах управления плеера.

Первоначально я использовал MPMoviePlayerViewController для презентации фильма, но я не получал ввести/выйти полноэкранные уведомления от MPMoviePlayerController объект, таким образом, я переключился на выполнение его сам.

Я могу заставить фильм казаться полноэкранным (хотя переход является janky), но когда или "Сделанные" или "неполноэкранные" кнопки нажимаются, никакие меры не приняты плеером. Я отправил свой код ниже:

- (void)startPlayingMovieWithURLString:(NSString *)movieURLString {
    // I get all of these callbacks **EXCEPT** the "willExitFullScreen:" callback.
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willEnterFullScreen:) name:MPMoviePlayerWillEnterFullscreenNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willExitFullScreen:) name:MPMoviePlayerWillExitFullscreenNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didFinishPlayback:) name:MPMoviePlayerPlaybackDidFinishNotification object:nil];

    [self.moviePlayerController setContentURL:someExistingURL];

        // "self" is a UIViewController subclass, and is presented as a "fullscreen" modal view controller from its parent
        // I'm setting the movie player's view's frame to take up the full rectangle of my view controller, but really I want the movie to be completely removed when the user presses "done" (that is, removed from the view hierarchy). Not sure when/where to do this.
    self.moviePlayerController.view.frame = self.view.frame;
    [self.view addSubview:self.moviePlayerController.view];
    [self.moviePlayerController setFullscreen:YES animated:YES];

}

И вот код для моего didFinish обратного вызова

- (void)didFinishPlayback:(NSNotification *)notification {
        // This ends up recursively telling the player that playback ended, thus calling this method, thus…well you get the picture.
        // What I'm trying to do here is just make the player go away and show my old UI again.
    [self.moviePlayerController setFullscreen:NO animated:YES];
}

Так, очевидно, я делаю что-то не так, но я был вверх и вниз по документации, и я не могу выяснить, как сделать фильм просто уйти. Я полагал, что это будет более интуитивно, чем это. Что я делаю неправильно?

22
задан jbrennan 13 July 2010 в 17:51
поделиться

1 ответ

Вот как работают события -> уведомления:

  • Пользователь нажимает кнопку 'Done'

    • MPMoviePlayerWillExitFullscreenNotification
    • MPMoviePlayerDidExitFullscreenNotification
  • Пользователь нажимает кнопку 'Leave fullscreen' на транспорте

    • MPMoviePlayerWillExitFullscreenNotification
    • MPMoviePlayerDidExitFullscreenNotification
    • Заметьте что воспроизведение не останавливается
  • Фильм заканчивается

    • MPMoviePlayerPlaybackDidFinishNotification с MPMoviePlayerPlaybackDidFinishReasonUserInfoKey, установленным на MPMovieFinishReasonPlaybackEnded
    • Если вы вызываете setFullscreen: NO animated:YES на экземпляре MoviePlayerController из этого уведомления, вы получите уведомления WillExit и DidExit.
    • Обратите внимание, что вы не получите уведомление PlaybackDidFinish, когда пользователь нажимает кнопки Done или Leave Fullscreen.

Поэтому, как правило, если вы хотите избавиться от представления MoviePlayer, вам нужно поместить [self.moviePlayerController.view removeFromSuperview] в обработчик уведомления DidExitFullscreen. WillExitFullscreen слишком рано.

Вот мой код:

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

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

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

- (void)exitedFullscreen:(NSNotification*)notification {
    NSLog(@"exitedFullscreen");
    [self.movieController.view removeFromSuperview];
    self.movieController = nil;
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

- (void)playbackFinished:(NSNotification*)notification {
    NSNumber* reason = [[notification userInfo] objectForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey];
    switch ([reason intValue]) {
        case MPMovieFinishReasonPlaybackEnded:
            NSLog(@"playbackFinished. Reason: Playback Ended");         
                break;
        case MPMovieFinishReasonPlaybackError:
            NSLog(@"playbackFinished. Reason: Playback Error");
                break;
        case MPMovieFinishReasonUserExited:
            NSLog(@"playbackFinished. Reason: User Exited");
                break;
        default:
            break;
    }
    [self.movieController setFullscreen:NO animated:YES];
}

- (void)showMovie {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willEnterFullscreen:) name:MPMoviePlayerWillEnterFullscreenNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willExitFullscreen:) name:MPMoviePlayerWillExitFullscreenNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(enteredFullscreen:) name:MPMoviePlayerDidEnterFullscreenNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(exitedFullscreen:) name:MPMoviePlayerDidExitFullscreenNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackFinished:) name:MPMoviePlayerPlaybackDidFinishNotification object:nil];

    NSURL* movieURL =  [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"tron" ofType:@"mov"]];
    self.movieController = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];
    self.movieController.view.frame = self.view.frame;
    [self.view addSubview:movieController.view];
    [self.movieController setFullscreen:YES animated:YES];
    [self.movieController play];
}
66
ответ дан 29 November 2019 в 03:41
поделиться