CNLiveShortVideoViewController.swift 10.8 KB
//
//  CNLiveVideoViewController.swift
//  metaCode
//
//  Created by open on 2024/1/5.
//

import Foundation
import ZFPlayer
import APButton
class CNLiveShortVideoViewController : CNLiveBaseViewController, UITableViewDelegate, UITableViewDataSource, CNLiveShortVideoListTableViewCellDelegate {
    
    var player: ZFPlayerController!
    let kVideoBodyListViewCellIdentifier = "kVideoBodyListViewCellIdentifier"
    lazy var tableView : UITableView = {
        let tableView = UITableView(frame: .zero, style: .plain)
        tableView.dataSource = self
        tableView.delegate = self
        tableView.isPagingEnabled = true
        tableView.estimatedRowHeight = 0
        tableView.estimatedSectionFooterHeight = 0
        tableView.estimatedSectionHeaderHeight = 0
        tableView.frame = view.bounds
        tableView.rowHeight = tableView.frame.size.height
        tableView.backgroundColor = .black
        tableView.tableFooterView = UIView.init()
        tableView.separatorStyle = .none
        tableView.scrollsToTop = false
        tableView.contentInsetAdjustmentBehavior = .never;
        tableView.register(CNLiveShortVideoListTableViewCell.self, forCellReuseIdentifier: kVideoBodyListViewCellIdentifier)
        return tableView
    }()
    
    lazy var backBtn: UIButton = {
        let button = UIButton(type: .custom)
        button.setImage(UIImage(named: "short_video_close"), for: .normal)
        button.addTarget(self, action: #selector(backClick(_:)), for: .touchUpInside)
        return button
    }()
    
    lazy var controlView: CNLiveShortVideoControlView = {
        let controlView = CNLiveShortVideoControlView.init(frame: CGRectZero)
        return controlView
    }()
    
    lazy var dataArray: NSMutableArray = {
        let dataArray = NSMutableArray.init()
        return dataArray
    }()
    lazy var dataURLArray: NSMutableArray = {
        let dataArray = NSMutableArray.init()
        return dataArray
    }()

    var playerManager = ZFIJKPlayerManager.init()
//    var playerManager = ZFAVPlayerManager.init()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .black
        view.addSubview(tableView)
        view.addSubview(backBtn)
        requestData()

        player = ZFPlayerController(scrollView: tableView, playerManager: playerManager, containerViewTag: 100)
        player.disableGestureTypes = [.pan, .pinch]
        player.controlView = controlView
        player.allowOrentitaionRotation = false
        player.isWWANAutoPlay = true
        player.playerDisapperaPercent = 1.0
        player.playerDidToEnd = { [weak self] asset in
            guard let self = self else { return }
            self.player.currentPlayerManager.replay()
        }
        player.playerPrepareToPlay = {[weak self] asset, assetURL in
            guard let self = self else { return }
            let index = self.dataURLArray.index(of: assetURL.absoluteString)
            let homeModel = self.dataArray[index] as! ShortVideoHomeTestModel
            if (homeModel.isMoney!) {
                let indexPath = IndexPath(row: index, section: 0)
                let cell: CNLiveShortVideoListTableViewCell = self.tableView.cellForRow(at: indexPath) as! CNLiveShortVideoListTableViewCell
                cell.hiddenView(isHidden: true)
                self.player.stopCurrentPlayingCell()
            } else {
                let indexPath = IndexPath(row: index, section: 0)
                let cell: CNLiveShortVideoListTableViewCell = self.tableView.cellForRow(at: indexPath) as! CNLiveShortVideoListTableViewCell
                cell.hiddenView(isHidden: false)
            }
        }
        // 更新另一个控制层的时间
        player.playerPlayTimeChanged = { [weak self] asset, currentTime, duration in
            guard let self = self else { return }
            self.controlView.videoPlayer((self.player)!, currentTime: currentTime, totalTime: duration)
        }
        // 更新另一个控制层的缓冲时间
        player.playerBufferTimeChanged = { [weak self] asset, bufferTime in
            guard let self = self else { return }
            self.controlView.videoPlayer((self.player)!, bufferTime: bufferTime)
        }
        // 停止的时候找出最合适的播放
        player.zf_scrollViewDidEndScrollingCallback = { [weak self] indexPath in
            guard let self = self else { return }
            if self.player.playingIndexPath != nil {
                return
            }
            if indexPath.row == (self.dataArray.count) - 1 {
                // 加载下一页数据
                self.requestData()
                self.tableView.reloadData()
            }
            self.playVideo(at: indexPath)
        }
    }
    
    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        self.backBtn.frame = CGRectMake(15, CGRectGetMaxY(UIApplication.shared.statusBarFrame), 45, 45)
    }
    
    func loadRequest() {
        dataArray.removeAllObjects()
        DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { [weak self] in
            guard let strongSelf = self else { return }
            // 下拉时一定要停止当前播放,以防有新数据,播放位置会错位
            strongSelf.player.stopCurrentPlayingCell()
            strongSelf.requestData()
            strongSelf.tableView.reloadData()
            strongSelf.player.zf_filterShouldPlayCellWhileScrolled { [weak self] indexPath in
                guard let strongSelf = self else { return }
                strongSelf.playVideo(at: indexPath)
            }
        }
    }
    
    func requestData() {
        CNLiveShortVideoViewModel.requstWithShortVideo { [weak self] result, respStatue in
            guard let self = self else { return }
            self.dataArray.addObjects(from: (result as! [Any]).first as! [Any])
            self.dataURLArray.addObjects(from: (result as! [Any]).last as! [Any])
            self.tableView.reloadData()
            self.playTheIndex(index: 0)
        }
    }
    
    open func playTheIndex(index: NSInteger) {
        // 指定到某一行播放
        let indexPath = IndexPath(row: index, section: 0)
        tableView.scrollToRow(at: indexPath, at: .none, animated: false)

        // 使用zf_filterShouldPlayCellWhileScrolled过滤播放
        self.player.zf_filterShouldPlayCellWhileScrolled { [weak self] indexPath in
            guard let self = self else { return }
            self.playVideo(at: indexPath)
        }
        // 如果是最后一行,去请求新数据
        if index == dataArray.count - 1 {
            // 加载下一页数据
            requestData()
            tableView.reloadData()
        }
    }

    override var shouldAutorotate: Bool {
        return false
    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }

    override var prefersStatusBarHidden: Bool {
        return false
    }

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .portrait
    }
    
    @objc func backClick(_ sender: UIButton) {
        self.navigationController?.popViewController(animated: true)
    }
    
    func playVideo(at indexPath: IndexPath) {
        let data: ShortVideoHomeTestModel = dataArray[indexPath.row] as! ShortVideoHomeTestModel
        self.player.playTheIndexPath(indexPath, assetURL: URL(string: data.videoUrl!)!)
        controlView.resetControlView()
        controlView.showCoverView(withUrl: data.poster!)
    }
    
    deinit {
        tableView.delegate = nil
        tableView.dataSource = nil
        controlView.removeFromSuperview()
        player.stopCurrentPlayingCell()
        if (playerManager.player != nil) {
            playerManager.player.stop()
        }
        print("销毁了")
    }
}
extension CNLiveShortVideoViewController {
    
