| | |
| | | // |
| | | |
| | | 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 |
| | | } |
| | | } |