Question

J'ai une configuration MPMoviePlayer pour jouer un film d'introduction à ma demande. Cela fonctionne tout simplement génial, le seul problème est qu'il dure 14 secondes, et je veux donner à mes utilisateurs une chance de sauter l'intro en appuyant sur ne importe où sur le film.

Je l'ai caché les commandes de films, car ils ne sont pas nécessaires.

Code:

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

Merci!

Était-ce utile?

La solution

EDIT: Ma solution initiale ne fonctionnera pas, parce que le film est représenté dans une deuxième fenêtre, en couches sur le dessus 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 la vue sur l'iPhone). Cette solution, basée sur exemple de code MoviePlayer d'Apple , 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 l'utilisation 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 ne fonctionne que je vous recommande UIWindow et le sous-classement en vous assurant que votre délégué app instancie qu'au lieu d'une UIWindow normale. Vous pouvez intercepter des touches dans cette classe et envoyer une notification ou d'annuler le film directement (si vous avez enregistré un pointeur vers la MPMoviePlayer dans un Ivar sur votre sous-classe de la 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top