CNHomepageDuanJuDetailViewController.swift 11.7 KB
//
//  CNHomepageDuanJuDetailViewController.swift
//  metaCode
//
//  Created by zx on 2024/1/5.
//  首页短剧--在追短剧点击详情页

import Foundation
import MJRefresh
import EmptyDataSet_Swift

class CNHomepageDuanJuDetailViewController: CNLiveBaseViewController  ,UITableViewDataSource, UITableViewDelegate,EmptyDataSetSource, EmptyDataSetDelegate{
    
    let kCNLiveDuanjuTitleCellIdentifier = "kCNLiveDuanjuTitleCellIdentifier"
    let kCNLiveAlbumCellIdentifier = "kCNLiveAlbumCellIdentifier"

    var pageNum: NSInteger
    var network_type: CNLiveMineResponseType!
    // MARK: - 懒加载
    ///数据源
    lazy var dataArray: NSMutableArray = {
        var dataArray = NSMutableArray()
        return dataArray
    }()
    lazy var tableView : UITableView = {
        let tableView = UITableView(frame: .zero, style: .plain)
        tableView.dataSource = self
        tableView.delegate = self
        tableView.emptyDataSetSource = self
        tableView.emptyDataSetDelegate = self
        tableView.separatorStyle = .none
        tableView.tableFooterView = UIView.init()
        tableView.register(CNLiveAlbumCell.self, forCellReuseIdentifier: kCNLiveAlbumCellIdentifier)
        tableView.register(CNLiveDuanjuTitleCell.self, forCellReuseIdentifier: kCNLiveDuanjuTitleCellIdentifier)
        return tableView
    }()
    
    var dismissClosure: (()->())?
    //the point when start to interactive
    var interactiveStartingPoint: CGPoint? = nil

    var draggingDownToDismiss = false
    
    let cell: CNLiveHomePageDuanJuCell!
    
    private lazy var dismissPanGesture: UIPanGestureRecognizer = {
        let ges = UIPanGestureRecognizer()
        ges.maximumNumberOfTouches = 1
        ges.addTarget(self, action: #selector(handleDismissPan(gesture:)))
        ges.delegate = self
        return ges
    }()
        
    lazy var closeBtn: UIButton = {
        let btn = UIButton()
        btn.frame = CGRect(x: KSreenWidth - 20 - 30, y: KStatusBarHeight+20, width: 30, height: 30)
        btn.setImage(#imageLiteral(resourceName: "close_button"), for: .normal)
        btn.addTarget(self, action: #selector(closeAction), for: .touchUpInside)
        return btn
    }()
    
    init(cell:CNLiveHomePageDuanJuCell) {
        self.pageNum = 1
        self.cell = cell
        super.init(nibName: nil, bundle: nil)
        self.setupTranstion()
        setNeedsStatusBarAppearanceUpdate()
        
    }
    
    private func setupTranstion() {
        modalPresentationStyle = .custom
        transitioningDelegate = self
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setupUI()
        self.getMyAlbum(page: 1)
        self.view.backgroundColor = .white
    }
    
    private func setupUI() {
        self.view.layer.masksToBounds = true
        self.view.addSubview(self.tableView)
        self.tableView.frame = CGRect(x: 0, y: KStatusBarHeight, width: KSreenWidth, height: KSreenHeight-KStatusBarHeight)
        view.addSubview(closeBtn)
        view.addGestureRecognizer(dismissPanGesture)
        
        if #available(iOS 11.0, *) {
        } else {
            automaticallyAdjustsScrollViewInsets = false
        }
    }
    
    @objc private func closeAction() {
        dismiss(animated: true, completion: nil)
        let nav = self.navigationController as! CNHomePageBaseNavigationController
        nav.dismissClosure?()
    }
    
    func numberOfSections(in tableView: UITableView) -> Int {
        2
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if section == 0{
            return 1
        }else{
            return self.dataArray.count
        }
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if indexPath.section == 0{
            guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveDuanjuTitleCellIdentifier) as? CNLiveDuanjuTitleCell
            else {
                let cell = CNLiveDuanjuTitleCell()
                return cell
            }
            return cell
        }else{
            let albumModel = self.dataArray[indexPath.row] as! CNLiveAlbumMsgModel

            guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveAlbumCellIdentifier) as? CNLiveAlbumCell
            else {
                let cell = CNLiveAlbumCell()
                return cell
            }
            cell.albumMsgModel = albumModel
            return cell
        }
    }
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        if indexPath.section == 0{
            return 45//10+30+5
        }else{
            return 75
        }
    }
    
    // MARK: - 获取我的在追短剧列表
    func getMyAlbum(page:NSInteger){
        CNLiveHomePageViewModel.requestGetHomePageMyAlbum(page: page){[weak self] result, status in
            if status == .success{
                if self!.pageNum > 1 {
                    self!.dataArray.addObjects(from: result as! [CNLiveAlbumMsgModel])
                }
                if self!.pageNum == 1 {
                    self!.dataArray.removeAllObjects()
                    self!.dataArray.addObjects(from: result as! [CNLiveAlbumMsgModel])
                    if self!.dataArray.count > 0 && self!.tableView.mj_header == nil && self!.tableView.mj_footer == nil {
                        self!.addRefreshView()
                        self!.pageNum = self!.pageNum + 1
                        self!.getMyAlbum(page: self!.pageNum)

                    }
                }
                
                self!.tableView.mj_header?.endRefreshing()
                self!.tableView.mj_footer?.endRefreshing()
                self!.tableView.reloadData()
                if (result as! Array<Any>).count == 0 {
                    self!.tableView.mj_footer?.endRefreshingWithNoMoreData()
                    self!.tableView.reloadData()
                }

            }else if (status == .noNetwork) {
                self!.network_type = .noNetwork
                self!.tableView.reloadEmptyDataSet()
            } else {
                self!.network_type = .failed
                self!.tableView.reloadEmptyDataSet()
            }
        }
    }
    func addRefreshView() {
        tableView.mj_header = MJRefreshNormalHeader.init(refreshingBlock: {[weak self] in
            self!.pageNum = 1
            self!.getMyAlbum(page: 1)
        })
        
        tableView.mj_footer = MJRefreshAutoNormalFooter.init(refreshingBlock: {[weak self] in
            self!.pageNum = self!.pageNum + 1
            self!.getMyAlbum(page: self!.pageNum)
        })
    }
    
    @objc private func handleDismissPan(gesture: UIPanGestureRecognizer) {
        if !draggingDownToDismiss {
            return
        }
        
        let startingPoint: CGPoint
        
        if let p = interactiveStartingPoint {
            startingPoint = p
        } else {
            startingPoint = gesture.location(in: nil)
            interactiveStartingPoint = startingPoint
        }

        let currentLocation = gesture.location(in: nil)
        
        var progress = (currentLocation.y - startingPoint.y) / 100
        
        //prevent viewController bigger when scrolling up
        if currentLocation.y <= startingPoint.y {
            progress = 0
        }
        
        if progress >= 1.0 {
            dismiss(animated: true, completion: nil)
            let nav = self.navigationController as! CNHomePageBaseNavigationController
            nav.dismissClosure?()
//            dismissClosure?()
            stopDismissPanGesture(gesture)
            return
        }

        let targetShrinkScale: CGFloat = 0.86
        let currentScale: CGFloat = 1 - (1 - targetShrinkScale) * progress
        
        switch gesture.state {
        case .began,.changed:
            gesture.view?.transform = CGAffineTransform(scaleX: currentScale, y: currentScale)
            gesture.view?.layer.cornerRadius = GlobalConstants.toDayCardCornerRadius * (progress)
        case .cancelled,.ended:
            stopDismissPanGesture(gesture)
        default:
            break
        }
    }
    
    //当下拉Offset超过100或取消下拉手势时,执行此方法
    private func stopDismissPanGesture(_ gesture: UIPanGestureRecognizer) {
        draggingDownToDismiss = false
        interactiveStartingPoint = nil        
        UIView.animate(withDuration: 0.2) {
            gesture.view?.transform = CGAffineTransform.identity
        }
    }

}

