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
3 Réponses :
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,
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
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:
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
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.