在AVPlayer顶部绘制按钮

Pir*_*aba 8 avfoundation ios avplayer swift avplayerviewcontroller

我必须在视频顶部绘制标签或按钮relay next previous , leave comment.视频列表有它,一旦用户从表中选择一个项目,它需要播放,一旦播放器播放完成,那些按钮或标签应该出现在视频的顶部

这是我的代码:

    comPlayerControl = AVPlayerViewController()

            if let player = comPlayerControl {

                let videoURL: String = "http://cdnapi.kaltura.com/p/11/sp/11/playManifest/entryId/"+selectedSubmission.transcodeRefId+"/format/applehttp/protocol/http/a.m3u8"
                let playerItem = AVPlayerItem(URL: NSURL(string: videoURL)! )
                commmentPlayer = AVPlayer(playerItem: playerItem)
                player.player = commmentPlayer
                player.view.frame = videoCell.frame
                player.view.sizeToFit()

                player.showsPlaybackControls = true
                NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(CommentsTableViewController.playerDidFinishPlaying(_:)),
                    name: AVPlayerItemDidPlayToEndTimeNotification, object: playerItem)

                comPlayerControl.delegate = self
                videoCell.addSubview(player.view)
            }



     func playerDidFinishPlaying(note: NSNotification) {
    print("Video Finished")
    let DynamicView=UIView(frame: CGRectMake(100, 200, 100, 100))
    DynamicView.backgroundColor=UIColor.greenColor()
    DynamicView.layer.cornerRadius=25
    DynamicView.layer.borderWidth=2
    DynamicView.layer.zPosition = 1;
    comPlayerControl.view.addSubview(DynamicView)
}
Run Code Online (Sandbox Code Playgroud)

像这样的要求

要求图像

JAL*_*JAL 15

你正在使用AVPlayerViewController,所以没有理由像Alessandro Ornano的回答一样访问你的应用程序窗口.为什么重新发明轮子?每个AVPlayerViewController都有一个contentOverlayView属性,允许您在播放器和控件之间放置视图.

首先,创建一个新的AVPlayerItem并监听AVPlayerItemDidPlayToEndTimeNotification该项目的通知.将项目加载到播放器中并开始播放.

项目完成后,AVPlayerItemDidPlayToEndTimeNotification将调用您指定用于侦听通知的选择器.在该选择器中,contentOverlayView直接访问并添加按钮:

在某些视图控制器或其他对象中:

let playerVC = AVPlayerViewController()

// ...

func setupPlayer {

    let playerItem = AVPlayerItem(...)
    playerVC.player?.replaceCurrentItemWithPlayerItem(playerItem)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(VC.itemFinished), name: AVPlayerItemDidPlayToEndTimeNotification, object: playerItem)
    self.presentViewController(playerVC, animated: true) { 
        self.playerVC.player?.play()
    }
}

func itemFinished() {
    let btn = UIButton(type: .System)
    btn.addTarget(self, action: #selector(VC.buttonTapped), forControlEvents: .TouchUpInside)
    self.playerVC.contentOverlayView?.addSubview(btn)
}

func buttonTapped() {
    print("button was tapped")
    // replay/comment logic here
}
Run Code Online (Sandbox Code Playgroud)

正如评论中所述(以及被拒绝的编辑),按钮可能无效contentOverlayView.有关替代解决方案,请参阅Pyro的答案.

您也可以在子类AVPlayerViewController的实例中进行子类化并执行所有操作,但Apple 警告:

不要子类AVPlayerViewController.覆盖此类的方法不受支持,并导致未定义的行为.