2
votes

impossible de capturer le geste de balayage sur AVPlayerViewController à l'aide de swift

Je veux vérifier si le geste de balayage fonctionne ou non sur la vidéo AVPlayer. J'ai essayé un petit exemple d'application pour le faire, mais cela n'a pas fonctionné. Je ne sais pas pourquoi le code ne fonctionne pas.

En appuyant sur le bouton, voici le code:

var playerLayer: AVPlayerLayer?
var player: AVPlayer?

        let videoUrlString = "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"
        let videoURL = URL(string: videoUrlString)
        self.player = AVPlayer(url: videoURL!)
        let playerViewController = AVPlayerViewController()
        playerViewController.player = player
        present(playerViewController, animated: true, completion: {
            self.player?.play()
        })

        let leftSwipe = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipes(_:)))
        leftSwipe.direction = UISwipeGestureRecognizer.Direction.up

        playerViewController.view.addGestureRecognizer(leftSwipe)

@objc func handleSwipes(_ sender:UISwipeGestureRecognizer) {

        if (sender.direction == .left) {

            let alert = UIAlertController(title: "Swipe Action", message: "It is LEFT Swipe ", preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "OK", style: .cancel, handler: nil))
            self.present(alert, animated: true
        }
   }

Merci


2 commentaires

vous avez ajouté une direction de balayage vers le haut et une direction de gauche. n'est pas un problème?


@RMRAHUL - n'importe quelle direction est bonne, au moins cela devrait fonctionner.


3 Réponses :


0
votes

Avez-vous activé les interactions des utilisateurs sur votre vue?

playerViewController.view.isUserInteractionEnabled = true

Je ne connais pas le lecteur mais vous devriez lire le document, il détecte peut-être déjà les gestes de balayage et fournit une API pour utilisez-le.

Cordialement,


0 commentaires

0
votes

Essayez de définir le délégué pour UISwipeGestureRecognizer , c'est-à-dire

class ViewController: UIViewController, UIGestureRecognizerDelegate {
    //Rest of the code
}

Et conformez votre viewController à UIGestureRecognizerDelegate

leftSwipe.delegate = self


0 commentaires

1
votes

Tout d'abord, vous devez désactiver AVPlayerViewController ' gestureRecognizers par défaut pour cela, vous pouvez utiliser

import UIKit
import AVKit

class ViewController: UIViewController {

    var playerLayer: AVPlayerLayer?
    var player: AVPlayer?
    let playerViewController = AVPlayerViewController()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    @IBAction func tap(_ sender: Any) {

        let videoUrlString = "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"
        let videoURL = URL(string: videoUrlString)
        self.player = AVPlayer(url: videoURL!)

        playerViewController.player = player

        playerViewController.disableGestureRecognition()
        present(playerViewController, animated: true, completion: {
            self.player?.play()
        })

        let leftSwipe = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipes(_:)))
        leftSwipe.direction = UISwipeGestureRecognizer.Direction.left
        playerViewController.view.addGestureRecognizer(leftSwipe)
    }

    @objc func handleSwipes(_ sender:UISwipeGestureRecognizer) {

        if (sender.direction == .left) {

            let alert = UIAlertController(title: "Swipe Action", message: "It is LEFT Swipe ", preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "OK", style: .cancel, handler: nil))
            playerViewController.present(alert, animated: true)
        }
    }
}

extension AVPlayerViewController {
    func disableGestureRecognition() {
        let contentView = view.value(forKey: "contentView") as? UIView
        contentView?.gestureRecognizers = contentView?.gestureRecognizers?.filter { $0 is UITapGestureRecognizer }
    }
}

Et vous pouvez l'utiliser comme:

playerViewController.present(alert, animated: true)

besoin de remplacer

leftSwipe.direction = UISwipeGestureRecognizer.Direction.left

par

leftSwipe.direction = UISwipeGestureRecognizer.Direction.up

car vous vérifiez la direction gauche .

Et comme votre UIViewController n'est plus dans la hiérarchie des fenêtres, vous ne pouvez pas présenter d'alerte avec self.present et pour résoudre cela, vous devez faire playerViewController en tant que variable globale dans votre classe.

et vous pouvez ensuite présenter une alerte comme:

playerViewController.disableGestureRecognition()

dans votre handleSwipes .

Et le code de travail sera comme:

extension AVPlayerViewController {
    func disableGestureRecognition() {
        let contentView = view.value(forKey: "contentView") as? UIView
        contentView?.gestureRecognizers = contentView?.gestureRecognizers?.filter { $0 is UITapGestureRecognizer }
    }
}

Et le résultat sera:

entrez im description de l'âge ici


2 commentaires

pour moi ne fonctionne toujours pas, utilisé exactement le même code que ci-dessus.


Découvrez ce projet de démonstration github.com/KheniDharmesh/Guesture-With-AVPlayer