    func likeActionMethod(viewcell: CNLiveShortVideoListTableViewCell, button: UIButton) {
        button.isSelected = !button.isSelected
    }
    func commentActionMethod(viewcell: CNLiveShortVideoListTableViewCell, button: UIButton) {
        
    }
    func shareActionMethod(viewcell: CNLiveShortVideoListTableViewCell, button: UIButton) {
        
    }
    func iconActionMethod(viewcell: CNLiveShortVideoListTableViewCell, button: UIButton) {
        
    }
    func faviActionMethod(viewcell: CNLiveShortVideoListTableViewCell, button: UIButton) {
        
    }
    func listActionMethod(viewcell: CNLiveShortVideoListTableViewCell, button: UIButton) {
        CNLiveShortVideoContentListView.showVideoContentListView(result: { videoId in
            
        })
    }
    func payActionMethod(viewcell: CNLiveShortVideoListTableViewCell, button: UIButton) {
        let payButton = button as! APButton
        payButton.startAnimating()
        DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { [weak self] in
            guard let self = self else { return }
            payButton.stopAnimating()
            for item in self.dataArray {
                let homeModel = item as! ShortVideoHomeTestModel
                homeModel.isMoney = false
                self.tableView.reloadData()
            }
            let index = self.dataArray.index(of: viewcell.homeModel as Any)
            self.playTheIndex(index: index)
        }

    }
}

extension CNLiveShortVideoViewController {
    
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return dataArray.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: kVideoBodyListViewCellIdentifier) as? CNLiveShortVideoListTableViewCell else {
            return CNLiveShortVideoListTableViewCell()
        }
        cell.setupWithData(model: dataArray[indexPath.row] as! ShortVideoHomeTestModel)
        cell.delegate = self
        return cell
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        self.playVideo(at: indexPath)
    }
    
    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        scrollView.zf_scrollViewDidEndDecelerating()
    }
    
    func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
        scrollView.zf_scrollViewDidEndDraggingWillDecelerate(decelerate)
    }
    
    func scrollViewDidScrollToTop(_ scrollView: UIScrollView) {
        scrollView.zf_scrollViewDidScrollToTop()
    }
    
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        scrollView.zf_scrollViewDidScroll()
    }
    
    func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
        scrollView.zf_scrollViewWillBeginDragging()
    }
    
    func zf_playTheVideo(at indexPath: IndexPath) {
        self.playVideo(at: indexPath)
    }
}