【问题标题】:unable to catch swipe gesture on AVPlayerViewController using swift无法使用 swift 在 AVPlayerViewController 上捕捉滑动手势
【发布时间】:2019-05-15 09:27:09
【问题描述】:

我想检查滑动手势在 AVPlayer 视频上是否有效。 我尝试了一个小型示例应用程序来执行此操作,但它不起作用。不知道为什么代码不起作用。

点击按钮,代码如下:

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

谢谢

【问题讨论】:

  • 您已将滑动方向添加到向上并处理了左侧。不是问题吗?
  • @RMRAHUL - 任何方向都可以,至少应该可以。

标签: ios swift uigesturerecognizer avplayerviewcontroller


【解决方案1】:

首先你需要disableAVPlayerViewController的默认gestureRecognizers你可以使用

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

你可以像这样使用它:

playerViewController.disableGestureRecognition()

现在你需要替换

leftSwipe.direction = UISwipeGestureRecognizer.Direction.up

leftSwipe.direction = UISwipeGestureRecognizer.Direction.left

因为您正在检查left 方向。

而且由于您的 UIViewController 不再在窗口层次结构中,因此您无法使用 self.present 显示警报并解决您需要将 playerViewController 作为类中的全局变量的问题。

然后您可以显示如下警报:

playerViewController.present(alert, animated: true)

在您的 handleSwipes 方法中。

工作代码如下:

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

结果将是:

【讨论】:

【解决方案2】:

您是否在视图上启用了用户交互?

playerViewController.view.isUserInteractionEnabled = true

我不认识播放器,但你应该阅读文档,也许它已经捕捉到滑动手势并提供了一个 API 来使用它。

问候,

【讨论】:

    【解决方案3】:

    尝试将delegate 设置为UISwipeGestureRecognizer,即

    leftSwipe.delegate = self
    

    并使您的viewController 符合UIGestureRecognizerDelegate

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

    【讨论】:

      猜你喜欢
      • 2016-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多