не удается поймать жест смахивания на AVPlayerViewController с помощью swift - PullRequest
2 голосов
/ 15 мая 2019

Я хочу проверить, работает жест смахивания или нет на видео 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
        }
   }

Спасибо

Ответы [ 3 ]

0 голосов
/ 15 мая 2019

Попробуйте установить delegate для UISwipeGestureRecognizer, т.е.

leftSwipe.delegate = self

И соответствует viewController 1007 *

class ViewController: UIViewController, UIGestureRecognizerDelegate {
    //Rest of the code
}
0 голосов
/ 15 мая 2019

Прежде всего вам нужно отключить AVPlayerViewController по умолчанию 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 }
    }
}

И результат будет:

enter image description here

0 голосов
/ 15 мая 2019

Включили ли вы взаимодействие с пользователем в вашем представлении?

playerViewController.view.isUserInteractionEnabled = true

Я не знаю игрока, но вы должны прочитать документ, возможно, он уже ловит жесты смахивания и предоставляет API для его использования..

С уважением,

...