La vue de MPMoviePlayerController ne reconnaît pas le toucher

C'est mon code:

_mediaPlayer = [[MPMoviePlayerController alloc] init]; _mediaPlayer.controlStyle = MPMovieControlStyleNone; _mediaPlayer.shouldAutoplay = NO; [_mediaPlayer.view setFrame: CGRectMake(5, 5, 600,400)]; [playerHolder addSubview: _mediaPlayer.view]; // [self prepareScreenContentToPlay]; // UITapGestureRecognizer *singleFingerTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleRollTap:)]; singleFingerTap.numberOfTapsRequired = 1; [_mediaPlayer.view addGestureRecognizer:singleFingerTap]; [singleFingerTap release]; 

Et la méthode d'action pour la reconnaissance de gestes:

 -(void)handleRollTap:(UITapGestureRecognizer*)sender{ NSLog(@"%@", @"touch"); } 

MPMoviePlayerController fonctionne correctement. En outre, je veux gérer tactile sur la vue MPMoviePlayerController, mais handleRollTap jamais appelé. Pourquoi la vue de MPMoviePlayerController ne fonctionne pas avec UITapGestureRecognizer?


D'ACCORD. Si singleFingerTap.numberOfTapsRequired = 2; alors tout fonctionne bien aussi. Mais rien pour un seul robinet ..


En fait, répondre à ceci est simple:

  • définissez-vous en tant que délégué UIGestureRecognizer
  • renvoie YES pour les methods de délégué:

par exemple

 UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture)]; tapGestureRecognizer.delegate = self; 

et ailleurs dans le code:

 #pragma mark - gesture delegate // this allows you to dispatch touches - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { return YES; } // this enables you to handle multiple recognizers on single view - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { return YES; } 

MPMoviePlayerController a une sous-vue qui occupe la totalité de ses limites, et cette sous-vue dispose de 3 identificateurs de mouvement (dans iOS 4.3).

 mp = [[MPMoviePlayerController alloc] initWithURL:movieURL]; mp.frame = aRectangle; for (UIGestureRecognizer *g in ((UIView *)[mp.view.subviews objectAtIndex:0]).gestureRecognizers) { NSLog(@"g %@", g); } 

va sortir:

 g <MPTapGestureRecognizer: 0x6224c30; baseClass = UIGestureRecognizer; state = Possible; cancelsTouchesInView = NO; view = <MPSwipableView 0x6416100>; target= <(action=_tapGestureRecognized:, target=<MPSwipableView 0x6416100>)>> g <UIPinchGestureRecognizer: 0x6224710; state = Possible; cancelsTouchesInView = NO; delaysTouchesEnded = NO; view = <MPSwipableView 0x6416100>; target= <(action=_pinchGestureRecognized:, target=<MPSwipableView 0x6416100>)>> g <MPActivityGestureRecognizer: 0x6224640; baseClass = UIGestureRecognizer; state = Possible; cancelsTouchesInView = NO; delaysTouchesEnded = NO; view = <MPSwipableView 0x6416100>; target= <(action=_activityGestureRecognized:, target=<MPSwipableView 0x6416100>)>> 

Il existe donc déjà un GestureRecognizer qui gère un seul tap, mais il ne s'agit pas d'un UITapGestureRecognizer, mais d'un MPTapGestureRecognizer (un outil de reconnaissance personnalisé pour le lecteur video).

Si vous créez une vue générique et que vous l'ajoutez à la hiérarchie de la vue du lecteur de film, vous pouvez y append des touches, mais cela bloque les touches du lecteur de film (une seule pression ne fera pas disparaître les controls).

par exemple

 UIView *aView = [[UIView alloc] initWithFrame:mp.view.bounds]; [aView addGestureRecognizer:tapGesture]; [mp.view addSubview:aView]; 

Cela aura votre robinet, mais vous cassez les controls. Il peut toujours y avoir un moyen de lui permettre d'interagir avec les autres gestes.

Juste pour partager mon approche différente pour append un UISwipeGestureRecognizer personnalisé à la vue du lecteur sans append une vue personnalisée:

 [[player.view.subviews objectAtIndex:0] addGestureRecognizer:swipeGesture]; 

Ceci est de replace la méthode conventionnelle d'appel

 [player.view addGestureRecognizer:swipeGesture]; 

car il ne fonctionne que sur iPad en mode non-plein écran et sur iPhone. Lorsque le lecteur passe en mode plein écran sur iPad, le geste ne fonctionne pas

Vous pouvez utiliser l'événement UIView UITouch pour cela. Prenez un UIView et mettez MPMoviePlayerController intérieur de celui-ci:

 theMovie = [MPMoviePlayerController new]; theMovie.view.frame = CGRectMake(0, 0, 1024, 768); [theMovie setContentURL:theURL]; [theMovie setScalingMode:MPMovieScalingModeAspectFit]; [theMovie setCurrentPlaybackTime:0.2]; [theMovie setFullscreen:YES animated:YES]; [self addSubview:theMovie.view]; [viewMovie addSubview:theMovie.view]; 

Utiliser les methods UIView touch delegate

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { NSLog(@"touchesBegan"); UITouch *touch = [touches anyObject]; startPosition = [touch locationInView:self]; [viewMovie touchesBegan:touches withEvent:event]; } - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { NSLog(@"touchesMoved"); UITouch *touch = [touches anyObject]; CGPoint endPosition = [touch locationInView:self]; if (startPosition.x < endPosition.x) { NSLog(@"Left to Right"); } else { NSLog(@"Right to Left"); } } - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { } - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { } 

startPosition est un CGPoint déclaré dans le file .h .

La cause première est la nouvelle reconnaissance de mouvement doit être ajouté sur MPVideoBackgroundView, qui est une sous-vue de la vue MPMoviePlayerController.

Avec la dernière variante du MPMoviePlayerController, la solution acceptée ne fonctionnait toujours pas pour moi.

J'ai aussi essayé de «pirater la stack UIView» et de superposer ma propre UIView avec des reconnaisseurs de gestes. Mais tout n'a pas fonctionné.

J'ai finalement implémenté cette solution: ' Overriding UIAplication ', ce qui semble être une façon exagérée de le faire, mais en tout cas cela fonctionne. Ajoutez simplement une sorte de drapeau ou déléguez-le lorsque vous détectez un événement tactile, et vous pouvez ensuite arrêter le film.

devdavid a la bonne idée, mais sa solution n'a pas fonctionné pour moi. Je suppose que dans les nouvelles versions du lecteur, il y a d'autres vues au-dessus de la vue du lecteur video.

Ce que j'ai fait à la place était d'append un UIView au-dessus de la vue de joueur de film. Cela empêchera tous les gestes de passer au joueur, mais c'était tout le point car je ne voulais pas de controls visibles.