5

Ho questo codice per il mio AVPlayerViewController.AVPlayer UITapGestureRecognizer non funziona

UITapGestureRecognizer *tap=[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAvPlayer)]; 
[self.avPlayerViewController.view addGestureRecognizer:tap]; 

ma questo non funziona ..: S, ho provato a installare

[self.avPlayerViewController.view setUserInteractionEnabled:YES]; 

ancora non va bene ..

L'unica soluzione di lavoro è quella di utilizzare e implementare UIGestureRecognizer è shouldReceiveTouch delegato e controlla se il lettore av viene toccato .. ma il problema è che non vogliamo catturare l'evento "tap release" .. perché se la vista av player viene semplicemente toccata, esegue immediatamente il codice e non è quello che volevamo. ..

Si prega di aiutarci con questo problema ..

Grazie!

risposta

0

Oppure si può sottoclasse l'AVPlayerViewController e utilizzare il metodo folowwing per

ottenere il controllo: -

1.touchBegan 2.touchEnd

Assicurarsi di aver impostato questo flag self.avPlayerContr.showsPlaybackControls = false

Spero che questo funzioni per te.

+0

Sì, questo funziona per me .. grazie! – GinealGames

+0

Apple consiglia di non sottoclasse 'AVPLayerViewController' ... – SpaceDog

+0

L'override dei metodi UIControl è un hack. L'approccio preferito è con contentOverlayView (vedi la mia risposta). – TyR

0

Per quanto riguarda la mia conoscenza è interessato ciò che si vuole veramente è

UILongPressGestureRecognizer 

Perché,

UITapGestureRecognizer 

Non ha alcun tipo di rilascio di evento, se u aggiungere il

UILongPressGestureRecognizer 

al

avPlayerViewController 

Poi nel

-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { 
    if ([gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]]) { 

    } 
    return YES; 
} 

quindi è possibile impostare la durata minima del gesto di avere una sensazione migliore,

[holdGesture setMinimumPressDuration:0.01] 

Quindi è possibile implementare il metodo,

- (void)holdAction:(UILongPressGestureRecognizer *)holdRecognizer 

Quindi controlla lo stato del riconoscitore ed esegui la funzionalità desiderata

0

È possibile aggiungere transparent visualizzazione su avplayerViewController e aggiungere tapgesturerecognizer su tale vista. Spero che questo vi aiuterà :)

2

Questo dovrebbe farlo.Aggiungere il sistema di riconoscimento alla visualizzazione secondaria del giocatore, invece:

[videoPlayerViewController.view.subviews[0] addGestureRecognizer:tap] 
+0

Questo ha funzionato come un fascino! Grazie! –

+0

Stavo cercando di farlo funzionare per una settimana e questo è bastato. Bellissimo. Grazie amico, mi hai davvero salvato. – user3286381

+3

Su iOS 11 questo causa l'arresto anomalo dell'app. –

0

La soluzione più semplice è aggiungere una vista gesto sulla stessa vista titolare film dopo l'aggiunta del giocatore di film. Non è necessario aggiungere il riconoscitore di gesti direttamente al riproduttore di filmati.

[self.movieHolderView addSubview:self.moviePlayer.view]; 


    [self.movieHolderView addSubview:self.gestureView]; 
    [self.movieHolderView bringSubviewToFront:self.gestureView]; 

Ora possiamo aggiungere il nostro riconoscitore Gesto sulla vista gesto come questo

self.fullScreenTapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapHandler:)]; 
self.fullScreenTapGesture.numberOfTapsRequired = 1; 
[self.gestureView addGestureRecognizer:self.fullScreenTapGesture]; 
3

la correttezza posto per la gestione su un AVPlayerViewController gesto si trova all'interno del controller contentOverlayView.

contentOverlayView è una proprietà di sola lettura di AVPlayerViewController. È una vista che appare sul video, ma sotto il controller. È il posto perfetto per la gestione del tocco. È possibile aggiungere sottoview o gestori di gesti ad esso al momento del caricamento.

Il codice seguente fornisce il supporto per il tocco del controller video in due modi, per dimostrare sia il riconoscimento del gesto che l'approccio di UIButton.

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"mySegue"]) 
    { 
     // Set things up when we're about to go the the video 
     AVPlayerViewController *avpvc = segue.destinationViewController; 
     AVPlayer *p = nil; 
     p = [AVPlayer playerWithURL:[NSURL URLWithString:@"https://my-video"]]; 
     avpvc.player = p; 

     // Method 1: Add a gesture recognizer to the view 
     UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myAction:)]; 
     avpvc.contentOverlayView.gestureRecognizers = @[tap]; 

     // Method 2: Add a button to the view 
     UIButton *cov = [UIButton buttonWithType:UIButtonTypeCustom]; 
     [cov addTarget:self action:@selector(myAction:) forControlEvents:UIControlEventTouchUpInside]; 
     cov.frame = self.view.bounds; 
    } 
} 

(non proprio per la scrittura di una versione Swift in questo momento, mi dispiace. :)

Problemi correlati