5

Ich habe diesen Code für meine AVPlayerViewController.AVPlayer UITapGestureRecognizer funktioniert nicht

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

aber das funktioniert nicht ..: S, Ich habe versucht Einstellung

[self.avPlayerViewController.view setUserInteractionEnabled:YES]; 

noch nicht gut ..

Die einzige funktionierende Lösung ist UIGestureRecognizer zu verwenden und implementieren ist es shouldReceiveTouch Delegierten und Überprüfen Sie, ob der AV-Player berührt wird. Aber das Problem ist, dass wir das "Tap Release" -Ereignis nicht erfassen wollen. Denn wenn die av player-Ansicht nur berührt wird, führt sie sofort den Code aus und das ist nicht das, was wir wollten. ..

Bitte helfen Sie uns bei dieser Frage.

Vielen Dank!

Antwort

0

helfen Oder Sie können zu

erhalten die Kontrolle der AVPlayerViewController und verwenden folowwing Methode Unterklasse: -

1.touchBegan 2.touchEnd

Vergewissern Sie sich, dass Sie setzen Dieses Flag self.avPlayerContr.showsPlaybackControls = false

Ich hoffe, das funktioniert für Sie.

+0

Ja, das funktioniert mich .. Dank! – GinealGames

+0

Apple empfiehlt, AVLayerViewController's nicht abzuleiten ... – SpaceDog

+0

Das Überschreiben von UIControl-Methoden ist ein Hack. Bevorzugter Ansatz ist mit contentOverlayView (siehe meine Antwort). – TyR

0

Soweit mein Wissen betrifft, was Sie wirklich wollen, ist Hat

UILongPressGestureRecognizer 

Denn

UITapGestureRecognizer 

keine Freigabe Art der Veranstaltung haben, wenn u die

UILongPressGestureRecognizer 
hinzufügen

zu Ihrem

avPlayerViewController 

Dann in

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

    } 
    return YES; 
} 

Dann können Sie die Mindestdauer der Geste setzen ein besseres Gefühl zu haben,

[holdGesture setMinimumPressDuration:0.01] 

Dann Sie die Methode implementieren können,

- (void)holdAction:(UILongPressGestureRecognizer *)holdRecognizer 

Überprüfen Sie dann den Status des Erkenners und führen Sie die gewünschte Funktionalität aus

0

Sie können die Ansicht transparent auf avplayerViewController anzeigen und in dieser Ansicht tapgesturerecognizer hinzufügen. hoffen, dass diese :)

2

Dies sollte es tun.Fügen Sie den Erkenner zum subview des Spielers statt:

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

Das funktionierte wie ein Zauber! Vielen Dank! –

+0

Ich habe versucht, dies für eine Woche zu arbeiten und das war alles, was es brauchte. Schön. Danke Mann, du hast mich wirklich gerettet. – user3286381

+3

Auf iOS 11 macht dies die App zum Absturz. –

0

Die einfache Lösung ist nach dem Hinzufügen des Video-Player eine Geste Blick auf der gleichen Film Halter Ansicht hinzufügen. Sie müssen den Gestenerkenner nicht direkt zum Movie-Player hinzufügen.

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


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

Jetzt können wir unsere Gestenerkenner auf die Geste Ansicht wie diese

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

Die für Geste richtigen Stelle hinzufügen, auf einem AVPlayerViewController Handhabung ist im Inneren des des Controllers contentOverlayView.

contentOverlayView ist eine schreibgeschützte Eigenschaft von AVPlayerViewController. Es ist eine Ansicht, die über das Video, aber unter dem Controller angezeigt wird. Einfach der perfekte Ort für das Touch-Handling. Sie können Subviews oder Gesten-Handler zum Laden hinzufügen.

Der folgende Code gibt Ihrem Video Controller Touch-Unterstützung auf zwei Arten, um sowohl die Gestenerkennung als auch UIButton Ansätze zu demonstrieren.

- (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; 
    } 
} 

(nicht wirklich nach oben für eine Swift-Version zur Zeit zu schreiben, sorry. :)

Verwandte Themen