簡體   English   中英

在swift中,如何在AVPlayerViewController中播放視頻時檢測觸摸

[英]In swift, how to detect touch while playing video in AVPlayerViewController

我已經以編程方式將一個AVPlayerViewController添加到UIViewController 我可以在玩家完成游戲時收到通知(playerDidFinishPlaying)。 我還想知道用戶是否在播放視頻時觸摸了屏幕,但我沒有找到任何相關的通知。

解決方案是創建一個AVPlayerViewControllerBase類並覆蓋觸摸Began(_:with AVPlayerViewController方法:

斯威夫特2:

自定義基類:

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

視圖控制器:

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”。

我有同樣的問題。 contentOverlayView僅在tvos中可用,因此不是一個選項。

我最后在UIImageView上添加了一個UIView,我添加了AVPlayer。 我將背景顏色設置為在UIView上清除,因此它不可見,但可以接收手勢。 這為輕擊手勢識別器提供了目標。

我解決了同樣的問題。 Subclassing 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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM