How do I intercept tapping of the done button in AVPlayerViewController?

前端 未结 10 721
渐次进展
渐次进展 2021-01-03 22:45

I created an AVPlayerViewController and an attached AVPlayer in the viewDidAppear method of a custom UIViewController. Ho

10条回答
  •  感情败类
    2021-01-03 23:30

    Since there don't seem to be any perfect answers here, a workaround you can use for some situations is to monitor whether the AVPlayer is still playing and set an observer in case it closes automatically after being played all the way through.

      var player:AVPlayer = AVPlayer()
      var videoPlayTimer:NSTimer = NSTimer()
    
      func playVideo(action: UIAlertAction)  -> Void {
    
        player = AVPlayer(URL: NSURL(fileURLWithPath: myFilePath))
        player.actionAtItemEnd = .None
    
        let playerController = AVPlayerViewController()
        playerController.player = player
        self.presentViewController(playerController, animated: true) {      
          self.player.play()
          self.monitorVideoPlayStatus()
          NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(MyViewController.onVideoEnd(_:)), name: AVPlayerItemDidPlayToEndTimeNotification, object: self.player.currentItem)
        }
      }
    
      //setting a timer to monitor video play status in case it is closed by user
      func monitorVideoPlayStatus(){
        if ((player.rate != 0) && (player.error == nil)) {
          NSLog("player is playing")
          videoPlayTimer = NSTimer.after(0.5, monitorVideoPlayStatus)
        } else {
          NSLog("player is NOT playing")
          onVideoEnd()
        }
      }
    
      //will be called when video plays all the way through
      func onVideoEnd(note: NSNotification){
        NSLog("onVideoEnd")
        onVideoEnd()
    
        //canceling video play monitor
        videoPlayTimer.invalidate()
      }
    
      func onVideoEnd(){
        NSLog("finished playing video")
        NSNotificationCenter.defaultCenter().removeObserver(self, name: AVPlayerItemDidPlayToEndTimeNotification, object: nil)
    
        //*******
        //DO WHATEVER YOU WANT AFTER VIDEO HAS ENDED RIGHT HERE
        //*******
      }
    

提交回复
热议问题