我有一个 TableViewController ,我在该表上播放视频,方法是点击单元格内的按钮以 AVPlayer 按代码播放
@IBAction func btnFullScreen(sender: AnyObject) {
let playController = AVPlayerViewController()
self.presentViewController(playController, animated: true, completion: nil)
playController.player?.play()
}
因此,它将全屏播放视频,并且左上角还有完成按钮。我想获得事件完成按钮,点击完成按钮后,它将获得玩家当前的时间来做更多其他事情。 但是如何让事件点击完成按钮?
答案 0 :(得分:1)
目前,您无法拦截AVPlayerController的“完成”按钮,使用雷达提交错误报告:27047358
您只能为AVPlayerItemDidPlayToEndTimeNotification
添加一个观察者,当您的项目完成播放时,该观察者将被触发。
另外根据文件:
不要继承AVPlayerViewController。覆盖这个类 方法不受支持,导致未定义的行为。
参考 - here
答案 1 :(得分:0)
我使用这个技巧,它适用于我的场景,但它可能会给你一个线索:
第一步:
在一个视图控制器上添加观察者,你想从那里播放视图控制器,以便在它的帧发生变化时得到通知:
self.playerViewController.addObserver(self, forKeyPath: #keyPath(MyViewController.view.frame), options: .new, context: nil)
NotificationCenter.default.addObserver(self, selector: #selector(self.playerDidFinishPlaying),
name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: self.playerViewController.player!.currentItem)
第二步:
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if (keyPath == #keyPath(MyViewController.view.frame)){
if playerViewController.player?.rate == 0{
doneClicked()
}
}
}
第三步:
func doneClicked(){
self.playerViewController.player!.pause()
self.playerViewController.player!.rate = 0.0
self.playerViewController.player = nil
self.playerViewController.removeObserver(self, forKeyPath: #keyPath(HomeTabViewController.view.frame))
NotificationCenter.default.removeObserver(self)
self.playerViewController.dismiss(animated: false, completion: nil)
}