Search code examples
iosswiftuiviewuitapgesturerecognizeravplayerlayer

Cannot touch the UIView containing AVPlayerLayer


I have added a layer AVPlayerLayer to the UIImageView and added the UITapGestureRecognizer to the UIImageView. And yes I have given the delegate and user interaction is also enabled for UIImageView. But the tap is not working.

Does anyone know about AVPlayerLayer in detail.

let imageViewTap = UITapGestureRecognizer(target: self, action: #selector(imageViewTapped))
imageViewTap.numberOfTapsRequired = 1
imageView.addGestureRecognizer(imageViewTap)

let item = AVPlayerItem(asset: videoAsset)
videoPlayer = AVPlayer(playerItem: item)
videoPlayerLayer = AVPlayerLayer(player: videoPlayer)
videoPlayerLayer.frame = imageView.bounds
videoPlayerLayer.backgroundColor = UIColor.black.cgColor
imageView.layer.insertSublayer(videoPlayerLayer, at: 0)

 @objc func imageViewTapped(){
        print("my code here")
}

Solution

  • Check were have you added the AVPlayerLayer. Add layer at index O instead of adding it to the top.

    Use insertSublayer(_:at:) instead of addSublayer(_:)

    class ViewController: UIViewController, UIGestureRecognizerDelegate {
        @IBOutlet weak var imageView: UIImageView!
    
        override func viewDidAppear(_ animated: Bool) {
            super.viewDidAppear(animated)
            self.imageView.isUserInteractionEnabled = true
            self.addPlayer()
        }
    
        func addPlayer() {
            if let url = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4") {
                let player = AVPlayer(url: url)
                let playerLayer = AVPlayerLayer(player: player)
                playerLayer.frame = self.imageView.bounds
                playerLayer.videoGravity = .resizeAspect
                self.imageView.layer.insertSublayer(playerLayer, at: 0)
                player.play()
            }
    
            let tapGesture = UITapGestureRecognizer(target: self, action: #selector(tapHandler(_:)))
            tapGesture.delegate = self
            self.imageView.addGestureRecognizer(tapGesture)
        }
    
        @objc func tapHandler(_ sender: UIGestureRecognizerDelegate) {
            print("view tapped")
        }
    }
    

    Now, whenever you tap on the view, tapHandler(_:) method will be called.

    Don't forget to enable userInteraction of imageView manually.

    self.imageView.isUserInteractionEnabled = true