2010-07-14 16 views
1

J'utilise la première réponse de iOS 4 + MPMoviePlayerControllerMPMoviePlayerController ne fonctionne pas dans iOS4

pour essayer d'obtenir MPMoviePlayerController à jouer. Dans le simulateur (appareil iPhone avec iOS4), j'entends du son mais pas de vidéo. Sur l'appareil (iPhone 3GS et iOS4), je n'ai rien. Voici mon code:

MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:moviePath]]; 
    moviePlayer.movieControlMode = MPMovieControlModeDefault; 

    if ([moviePlayer respondsToSelector:@selector(view)]) { 
     moviePlayer.controlStyle = MPMovieControlStyleFullscreen; 
     [moviePlayer.view setFrame:self.view.bounds]; 
     [self.view addSubview:moviePlayer.view]; 
    } 

    [moviePlayer play]; 

Des idées de ce que je fais mal?

Répondre

9

Je viens de tester le code suivant sur iOS4 + iPhone 4 (et un 3GS) -il fonctionne très bien. À première vue, je pense le problème de votre code n'appelle pas setFullscreen:animated sur votre MPMoviePlayerController instance.

- (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]; 
    if ([self.movieController respondsToSelector:@selector(view)]) { 
     self.movieController.view.frame = self.view.frame; 
     [self.view addSubview:movieController.view]; 
     [self.movieController setFullscreen:YES animated:YES]; 
    } 
    [self.movieController play]; 
} 

// This method is set as the action for an on-screen button 
- (void)movieTime:(id)sender { 
    [self showMovie]; 
} 
+0

Ne fonctionne pas sur iOS4 avec iPhone 3GS. Dans le débogueur, il arrive à la ligne self.movieController.view.frame et saute les deux suivants. – 4thSpace

+0

Si je lis bien, vous dites que l'exécution arrive à la première ligne * à l'intérieur du bloc if mais ignore les deux suivantes? Cela semble très improbable. Permettez-moi de creuser une de nos unités de test 3GS ... –

+0

... oui, fonctionne ici avec un 3GS sous iOS4. Une chose qui peut faire la différence est le contexte - dans mon application, le code est appelé depuis un gestionnaire d'événements, pas dans 'viewDidLoad' –

-4

Pour MPMoviePlayerControllerview est une propriété, pas une méthode, vous ne pouvez pas utiliser respondsToSelector: dessus si elle ne dispose pas de méthodes de synthèse ou écrites pour elle (à savoir est déclarée @dynamic). Ce que je pense est vrai pour la plupart des propriétés readonly dans UIKit.

+4

Toute @property aura une méthode getter correspondante. – drawnonward

+0

Évidemment non, car 'respondsToSelector:' retournera toujours false avec les propriétés dynamiques. –