AVPlayer UITapGestureRecognizer not working

The correct place for gesture handling on an AVPlayerViewController is inside the controller's contentOverlayView .

contentOverlayView is a read-only property of AVPlayerViewController. It's a view that shows up over the video, but under the controller. Just the perfect place for touch handling. You can add subviews or gesture handlers to it at load time.

The following code gives your video controller touch support in two ways, to demonstrate both the gesture recognize and UIButton approaches.

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

(not really up for writing a Swift version at the moment, sorry. :)


This should do it. Add the recognizer to the subview of the player instead:

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

This was a quick fix for complex UI and gestures look into contentOverlayView see TyR answer