杨锴
2025-06-04 ac84f81ca2311300b431c1bfb9f71253b59073f2
DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_4_VC.swift
@@ -6,441 +6,502 @@
//
import UIKit
import JQTools
class HomeListenFight_lesson_4_VC: BaseVC {
            private var viewModel = FightAnswerViewModel()
            private var listenNewModel:ListenNewModel!
            private var page:Int!
            var rootViewModel:HomeListenFightViewModel!
            var teamScheduleModel:TeamScheduleModel?
            private var answerIndex:IndexPath? //答案的Index
            private var answerIndexs = Set<IndexPath>() //回答过的Index集合
            private var filterItems = [[Listen1SubModel]]() //此类型特殊,需要数据清理
            private lazy var stackView:UIStackView = {
                        let sta = UIStackView()
                        sta.spacing = 41
                        sta.distribution = .equalSpacing
                        sta.axis = .vertical
                        return sta
            }()
            private lazy var collectionView:UICollectionView = {
                        let flowLayout = UICollectionViewFlowLayout()
                        let w = (JQ_ScreenW - 164 * 2 - 62) / 2.0
                        flowLayout.itemSize = CGSize(width: w, height: w * 0.842)
                        flowLayout.minimumInteritemSpacing = 0
                        flowLayout.scrollDirection = .vertical
                        let collection = UICollectionView(frame: .zero, collectionViewLayout: flowLayout)
                        collection.contentInset = UIEdgeInsets(top: 33, left: 0, bottom: 0, right: 0)
                        collection.register(UINib(nibName: "ListenFight_lesson_4_CCell", bundle: nil), forCellWithReuseIdentifier: "_ListenFight_lesson_4_CCell")
                        collection.register(UICollectionReusableView.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "header")
                        collection.isScrollEnabled = false
                        return collection
            }()
            private var voicePlayer = VoicePlayer.share()
            required init(page:Int,listenNewModel:ListenNewModel){
                        super.init(nibName: nil, bundle: nil)
                        self.page = page
                        self.listenNewModel = listenNewModel
                        let temp1 = Array(listenNewModel.subjectList[page][0...1])
                        let temp2 = Array(listenNewModel.subjectList[page][2...3])
                        filterItems.append(temp1)
                        filterItems.append(temp2)
            }
            required init?(coder: NSCoder) {
                        fatalError("init(coder:) has not been implemented")
            }
            func restore(){
                        answerIndexs.removeAll()
                        answerIndex = nil
                        for subView in view.subviews{
                                    if subView is Lesson_4_AnswerView{
                                                subView.removeFromSuperview()
                                    }
                        }
                        setUI()
                        collectionView.reloadData()
            }
    private var viewModel = FightAnswerViewModel()
    private var listenNewModel:ListenNewModel!
    private var page:Int!
    var rootViewModel:HomeListenFightViewModel!
    var teamScheduleModel:TeamScheduleModel?
    private var answerIndex:IndexPath? //答案的Index
    private var answerIndexs = Set<IndexPath>() //回答过的Index集合
    private var filterItems = [[Listen1SubModel]]() //此类型特殊,需要数据清理
    private var handleClouse:(()->Void)?
    private lazy var stackView:UIStackView = {
        let sta = UIStackView()
        sta.spacing = 41
        sta.distribution = .equalSpacing
        sta.axis = .vertical
        return sta
    }()
    private lazy var collectionView:UICollectionView = {
        let flowLayout = UICollectionViewFlowLayout()
        let w = (JQ_ScreenW - 164 * 2 - 62) / 2.0
        flowLayout.minimumLineSpacing = 20
        flowLayout.minimumInteritemSpacing = 0
        flowLayout.itemSize = CGSize(width: w, height: w * 0.702)
        flowLayout.scrollDirection = .vertical
        let collection = UICollectionView(frame: .zero, collectionViewLayout: flowLayout)
        collection.contentInset = UIEdgeInsets(top: 33, left: 0, bottom: 0, right: 0)
        collection.register(UINib(nibName: "ListenFight_lesson_4_CCell", bundle: nil), forCellWithReuseIdentifier: "_ListenFight_lesson_4_CCell")
        collection.register(UICollectionReusableView.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "header")
        collection.isScrollEnabled = false
        return collection
    }()
    private var voicePlayer = VoicePlayer.share()
    required init(page:Int,listenNewModel:ListenNewModel){
        super.init(nibName: nil, bundle: nil)
        self.page = page
        self.listenNewModel = listenNewModel
        let temp1 = Array(listenNewModel.subjectList[page][0...1])
        let temp2 = Array(listenNewModel.subjectList[page][2...3])
        filterItems.append(temp1)
        filterItems.append(temp2)
    }
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    func restore(){
        answerIndexs.removeAll()
        answerIndex = nil
        for subView in view.subviews{
            if subView is Lesson_4_AnswerView{
                subView.removeFromSuperview()
            }
        }
        setUI()
        collectionView.reloadData()
    }
    override func viewDidLoad() {
        super.viewDidLoad()
                        //回传记录,始终保持答题进度
                        if let team = teamScheduleModel{
                                    for teamId in team.teamIds{
                                                for v in listenNewModel.subjectList[page]{
                                                            if team.topicIds.contains(v.id){
                                                                        rootViewModel.insertCorrectAnswer(teamId: "\(teamId)", answerId: v.id)
                                                            }
                                                }
                                    }
                        }
        //回传记录,始终保持答题进度
        if let team = teamScheduleModel{
            for teamId in team.teamIds{
                for v in listenNewModel.subjectList[page]{
                    if team.topicIds.contains(v.id){
                        rootViewModel.insertCorrectAnswer(teamId: "\(teamId)", answerId: v.id)
                    }
                }
            }
        }
        DispatchQueue.main.asyncAfter(deadline: .now()+1) {
            var index:IndexPath!
            if self.filterItems[0][0].isQuestion == 1{
                index = IndexPath(row: 0, section: 0)
            }else{
                index = IndexPath(row: 1, section: 0)
            }
            let m = self.filterItems[index.section][index.row]
            self.viewModel.selectIndex.accept(index)
            UIView.animate(withDuration: 0.5) {
                self.collectionView.snp.remakeConstraints { make in
                    make.left.equalTo(76)
                    make.top.equalTo(self.view.safeAreaLayoutGuide.snp.top).offset(0)
                    make.width.equalTo(JQ_ScreenW - 164 * 2)
                    make.bottom.equalToSuperview()
                }
                self.view.layoutIfNeeded()
            }completion: { _ in
                self.setAnswerStackView()
                VoicePlayer.share().playerAt(url: m.correct)
            }
        }
    }
            override func viewDidAppear(_ animated: Bool) {
                        super.viewDidAppear(animated)
                        voicePlayer.delegate = self
            }
            override func viewDidDisappear(_ animated: Bool) {
                        super.viewDidDisappear(animated)
                        voicePlayer.delegate = nil
                        VoicePlayer.share().playerInterrupt()
            }
            override func setUI() {
                        super.setUI()
                        if !view.subviews.contains(collectionView){
                                    collectionView.delegate = self
                                    collectionView.dataSource = self
                                    collectionView.showsVerticalScrollIndicator = false
                                    collectionView.backgroundColor = .clear
                                    view.addSubview(collectionView)
                        }
                        collectionView.snp.makeConstraints { make in
                                    make.top.equalTo(self.view.safeAreaLayoutGuide.snp.top).offset(0)
                                    make.left.equalTo(164)
                                    make.width.equalTo(JQ_ScreenW - 164 * 2)
                                    make.bottom.equalToSuperview()
                        }
            }
            override func viewDidLayoutSubviews() {
                        super.viewDidLayoutSubviews()
                        let flowLayout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout
                        let w = (collectionView.size.width - flowLayout.minimumLineSpacing) / 2
                        let h = (collectionView.size.height - flowLayout.minimumInteritemSpacing) / 2.1
                        if flowLayout.itemSize.width != w || flowLayout.itemSize.height != h{
                                    flowLayout.itemSize = CGSize(width: w, height: h)
                                    collectionView.reloadData()
                        }
            }
            private func setAnswerStackView(){
                        guard let selectIndex = viewModel.selectIndex.value else{
                                    alertError(msg: "请先听题");return
                        }
                        for v in stackView.subviews{
                                    v.removeFromSuperview()
                        }
                        if !view.subviews.contains(stackView){
                                    view.addSubview(stackView)
                                    stackView.snp.makeConstraints { make in
                                                make.right.equalToSuperview().offset(-14)
                                                make.centerY.equalToSuperview()
                                    }
                        }
                        let answerModel = filterItems[selectIndex.section].filter({$0.isQuestion == 0}).first!
                        let answerId = answerModel.id
                        var tempVoiceArray = [String]()
                        for v in filterItems[selectIndex.section]{
                                    if v.id == answerId{
                                                tempVoiceArray.append(v.correct)
                                                tempVoiceArray.append(v.error.components(separatedBy: ",").first ?? "")
                                                tempVoiceArray.append(v.error.components(separatedBy: ",").last ?? "")
                                    }
                        }
                        tempVoiceArray.shuffle()
                        for i in 0...2{
                                    let answerView = Lesson_4_AnswerView.jq_loadNibView()
                                    answerView.btn_choose.tag = 10 + i
                                    answerView.tag = 20 + i
                                    answerView.voiceUrl = tempVoiceArray[i]
                                    answerView.btn_isAnswer.setImage(viewModel.selectIndex.value?.row == 1 ? UIImage(named: "icon_question"):UIImage(named: "icon_answer"), for: .normal)
                                    answerView.btn_choose.addTarget(self, action: #selector(answerAction), for: .touchUpInside)
                                    answerView.alpha = 0
                                    answerView.snp.makeConstraints { make in
                                                make.width.equalTo(221)
                                                make.height.equalTo(52)
                                    }
                                    answerView.btn_choose.isEnabled = false
                                    answerView.playAt { index in
                                                answerView.btn_choose.isEnabled = true
                                    }
                                    UIView.animate(withDuration: 0.05 + Double(i)) {
                                                answerView.alpha = 1
                                    }
                                    stackView.insertArrangedSubview(answerView, at: 0)
                        }
            }
            @objc func answerAction(btn:UIButton){
                        var islistenDone:Int = 0
                        for v in stackView.arrangedSubviews as! [Lesson_4_AnswerView]{
                                    if v.btn_choose.isEnabled == true{
                                                islistenDone += 1
                                    }
                        }
                        if islistenDone != 3{
                                    alertError(msg: "请先听完");return
                        }
                        guard let selectIndex = viewModel.selectIndex.value else{
                                    alertError(msg: "请先听题");return
                        }
                        var tempSubV:Lesson_4_AnswerView?
                        for subV in stackView.arrangedSubviews{
                                    if let s = subV as? Lesson_4_AnswerView{
                                                s.btn_choose.isSelected = btn.tag == s.btn_choose.tag
                                                if s.btn_choose.isSelected{tempSubV = s}
                                    }
                        }
                        var answerModel:Listen1SubModel?
                        for (index,v) in filterItems[selectIndex.section].enumerated(){
                                    let m = filterItems[selectIndex.section].filter({$0.isQuestion == 0}).first
                                    if v.id == m?.id{
                                                answerModel = v
                                                answerIndex = IndexPath(row: index, section: viewModel.selectIndex.value!.section)
                                    }
                        }
                        var answerType:Fight_lessonType = .none
                        if tempSubV?.voiceUrl == answerModel?.correct{
                                    answerType = .success
                                    voicePlayer.playSuccessVoice()
                                    var teamId:String = ""
                                    var answerId:Int = 0
                                    if self.viewModel.selectIndex.value?.section == 1{
                                                teamId = self.listenNewModel.data?.id.components(separatedBy: ",")[self.page + 1] ?? ""
                                                answerId = answerModel!.id
                                    }else{
                                                teamId = self.listenNewModel.data?.id.components(separatedBy: ",")[self.page] ?? ""
                                                answerId = answerModel!.id
                                    }
                                    self.rootViewModel.insertCorrectAnswer(teamId: teamId, answerId: answerId)
                                    DispatchQueue.main.asyncAfter(deadline: .now()+2) {
                                                self.voicePlayer.playerAt(url: tempSubV!.voiceUrl)
                                    }
                                    //防止重复答题造成计数错误的问题
                                    if !answerIndexs.contains(answerIndex!){
                                                rootViewModel.correctNum += 1
                                                let v = rootViewModel.answerCount.value + 1
                                                rootViewModel.answerCount.accept(v)
                                    }
                                    //正确才记录回答
                                    answerIndexs.insert(answerIndex!)
                        }else{
                                    answerType = .fail
                                    voicePlayer.playFailVoice()
                                    rootViewModel.errorNum += 1
                        }
                        voicePlayer.playerEnd()
                        switch answerType {
                                    case .success:
                                                DispatchQueue.main.asyncAfter(deadline: .now()+0.4) {
                                                            if let copyView = tempSubV?.copyView(){
                                                                        tempSubV?.alpha = 0
                                                                        let newRect = tempSubV!.view_handle.convert(tempSubV!.bounds, to: self.view)
                                                                        copyView.frame = CGRect(origin: newRect.origin, size: CGSize(width: 159, height: 52))
                                                                        copyView.view_state.isHidden = true
                                                                        copyView.isCopy = true
                                                                        copyView.isPlaying()
                                                                        copyView.btn_isAnswer.setImage(self.viewModel.selectIndex.value?.row == 1 ? UIImage(named: "icon_question"):UIImage(named: "icon_answer"), for: .normal)
                                                                        copyView.img_play.alpha = 1
                                                                        copyView.voiceUrl = tempSubV!.voiceUrl
                                                                        self.view.addSubview(copyView)
                                                                        self.view.layoutIfNeeded()
                                                                        //获取Cell的顶部试图
                                                                        if let cell = self.collectionView.dequeueReusableCell(withReuseIdentifier: "_ListenFight_lesson_4_CCell", for: self.answerIndex!) as? ListenFight_lesson_4_CCell{
                                                                                    var newRect1 = cell.convert(cell.bounds, to: self.collectionView)
                                                                                    newRect1.origin.x += 76
                                                                                    newRect1.origin.y += 33
                                                                                    self.collectionView.reloadData()
                                                                                    UIView.animate(withDuration: 0.4) {
                                                                                                copyView.frame = CGRect(origin: newRect1.origin, size: CGSize(width: 159, height: 52))
                                                                                    } completion: { _ in
                                                                                                self.viewModel.selectIndex.accept(nil)
                                                                                                for v in self.stackView.subviews{
                                                                                                            v.removeFromSuperview()
                                                                                                }
                                                                                                self.stackView.layoutIfNeeded()
                                                                                    }
                                                                        }
                                                            }
                                                }
                                    case .fail:
                                                self.view.isUserInteractionEnabled = false
                                                UIView.animate(withDuration: 0.4) {
                                                            tempSubV?.img_state.alpha = 1
                                                }completion: { _ in
                                                            UIView.animate(withDuration: 0.4, delay: 2.0) {
                                                                        tempSubV?.img_state.alpha = 0
                                                            }
                                                            DispatchQueue.main.asyncAfter(deadline: .now()+2) {
                                                                        self.setAnswerStackView()
                                                                        self.view.isUserInteractionEnabled = true
                                                            }
                                                }
                                    case .none:
                                                break
                        }
            }
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        voicePlayer.delegate = self
    }
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        voicePlayer.delegate = nil
        VoicePlayer.share().playerInterrupt()
    }
    override func setUI() {
        super.setUI()
        if !view.subviews.contains(collectionView){
            collectionView.delegate = self
            collectionView.dataSource = self
            collectionView.showsVerticalScrollIndicator = false
            collectionView.backgroundColor = .clear
            view.addSubview(collectionView)
        }
        collectionView.snp.makeConstraints { make in
            make.top.equalTo(self.view.safeAreaLayoutGuide.snp.top).offset(0)
            make.left.equalTo(164)
            make.width.equalTo(JQ_ScreenW - 164 * 2)
            make.bottom.equalToSuperview()
        }
    }
    override func setRx() {
        NotificationCenter.default.rx.notification(ResetLession_Noti).take(until: self.rx.deallocated).subscribe(onNext: {[weak self]_ in
            self?.restore()
            self?.viewDidLoad()
        }).disposed(by: disposeBag)
    }
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        let flowLayout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout
        flowLayout.minimumLineSpacing = 20
        flowLayout.minimumInteritemSpacing = 20
        let w = (collectionView.size.width - flowLayout.minimumLineSpacing) / 2
        let h = (collectionView.size.height - flowLayout.minimumInteritemSpacing) / 2.1
        if flowLayout.itemSize.width != w || flowLayout.itemSize.height != h{
            flowLayout.itemSize = CGSize(width: w, height: h - 20)
            collectionView.reloadData()
        }
    }
    private func setAnswerStackView(){
        guard let selectIndex = viewModel.selectIndex.value else{
            alertError(msg: "请先听题");return
        }
        for v in stackView.subviews{
            v.removeFromSuperview()
        }
        if !view.subviews.contains(stackView){
            view.addSubview(stackView)
            stackView.snp.makeConstraints { make in
                make.right.equalToSuperview().offset(-14)
                make.centerY.equalToSuperview()
            }
        }
        let answerModel = filterItems[selectIndex.section].filter({$0.isQuestion == 0}).first!
        let answerId = answerModel.id
        var tempVoiceArray = [String]()
        for v in filterItems[selectIndex.section]{
            if v.id == answerId{
                tempVoiceArray.append(v.correct)
                tempVoiceArray.append(v.error.components(separatedBy: ",").first ?? "")
                tempVoiceArray.append(v.error.components(separatedBy: ",").last ?? "")
            }
        }
        tempVoiceArray.shuffle()
        for i in 0...2{
            let answerView = Lesson_4_AnswerView.jq_loadNibView()
            answerView.btn_choose.tag = 10 + i
            answerView.tag = 20 + i
            answerView.voiceUrl = tempVoiceArray[i]
            answerView.btn_isAnswer.setImage(viewModel.selectIndex.value?.row == 1 ? UIImage(named: "icon_question"):UIImage(named: "icon_answer"), for: .normal)
            answerView.btn_choose.addTarget(self, action: #selector(answerAction), for: .touchUpInside)
            answerView.alpha = 0
            answerView.snp.makeConstraints { make in
                make.width.equalTo(221)
                make.height.equalTo(52)
            }
            answerView.btn_choose.isEnabled = false
            answerView.playAt { index in
                answerView.btn_choose.isEnabled = true
            }
            //            UIView.animate(withDuration: 0.05 + Double(i)) {
            answerView.alpha = 1
            //            }
            stackView.insertArrangedSubview(answerView, at: 0)
        }
    }
    func handleClouseAction(clouse:@escaping ()->Void){
        self.handleClouse = clouse
    }
    @objc func answerAction(btn:UIButton){
        var islistenDone:Int = 0
        for v in stackView.arrangedSubviews as! [Lesson_4_AnswerView]{
            if v.btn_choose.isEnabled == true{
                islistenDone += 1
            }
        }
        if islistenDone != 3{
            alertError(msg: "请先听完");return
        }
        guard let selectIndex = viewModel.selectIndex.value else{
            alertError(msg: "请先听题");return
        }
        var tempSubV:Lesson_4_AnswerView?
        for subV in stackView.arrangedSubviews{
            if let s = subV as? Lesson_4_AnswerView{
                s.btn_choose.isSelected = btn.tag == s.btn_choose.tag
                if s.btn_choose.isSelected{tempSubV = s}
            }
        }
        var answerModel:Listen1SubModel?
        for (index,v) in filterItems[selectIndex.section].enumerated(){
            let m = filterItems[selectIndex.section].filter({$0.isQuestion == 0}).first
            if v.id == m?.id{
                answerModel = v
                answerIndex = IndexPath(row: index, section: viewModel.selectIndex.value!.section)
            }
        }
        var answerType:Fight_lessonType = .none
        if tempSubV?.voiceUrl == answerModel?.correct{
            answerType = .success
            voicePlayer.playSuccessVoice()
            let model = listenNewModel.list[self.page]
            model.status = 2
            Services.answerQuestion(id: model.id, status: 2).subscribe(onNext: {_ in
                self.handleClouse?()
            }).disposed(by: self.disposeBag)
            var teamId:String = ""
            var answerId:Int = 0
            if self.viewModel.selectIndex.value?.section == 1{
                teamId = self.listenNewModel.data?.id.components(separatedBy: ",")[self.page + 1] ?? ""
                answerId = answerModel!.id
            }else{
                teamId = self.listenNewModel.data?.id.components(separatedBy: ",")[self.page] ?? ""
                answerId = answerModel!.id
            }
            self.rootViewModel.insertCorrectAnswer(teamId: teamId, answerId: answerId)
            DispatchQueue.main.asyncAfter(deadline: .now()+2) {
                self.voicePlayer.playerAt(url: tempSubV!.voiceUrl)
            }
            //防止重复答题造成计数错误的问题
            if !answerIndexs.contains(answerIndex!){
                rootViewModel.correctNum += 1
                let v = rootViewModel.answerCount.value + 1
                rootViewModel.answerCount.accept(v)
            }
            //正确才记录回答
            answerIndexs.insert(answerIndex!)
        }else{
            answerType = .fail
            voicePlayer.playFailVoice()
            rootViewModel.errorNum += 1
            let model = listenNewModel.list[self.page]
            model.status = 3
            Services.answerQuestion(id: model.id, status: 3).subscribe(onNext: {_ in
                self.handleClouse?()
            }).disposed(by: self.disposeBag)
        }
        voicePlayer.playerEnd()
        switch answerType {
        case .success:
            DispatchQueue.main.asyncAfter(deadline: .now()+0.4) {
                if let copyView = tempSubV?.copyView(){
                    tempSubV?.alpha = 0
                    let newRect = tempSubV!.view_handle.convert(tempSubV!.bounds, to: self.view)
                    copyView.frame = CGRect(origin: newRect.origin, size: CGSize(width: 159, height: 40))
                    copyView.view_state.isHidden = true
                    copyView.isCopy = true
                    copyView.isPlaying()
                    copyView.btn_isAnswer.setImage(self.viewModel.selectIndex.value?.row == 1 ? UIImage(named: "icon_question"):UIImage(named: "icon_answer"), for: .normal)
                    copyView.img_play.alpha = 1
                    copyView.voiceUrl = tempSubV!.voiceUrl
                    self.view.addSubview(copyView)
                    self.view.layoutIfNeeded()
                    //获取Cell的顶部试图
                    if let cell = self.collectionView.cellForItem(at: self.answerIndex!) as? ListenFight_lesson_4_CCell{
                        var newRect1 = cell.convert(cell.bounds, to: self.collectionView)
                        newRect1.origin.x += 76
                        newRect1.origin.y += 33
                        self.collectionView.reloadData()
                        UIView.animate(withDuration: 0.4) {
                            copyView.frame = CGRect(origin: newRect1.origin, size: CGSize(width: newRect1.width, height: 40))
                        } completion: { _ in
                            self.viewModel.selectIndex.accept(nil)
                            for v in self.stackView.subviews{
                                v.removeFromSuperview()
                            }
                            self.stackView.layoutIfNeeded()
                        }
                    }
                }
            }
        case .fail:
            self.view.isUserInteractionEnabled = false
            UIView.animate(withDuration: 0.4) {
                tempSubV?.img_state.alpha = 1
            }completion: { _ in
                UIView.animate(withDuration: 0.4, delay: 2.0) {
                    tempSubV?.img_state.alpha = 0
                }
                DispatchQueue.main.asyncAfter(deadline: .now()+2) {
                    self.setAnswerStackView()
                    self.view.isUserInteractionEnabled = true
                }
            }
        case .none:
            break
        }
    }
}
extension HomeListenFight_lesson_4_VC:UICollectionViewDelegate{
}
extension HomeListenFight_lesson_4_VC:UICollectionViewDelegateFlowLayout{
            func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
                        return CGSize.zero
            }
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
        return CGSizeMake(JQ_ScreenW, 20)
    }
}
extension HomeListenFight_lesson_4_VC:UICollectionViewDataSource{
            func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
                        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_ListenFight_lesson_4_CCell", for: indexPath) as! ListenFight_lesson_4_CCell
                        cell.backgroundColor = .clear
                        cell.contentView.backgroundColor = .clear
                        cell.indexPath = indexPath
                        cell.playAtIndex {[weak self] index in
                                    guard let weakSelf = self else { return }
                                    weakSelf.viewModel.selectIndex.accept(index)
                                    UIView.animate(withDuration: 0.5) {
                                                weakSelf.collectionView.snp.remakeConstraints { make in
                                                            make.left.equalTo(76)
                                                            make.top.equalTo(weakSelf.view.safeAreaLayoutGuide.snp.top).offset(0)
                                                            make.width.equalTo(JQ_ScreenW - 164 * 2)
                                                            make.bottom.equalToSuperview()
                                                }
                                                weakSelf.view.layoutIfNeeded()
                                    }completion: { _ in
                                                weakSelf.setAnswerStackView()
                                    }
                        }
                        let m = filterItems[indexPath.section][indexPath.row]
                        if indexPath == answerIndex{
                                    UIView.animate(withDuration: 0.4, delay: 0, usingSpringWithDamping: 0.4, initialSpringVelocity: 0.4,options: .layoutSubviews) {
                                                cell.img_state.alpha = 1
                                                cell.img_state.transform = .init(scaleX: 1.0, y: 1.0)
                                    }
                                    UIView.animate(withDuration: 0.4, delay: 3.0) {
                                                cell.img_state.alpha = 0
                                                cell.img_state.transform = .init(scaleX: 0.1, y: 0.1)
                                    }
                        }else{
                                    cell.img_state.alpha = 0
                                    cell.img_state.transform = .init(scaleX: 0.1, y: 0.1)
                        }
                        if indexPath.row == 1{
                                    cell.btn_handle.setImage(UIImage(named: "icon_answer"), for: .normal)
                                    cell.view_handle.isHidden = true
                        }else{
                                    cell.btn_handle.setImage(UIImage(named: "icon_question"), for: .normal)
                                    cell.view_handle.isHidden = true
                        }
                        //问题
                        if filterItems[indexPath.section][indexPath.row].isQuestion == 0{
                                    cell.view_handle.isHidden = true
                        }else{
                                    cell.view_handle.isHidden = false
                        }
                        cell.setModel(m)
                        if answerIndexs.count == 0 && indexPath.section == 1{
                                    cell.view_handle.backgroundColor = .gray.withAlphaComponent(0.5)
                                    cell.view_handle.isEnabled = false
                        }else{
                                    cell.view_handle.backgroundColor = UIColor(hexString: "#41A2EB")
                                    cell.view_handle.isEnabled = true
                        }
                        return cell
            }
            func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
                        let reusableView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "header", for: indexPath)
                        return reusableView
            }
            func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
                        return filterItems[section].count
            }
            func numberOfSections(in collectionView: UICollectionView) -> Int {
                        return filterItems.count
            }
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_ListenFight_lesson_4_CCell", for: indexPath) as! ListenFight_lesson_4_CCell
        cell.backgroundColor = .white
        cell.contentView.backgroundColor = .white
        cell.indexPath = indexPath
        cell.playAtIndex {[weak self] index in
            guard let weakSelf = self else { return }
            weakSelf.viewModel.selectIndex.accept(index)
            UIView.animate(withDuration: 0.5) {
                weakSelf.collectionView.snp.remakeConstraints { make in
                    make.left.equalTo(76)
                    make.top.equalTo(weakSelf.view.safeAreaLayoutGuide.snp.top).offset(0)
                    make.width.equalTo(JQ_ScreenW - 164 * 2)
                    make.bottom.equalToSuperview()
                }
                weakSelf.view.layoutIfNeeded()
            }completion: { _ in
                weakSelf.setAnswerStackView()
            }
        }
        let m = filterItems[indexPath.section][indexPath.row]
        if indexPath == answerIndex{
            UIView.animate(withDuration: 0.4, delay: 0, usingSpringWithDamping: 0.4, initialSpringVelocity: 0.4,options: .layoutSubviews) {
                cell.img_state.alpha = 1
                cell.img_state.transform = .init(scaleX: 1.0, y: 1.0)
            }
            UIView.animate(withDuration: 0.4, delay: 3.0) {
                cell.img_state.alpha = 0
                cell.img_state.transform = .init(scaleX: 0.1, y: 0.1)
            }
        }else{
            cell.img_state.alpha = 0
            cell.img_state.transform = .init(scaleX: 0.1, y: 0.1)
        }
        if indexPath.row == 1{
            cell.btn_handle.setImage(UIImage(named: "icon_answer"), for: .normal)
            cell.view_handle.isHidden = true
        }else{
            cell.btn_handle.setImage(UIImage(named: "icon_question"), for: .normal)
            cell.view_handle.isHidden = true
        }
        //问题
        if filterItems[indexPath.section][indexPath.row].isQuestion == 0{
            cell.view_handle.isHidden = true
        }else{
            cell.view_handle.isHidden = false
        }
        cell.setModel(m)
        if answerIndexs.count == 0 && indexPath.section == 1{
            cell.view_handle.backgroundColor = UIColor(hexString: "#D4D2CD")
            cell.view_handle.isEnabled = false
        }else{
            cell.view_handle.backgroundColor = .white
            cell.view_handle.isEnabled = true
        }
        return cell
    }
    func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
        let reusableView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "header", for: indexPath)
        return reusableView
    }
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return filterItems[section].count
    }
    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return filterItems.count
    }
}
extension HomeListenFight_lesson_4_VC:VoicePlayerDelegate{
            func playComplete() {
                        self.view.isUserInteractionEnabled = true
                        for subV in view.subviews {
                                    if let s = subV as? Lesson_4_AnswerView{
                                                s.playEnd()
                                                s.img_play.isHidden = false
                                                s.img_play.alpha = 1
                                    }
                        }
                        for subV in stackView.arrangedSubviews{
                                    if let s = subV as? Lesson_4_AnswerView{
                                                s.playEnd()
                                    }
                        }
                        if let indexPath = viewModel.selectIndex.value ,let cell = collectionView.cellForItem(at: indexPath) as? ListenFight_lesson_4_CCell{
                                    cell.playEnd()
                        }
                        //回答完成,下一答题
                        if answerIndexs.count == 2{
                                    voicePlayer.playerEnd()
                                    NotificationCenter.default.post(name: NextLession_Noti, object: nil)
                                    return
                        }
            }
            func playing() {
                        self.view.isUserInteractionEnabled = false
            }
    func playComplete() {
        self.view.isUserInteractionEnabled = true
        for subV in view.subviews {
            if let s = subV as? Lesson_4_AnswerView{
                s.playEnd()
                s.img_play.isHidden = false
                s.img_play.alpha = 1
            }
        }
        let temp = stackView.subviews as! [Lesson_4_AnswerView]
        for subV in temp.reversed() {
            if subV.isplayend == false{
                voicePlayer.playerAt(url: subV.voiceUrl ?? "")
                subV.isPlaying()
                subV.btn_choose.isEnabled = true
                break
            }else{
                subV.playEnd()
            }
        }
        if let indexPath = viewModel.selectIndex.value ,let cell = collectionView.cellForItem(at: indexPath) as? ListenFight_lesson_4_CCell{
            cell.playEnd()
        }
        //回答完成,下一答题
        if answerIndexs.count == 2{
            voicePlayer.playerEnd()
            NotificationCenter.default.post(name: NextLession_Noti, object: nil)
            return
        }
    }
    func playing() {
        self.view.isUserInteractionEnabled = false
    }
}