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
Euh, je n'ai pas compris que .. – Emil
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
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