2010-02-22 6 views
1

J'ai une configuration MPMoviePlayer pour lire un film d'introduction à mon application. Cela fonctionne très bien, le seul problème est qu'il dure 14 secondes, et je veux donner à mes utilisateurs une chance de sauter l'intro en appuyant n'importe où sur le film. J'ai caché les contrôles de film, car ils ne sont pas nécessaires.MPMoviePlayer est ignoré lorsque vous appuyez sur

code:

NSString *introPath = [[NSBundle mainBundle] pathForResource:@"intro" ofType:@"mov"]; 
intro = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:introPath]]; 
[intro setMovieControlMode:MPMovieControlModeHidden]; 
[intro play]; 

Merci!

Répondre

2

EDIT: Ma première solution ne fonctionnera pas, car le film est affiché dans une seconde fenêtre, superposée en haut de la fenêtre principale de l'application (il est très rare d'avoir plus d'une fenêtre dans la hiérarchie de vue sur l'iPhone) . Cette solution, basée sur Apple's MoviePlayer sample code, fonctionne:

. . . 
    // assuming you have prepared your movie player, as in the question 
    [self.intro play]; 

    NSArray* windows = [[UIApplication sharedApplication] windows]; 
    // There should be more than one window, because the movie plays in its own window 
    if ([windows count] > 1) 
    { 
     // The movie's window is the one that is active 
     UIWindow* moviePlayerWindow = [[UIApplication sharedApplication] keyWindow]; 
     // Now we create an invisible control with the same size as the window 
     UIControl* overlay = [[[UIControl alloc] initWithFrame:moviePlayerWindow.frame]autorelease]; 

     // We want to get notified whenever the overlay control is touched 
     [overlay addTarget:self action:@selector(movieWindowTouched:) forControlEvents:UIControlEventTouchDown]; 

     // Add the overlay to the window's subviews 
     [moviePlayerWindow addSubview:overlay]; 
    } 
. . . 

// This is the method we registered to be called when the movie window is touched 
-(void)movieWindowTouched:(UIControl*)sender 
{ 
    [self.intro stop]; 
} 

NB: Vous devez enregistrer la référence au lecteur de film dans une variable d'instance, et il est plus commode de déclarer une propriété que nous pouvons utiliser pour y accéder. C'est pourquoi utilisez self.intro au lieu de simplement intro dans l'exemple. Si vous ne savez pas comment déclarer une variable d'instance et une propriété, il y a beaucoup d'informations sur ce site et ailleurs.

**** RÉPONSE ORIGINAL CI-DESSOUS

(ne fonctionne pas dans ce cas, mais dans de nombreux scénarios similaires, donc je vais le laisser comme un avertissement et/ou par exemple inspirant.)

. . . Si rien d'autre ne fonctionne, je vous recommande de sous-classer UIWindow et de vous assurer que le délégué de votre application l'instancie au lieu d'une UIWindow normale. Vous pouvez intercepter les touches de cette classe et envoyer une notification ou annuler le film directement (si vous avez enregistré un pointeur sur MPMoviePlayer dans une sous-classe ivar de votre fenêtre).

@interface MyWindow : UIWindow { 
} 
@end 

@implementation MyWindow 
// All touch events get passed through this method 
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    // The screen has been touched, send a notification or stop the movie 
    return [super hitTest:point withEvent:event]; 
} 
@end 
+0

Euh, je n'ai pas compris que .. – Emil

+0

C'est bien. Et si vous souhaitez obtenir des éclaircissements supplémentaires, veuillez me faire savoir quelle partie vous n'avez pas comprise, ou quelle partie vous avez comprise ou à quel point vous êtes familier avec UIKit. – Felixyz

+0

Je suis relativement nouveau dans le développement d'un iPhone, donc je ne connais pas du tout UIKit. Mais il est tard dans la nuit ici où je vis, donc je vais en savoir plus demain, d'accord? – Emil

Questions connexes