2010-07-22 8 views
3

Dans iOS4 pour iPhone 4/3GS, j'ai une tableview et l'une des cellules lit un fichier vidéo. Si le film se termine et que les contrôles ont disparu, la vue revient sous la barre d'état. Comme dans cette image ... que je suis trop nouveau pour poster. Voir ici ...Problème MPMoviePlayerViewController après la fin du film

http://www.dezignwright.com/ios4_movie.png

Si les contrôles sont quand le film se termine, alors il n'y a pas de problème. BONUS: Comment forcer le lecteur de film en mode paysage quand il commence à jouer. Je ne veux pas que ça joue en portrait.

Merci.

Répondre

0

Cela semble être un bug dans la version 4.0, il fonctionne correctement lors de la sortie en utilisant le bouton « Terminé ».

La solution de contournement que j'utilise est de stocker manuellement le cadre puis de le restaurer lors de la réception du MPMoviePlayerPlaybackDidFinishNotification.

Enfin pour l'obtenir en mode paysage, utilisez une sous-classe de MPMoviePlayerViewController où vous substituez shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation

à savoir quelque chose comme ceci:

@interface CustomMoviePlayerViewController : MPMoviePlayerViewController 
@end 
@implementation CustomMoviePlayerViewController 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
{ 
    return toInterfaceOrientation == UIInterfaceOrientationLandscapeRight || toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft; 
} 
@end 

Et dans votre contrôleur pour contourner le bug:

- (void)playbackEnded:(NSNotification *)notification 
{ 
    [[self view] setFrame:[self originalFrame]]; 
} 

- (void)playMovie:(NSString *)movieURLString 
{ 
    MPMoviePlayerViewController *controller = [[CustomMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:movieURLString]]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackEnded:) name:MPMoviePlayerPlaybackDidFinishNotification object:[controller moviePlayer]]; 
    [self presentMoviePlayerViewControllerAnimated:controller]; 
} 
+0

Merci !!! Je vais essayer. –

+0

Cela a-t-il fonctionné pour vous? – Nuoji

+0

Jetez un oeil à ma solution si vous avez encore un problème – Sid

0

J'ai travaillé autour du problème en déclarant explicitement que je ne pas utiliser la mise en page plein écran sur mon point de vue d'origine juste avant J'ai commencé le lecteur vidéo:

-(IBAction)playMovieButtonPressed:(id)sender { 
    MPMoviePlayerViewController* playerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:[self localMovieURL]]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
      selector:@selector(playbackDidFinish:) 
      name:MPMoviePlayerPlaybackDidFinishNotification 
       object:playerViewController.moviePlayer]; 

[self setWantsFullScreenLayout:NO]; 
// this ensures that the original frame is restored correctly 
// if the movie ends and the player is closed automatically 

[self presentMoviePlayerViewControllerAnimated:playerViewController]; 
    [playerViewController release]; 
    MPMoviePlayerController *player = [playerViewController moviePlayer]; 
    [player play]; 
}
+0

Ceci ne fonctionne pas dans une hiérarchie de vue complexe. Vérifiez cela - http://stackoverflow.com/questions/3310909/mpmovieplayerviewcontroller-issue-after-movie-finishes/5738038#5738038 – Sid

0

J'ai eu le même problème et je l'ai utilisé ce workaroud pour résoudre ce problème:

-(void)myMovieFinishedCallback:(NSNotification*)aNotification 
{ 
    if (self.interfaceOrientation == UIInterfaceOrientationPortrait || self.interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) { 
     CGRect frame = CGRectMake(0, 20, 768, 1004); 
     self.view.frame = frame; 
    }else { 
     CGRect frame = CGRectMake(0, 20, 1004, 768); 
     self.view.frame = frame; 
    } 
} 

Ajustez le Rect comme votre taille d'écran, mon code devrait fonctionner pour iPad.

1

@Nuoji est proche de la bonne réponse. Le cadre de la vue en question est animé par iOS lorsque MPMoviePlayerViewController est fermé. En raison d'un bogue dans iOS lorsque la lecture se termine automatiquement (à la fin du film), l'animation suppose que la vue en question occupe tout l'écran alors que ce n'est pas le cas.

Étape 1. Enregistrez le cadre de la vue de présentation contenant la vue qui lancera MPMoviePlayerViewController.

Étape 2. Fixez un écouteur pour l'playbackDidFinishNotification

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

Étape 3. Dans le gestionnaire de notification réinitialiser le cadre à l'original, mais après un certain délai pour permettre l'animation à la fin. Si le cadre est modifié pendant l'animation, il n'a aucun effet.

[self performSelector:@selector(resetFrame) 
      withObject:nil 
      afterDelay:kResetFrameDelay]; 

- (void)resetFrame { 
    self.view.frame = kApplicationFrame; 
} 
1

Cette question a été abordée et n'est plus une question aussi d'iOS 4.3.

Merci pour everyones saisie.

Questions connexes