AVPlayerViewController定制

项目中要使用到系统的全屏播放,于是就用到了AVPlayerViewController。

在使用中遇到的几个问题,总结一下:

1. 没有全屏退出的接口

2. 不能获取到全屏退出前播放的状态(是否在播放)

3. 要求全屏时缓存进度与之前的AVPlayer同步,不在打开全屏时重新由AVPlayerViewController从头开始缓存,这样会有延迟。

3.全屏时强制横屏播放

由于定制的地方较多,所以直接继承AVPlayerViewController写了个子类:


import UIKit
import MediaPlayer
import AVKit

class CustomAVPlayerViewController: AVPlayerViewController {
    var viewWillDisappearCall: (() -> Void)?
    var viewDidDisappearCall: (() -> Void)?
    var exitFullScreen: (() -> Void)?
    var findButtonIndex = 0
    var isPlaying = false
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        if let willDismissCall = viewWillDisappearCall {
            willDismissCall()
        }
    }
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        if let dismissCall = viewDidDisappearCall {
            dismissCall()
        }
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    override var shouldAutorotate: Bool {
        return false
    }
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return UIInterfaceOrientationMask.landscapeRight
    }
    override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
        return UIInterfaceOrientation.landscapeRight
    }
    func sourceUrl(url: String) {
        player = AVPlayer(url: URL(string:url)!)
    }
    func setAVPlayer(avPlayer: AVPlayer) {
        //将AVPlayer的AVPlayerItem copy一份,就能获取到avPlayer的缓存
        player = AVPlayer(playerItem: avPlayer.currentItem?.copy() as! AVPlayerItem?)
    }
    func seekToTime(time : CMTime) {
        //修改播放进度
        player?.seek(to: time, toleranceBefore: kCMTimeZero, toleranceAfter: kCMTimeZero)
    }
    func play() {
        player?.play()
        isPlaying = true
    }
    func pause() {
        player?.pause()
        isPlaying = false
    }
    func clickDone() {
        //退出前的播放状态
        if player?.rate == 0{
            isPlaying = false
        }else {
            isPlaying = true
        }
        if let exit = exitFullScreen {
            exit()
        }
    }
    func findButtonOn(view: UIView, title: String) -> UIButton? {
        for subView in view.subviews {
            if subView.isKind(of: UIButton.self)  {
                let sub = subView as! UIButton
                let btTitle = sub.titleLabel?.text
                if btTitle == title {
                    return sub
                }
            }else if (subView.isKind(of: UIView.self)) {
                if let sub = findButtonOn(view: subView, title: title) {
                    return sub
                }
                
            }
        }
        return nil
    }
    func findImageButton(view: UIView, index: Int) -> UIButton? {
        for subView in view.subviews {
            if subView.isKind(of: UIButton.self)  {
                let sub = subView as! UIButton
                for imageView in sub.subviews {
                    if imageView.isKind(of: UIImageView.self) {
                        if findButtonIndex == index {
                            return sub
                        }
                        findButtonIndex += 1
                    }
                }
            }else if (subView.isKind(of: UIView.self)) {
                if let sub = findImageButton(view: subView, index: index) {
                    return sub
                }
            }
        }
        return nil
    }
    func show() {
        self.modalTransitionStyle = UIModalTransitionStyle.crossDissolve
        UIApplication.shared.keyWindow?.rootViewController?.present(self, animated: true, completion: {
            //截取完成按钮时间
            var doneButton = self.findButtonOn(view:self.view, title: "完成")
            if doneButton == nil {
                doneButton = self.findButtonOn(view:self.view, title: "Done")
            }
            doneButton?.addTarget(self, action: #selector(self.clickDone), for: UIControlEvents.touchUpInside)
            
        })
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值