在swift中,如何在AVPlayerViewController中播放视频时检测触摸

时间:2016-10-05 23:06:19

标签: ios swift avplayer avplayerviewcontroller

我已经以编程方式将AVPlayerViewController添加到UIViewController。我可以在玩家完成游戏时收到通知(playerDidFinishPlaying)。我还想知道用户是否在播放视频时触摸了屏幕,但我没有找到任何相关的通知。

3 个答案:

答案 0 :(得分:6)

解决方案是创建一个{strong> Base 类AVPlayerViewController并覆盖touches​Began(_:​with:​)方法:

Swift 2:

自定义基类:

class CustomAVPlayerViewController: AVPlayerViewController {
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        print("touchesBegan")
    }
}

的ViewController:

let videoURL = NSURL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")
let player = AVPlayer(URL: videoURL!)
let playerViewController = CustomAVPlayerViewController()
playerViewController.player = player
self.presentViewController(playerViewController, animated: true) {
    playerViewController.player!.play()
}

斯威夫特3:

自定义基类:

class CustomAVPlayerViewController: AVPlayerViewController {
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        print("touchesBegan")
    }
}

查看控制器:

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

不要忘记import AVKitimport AVFoundation

每次点击playerViewController,都会打印“touchesBegan”。

答案 1 :(得分:0)

我有同样的问题。 contentOverlayView仅在tvos中可用,因此这不是一个选择。

我最终在添加了AVPlayer的UIImageView上添加了UIView。我将背景颜色设置为在UIView上清晰可见,因此它不可见,但可以接收手势。这为轻击手势识别器提供了目标。

答案 2 :(得分:0)

我解决相同的问题。子类化AVPlayerViewController将在iOS 11.4.1上运行,但不能在以上的iOS 12上运行。因此,解决方案是在playerviewcontroller contentoverlayview上添加子视图,然后在该子视图上添加用于检测触摸的任何手势或按钮。这是相同的代码段:

//添加此通知是为了连续播放视频,如果您只需要播放一次视频,则可以删除此通知。

private func playVideo() {

    guard let path = Bundle.main.path(forResource: "BG01", ofType:"mp4") else {
        debugPrint("video.m4v not found")
        return
    }
    self.player = AVPlayer(url: URL(fileURLWithPath: path))

    NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: self.player?.currentItem, queue: .main) { [weak self] _ in
        self?.player?.seek(to: kCMTimeZero)
        self?.player?.play()
    }

  let  playerController : AVPlayerViewController? = AVPlayerViewController()
    let btn : UIButton = UIButton()
    btn.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: self.view.frame.size.height)
    btn.addTarget(self, action: #selector(touchDetect), for: .touchUpInside)
    btn.backgroundColor  = UIColor.clear
    playerController?.contentOverlayView?.addSubview(btn)
   // playerController?.homeVCProtocolDelegate = self as HomeVCProtocol
    playerController?.player = player
    playerController?.showsPlaybackControls = false
    self.player?.play()
    present(playerController!, animated: false) {
    self.player?.play()
    }

}

@objc func touchDetect()
{
    // Here you will get the call
}