Swift,如何在播放AVPlayer上的视频时获取事件点击完成按钮?

时间:2016-11-22 09:14:39

标签: ios iphone swift avplayer avplayerviewcontroller

我有一个 TableViewController ,我在该表上播放视频,方法是点击单元格内的按钮以 AVPlayer 按代码播放

@IBAction func btnFullScreen(sender: AnyObject) {    
    let playController = AVPlayerViewController()
    self.presentViewController(playController, animated: true, completion: nil)
    playController.player?.play()
}

因此,它将全屏播放视频,并且左上角还有完成按钮。我想获得事件完成按钮,点击完成按钮后,它将获得玩家当前的时间来做更多其他事情。 但是如何让事件点击完成按钮?

2 个答案:

答案 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)
}