extension CNHomepageDuanJuDetailViewController: UIViewControllerTransitioningDelegate {
    
    func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        return CNHomePageAnimationTransition(animationType: .present)
    }
    
    func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        return CNHomePageAnimationTransition(animationType: .dismiss)
    }
    
    func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
        return CNUpSlideCardPresentationController(presentedViewController: presented, presenting: presenting)
    }
}

extension CNHomepageDuanJuDetailViewController: UIScrollViewDelegate {
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        
        if scrollView.contentOffset.y < 0 {
            scrollView.contentOffset = .zero
            draggingDownToDismiss = true
        }
    }
}

extension CNHomepageDuanJuDetailViewController: UIGestureRecognizerDelegate {
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
    }
}

extension CNHomepageDuanJuDetailViewController {
    
    func image(forEmptyDataSet scrollView: UIScrollView) -> UIImage? {
        if network_type == .failed  || network_type == .unkonw {
            return UIImage(named: "mine_list_source_unusual_failed")
        }
        if dataArray.count == 0 {
            return UIImage(named: "mine_list_source_unusual_empty")
        }
        if network_type == .noNetwork {
            return UIImage(named: "mine_list_source_unusual_noNet")
        }
        return UIImage(named: "mine_list_source_unusual_empty")
    }
    
    func title(forEmptyDataSet scrollView: UIScrollView) -> NSAttributedString? {
        var defult_string = ""
        if network_type == .failed  || network_type == .unkonw {
            defult_string = "接口请求错误,刷新试试~"
        }
        if network_type == .noNetwork {
            defult_string = "网络开小差了,刷新试试~"
        }
        if dataArray.count == 0 {
            defult_string = "暂时没有数据~"
        }
        return NSAttributedString(string: defult_string, attributes: [.font: Font_17,.foregroundColor: HexColor("#666666")!])
    }
    
    func buttonTitle(forEmptyDataSet scrollView: UIScrollView, for state: UIControl.State) -> NSAttributedString? {
        if network_type == .failed || network_type == .noNetwork {
            let attributes = [NSAttributedString.Key.font:Font_16_Fit,
                              NSAttributedString.Key.foregroundColor: HexColor("#609BFF")]
            return NSAttributedString(string: "刷一刷", attributes: attributes as [NSAttributedString.Key : Any])
        }
        return nil
    }
    
    func emptyDataSet(_ scrollView: UIScrollView, didTapView view: UIView) {
        if network_type == .failed || network_type == .noNetwork  {
            getMyAlbum(page: 1)
        }
    }
}