From ed382f4fb711c7c10439467a8b37442b7430e4eb Mon Sep 17 00:00:00 2001 From: 无故事王国 <841720330@qq.com> Date: 星期二, 18 六月 2024 19:33:11 +0800 Subject: [PATCH] fix --- DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_2_VC.swift | 16 +++ DolphinEnglishLearnStudent/Moudle/Home/Listen/View/ChooseLevelView.swift | 5 + DolphinEnglishLearnStudent/Services/Services.swift | 7 + DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFightVC.swift | 33 ++++--- DolphinEnglishLearnStudent/Moudle/Home/HomeListenFight_lesson_1_VC.swift | 38 ++++---- DolphinEnglishLearnStudent/Config/VoicePlayer.swift | 14 ++- DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_3_VC.swift | 98 +++++++++++++---------- 7 files changed, 126 insertions(+), 85 deletions(-) diff --git a/DolphinEnglishLearnStudent/Config/VoicePlayer.swift b/DolphinEnglishLearnStudent/Config/VoicePlayer.swift index c64fbab..5b87497 100644 --- a/DolphinEnglishLearnStudent/Config/VoicePlayer.swift +++ b/DolphinEnglishLearnStudent/Config/VoicePlayer.swift @@ -60,7 +60,9 @@ self.player = try? AVAudioPlayer(contentsOf: fileURL!) self.player?.delegate = self self.player?.play() - self.delegate?.playing() + DispatchQueue.main.async { + self.delegate?.playing() + } }else{ //文件不存在:执行下载 let downloadTask = URLSession.shared.downloadTask(with: URL(string: u)!) { tempLocalUrl, response, error in @@ -71,7 +73,9 @@ self.player = try? AVAudioPlayer(contentsOf: finalCacheUrl) self.player?.delegate = self self.player?.play() - self.delegate?.playing() + DispatchQueue.main.async { + self.delegate?.playing() + } } catch { print("视频缓存失败:catch") } @@ -176,8 +180,10 @@ extension VoicePlayer:AVAudioPlayerDelegate{ func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { - VoicePlayer.share().playComplete?() - delegate?.playComplete() + DispatchQueue.main.async { + VoicePlayer.share().playComplete?() + self.delegate?.playComplete() + } } func audioPlayerDecodeErrorDidOccur(_ player: AVAudioPlayer, error: (any Error)?) { diff --git a/DolphinEnglishLearnStudent/Moudle/Home/HomeListenFight_lesson_1_VC.swift b/DolphinEnglishLearnStudent/Moudle/Home/HomeListenFight_lesson_1_VC.swift index 7da2182..67eb3c7 100644 --- a/DolphinEnglishLearnStudent/Moudle/Home/HomeListenFight_lesson_1_VC.swift +++ b/DolphinEnglishLearnStudent/Moudle/Home/HomeListenFight_lesson_1_VC.swift @@ -82,6 +82,7 @@ func restore(){ + isAnsterDone = false isAnsterModel.removeAll() isAnsterComplete = false viewModel.answerType.accept(.none) @@ -94,7 +95,21 @@ private func getNextAnswer(){ isListen = false if isAnsterModel.count == 4{ - print("答题答满了");return + if !isAnsterDone{ + let v = rootViewModel.answerCount.value + rootViewModel.answerCount.accept(v + 1) + } + isAnsterDone = true + + DispatchQueue.main.asyncAfter(deadline: .now()+3){[weak self] in + guard let weakSelf = self else { return } + NotificationCenter.default.post(name: NextLession_Noti, object: nil) + weakSelf.viewModel.answerType.accept(.none) + weakSelf.viewModel.selectIndex.accept(nil) + weakSelf.rootViewModel.answerItems[weakSelf.page] = weakSelf.listenNewModel.subjectList[weakSelf.page] + weakSelf.isListen = false + } + return } randomElement = listenNewModel.subjectList[page].randomElement() @@ -252,28 +267,13 @@ } extension HomeListenFight_lesson_1_VC:VoicePlayerDelegate{ - func playing() {} + func playing() { + isListen = false + } func playComplete() { isListen = true self.menuView?.resetView() - if isAnsterModel.count == 4{ - - if !isAnsterDone{ - let v = rootViewModel.answerCount.value - rootViewModel.answerCount.accept(v + 1) - } - isAnsterDone = true - - DispatchQueue.main.asyncAfter(deadline: .now()+3){[weak self] in - guard let weakSelf = self else { return } - NotificationCenter.default.post(name: NextLession_Noti, object: nil) - weakSelf.viewModel.answerType.accept(.none) - weakSelf.viewModel.selectIndex.accept(nil) - weakSelf.rootViewModel.answerItems[weakSelf.page] = weakSelf.listenNewModel.subjectList[weakSelf.page] - weakSelf.isListen = false - } - } if isAnsterComplete{ getNextAnswer() diff --git a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFightVC.swift b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFightVC.swift index 7e3e4a6..3ffdb54 100644 --- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFightVC.swift +++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFightVC.swift @@ -48,6 +48,7 @@ /// 当前页数 var currentPage = BehaviorRelay<Int>(value: 0) + var subPage = BehaviorRelay<Int>(value: 1) //小题目角标 var maxPage = BehaviorRelay<Int>(value: 5) var listenType = BehaviorRelay<ListenType>(value:.lesson1) var times:Int = 0 @@ -204,6 +205,8 @@ },onError: { _ in weakSelf.showGameLevel() }).disposed(by: weakSelf.disposeBag) + } cancelClouse: {[weak self] in + self?.navigationController?.popViewController(animated: true) } } @@ -294,8 +297,10 @@ private func setPages(){ switch viewModel.listenType.value{ - case .lesson1,.lesson2,.lesson3,.lesson5: + case .lesson1,.lesson2,.lesson5: label_pageNum.text = "已完成:\(viewModel.answerCount.value)/\((data as! ListenNewModel).subjectList.flatMap({$0}).count)" + case .lesson3: + label_pageNum.text = "已完成:\(viewModel.currentPage.value + 1)/\((data as! ListenNewModel).subjectList.count)" case .lesson4: //两题为一组:需要/2 label_pageNum.text = "已完成:\(viewModel.answerCount.value)/\((data as! ListenNewModel).subjectList.flatMap({$0}).count / 2)" @@ -329,20 +334,10 @@ default:break } + //正确率 + let accracy = Int(Double(viewModel.correctNum) / Double(viewModel.correctNum + viewModel.errorNum) * 100) - //有答题过程 - //完成进度 - var isComplete = false - switch viewModel.listenType.value { - case .lesson1:isComplete = studyScheduleModel?.listen == 100 - case .lesson2:isComplete = studyScheduleModel?.look == 100 - case .lesson3:isComplete = studyScheduleModel?.induction == 100 - case .lesson4:isComplete = studyScheduleModel?.answer == 100 - case .lesson5:isComplete = studyScheduleModel?.pair == 100 - default:isComplete = false - } - - Services.completeLearing(type: viewModel.listenType.value.rawValue, studyTime: viewModel.times, studyIds: ids, isComplete: isComplete).subscribe(onNext: {data in + Services.completeLearing(type: viewModel.listenType.value.rawValue, studyTime: viewModel.times, studyIds: ids, quarter: viewModel.quarter.value!, week: viewModel.week.value!, day: viewModel.day.value!, accracy: accracy).subscribe(onNext: {data in NotificationCenter.default.post(name: Refresh_ListenSchedule_Noti, object: nil) }).disposed(by: disposeBag) @@ -440,7 +435,15 @@ @objc func beforeAction(){ listenFightLine = .before - var beforePage = max(0, viewModel.currentPage.value - 1) + let beforePage = max(0, viewModel.currentPage.value - 1) + switch viewModel.listenType.value { + case .lesson1,.lesson2: + let temp = (beforePage * 4) + 1 + viewModel.answerCount.accept(max(1,temp)) + default:break + } + + pageVC.scroll(toPage: beforePage, animation: true) viewModel.currentPage.accept(beforePage) diff --git a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_2_VC.swift b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_2_VC.swift index 2a23445..2bf4ac3 100644 --- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_2_VC.swift +++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_2_VC.swift @@ -152,6 +152,10 @@ handleView.chooseClouse {[weak self] btn in guard let weakSelf = self else { return } + if weakSelf.playedIndex.count != 3{ + handleView.btn_choose.isSelected = false + alertError(msg: "请听完");return + } handleView.view_choose.alpha = 1 var lessionType:Fight_lessonType = .none if handleView.vioceSoundUrl == weakSelf.listenNewModel.subjectList[weakSelf.page][row].correct{ @@ -290,11 +294,21 @@ } extension HomeListenFight_lesson_2_VC:VoicePlayerDelegate{ - func playing() {} + func playing() { + print("正在播放") + //正在播放中,其他播放按钮先禁止 + for sub in stackView.arrangedSubviews as! [StudyHandleView]{ + sub.btn_pay.isEnabled = false + sub.btn_choose.isEnabled = false + } + + } func playComplete() { //对已经播放过的View,进行刷新 for sub in stackView.arrangedSubviews as! [StudyHandleView]{ + sub.btn_pay.isEnabled = true + sub.btn_choose.isEnabled = true if playedIndex.contains(sub.tag){ sub.resetView() sub.view_choose.alpha = playedIndex.contains(sub.tag) ? 1:0 diff --git a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_3_VC.swift b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_3_VC.swift index 7d0270c..d4b9238 100644 --- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_3_VC.swift +++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_3_VC.swift @@ -38,6 +38,7 @@ private var voicePlayer = VoicePlayer.share() private var playIndex = Set<IndexPath>() //顺序播放 private var isPlayingIndex:IndexPath? //正在播放中 + private var islisten:Bool = false required init(page:Int,listenNewModel:ListenNewModel){ super.init(nibName: nil, bundle: nil) @@ -64,7 +65,6 @@ super.viewDidLoad() navigationItem.titleView = UIView() playIndex.insert(IndexPath(row: 0, section: 0)) -// setAnswerStackView() } func restore(){ @@ -101,63 +101,73 @@ } - private func setAnswerStackView(){ + private func setAnswerStackView(force:Bool = false){ - stackView.removeArrangedSubviews() - var tempImageArray = [String]() - - tempImageArray.append(listenNewModel.subjectList[page][2].img) - tempImageArray.append(listenNewModel.subjectList[page][4].img) - tempImageArray.append(listenNewModel.subjectList[page][5].img) - - view.addSubview(stackView) - stackView.snp.makeConstraints { make in - make.right.equalToSuperview().offset(-82) - make.centerY.equalToSuperview() - make.height.equalTo(52) + for v in stackView.arrangedSubviews{ + v.removeFromSuperview() } - var tempAnswerViews = [Lesson_3_AnswerView]() - for i in 0...2{ - let answerView = Lesson_3_AnswerView.jq_loadNibView() - answerView.alpha = 0 - answerView.btn_choose.addTarget(self, action: #selector(chooseAnswerAction), for: .touchUpInside) - answerView.btn_fullscreen.addTarget(self, action: #selector(fullscreenAction), for: .touchUpInside) - answerView.img_cover.contentMode = .scaleToFill - answerView.btn_choose.tag = 10+i - answerView.btn_fullscreen.tag = 20+i - answerView.imageUrl = tempImageArray[i] - answerView.img_cover.sd_setImage(with: URL(string: tempImageArray[i])) - answerView.snp.makeConstraints { make in - make.width.equalTo(85) + + if isPlayingIndex == IndexPath(row: 2, section: 0) || isPlayingIndex == IndexPath(row: 1, section: 1) || isPlayingIndex == IndexPath(row: 2, section: 1) || !force{ + var tempImageArray = [String]() + + tempImageArray.append(listenNewModel.subjectList[page][2].img) + tempImageArray.append(listenNewModel.subjectList[page][4].img) + tempImageArray.append(listenNewModel.subjectList[page][5].img) + + view.addSubview(stackView) + stackView.snp.makeConstraints { make in + make.right.equalToSuperview().offset(-82) + make.centerY.equalToSuperview() make.height.equalTo(52) } - UIView.animate(withDuration: 0.05 + Double(i)) { - answerView.alpha = 1 + var tempAnswerViews = [Lesson_3_AnswerView]() + for i in 0...2{ + let answerView = Lesson_3_AnswerView.jq_loadNibView() + answerView.alpha = 0 + answerView.btn_choose.addTarget(self, action: #selector(chooseAnswerAction), for: .touchUpInside) + answerView.btn_fullscreen.addTarget(self, action: #selector(fullscreenAction), for: .touchUpInside) + answerView.img_cover.contentMode = .scaleToFill + answerView.btn_choose.tag = 10+i + answerView.btn_fullscreen.tag = 20+i + answerView.imageUrl = tempImageArray[i] + answerView.img_cover.sd_setImage(with: URL(string: tempImageArray[i])) + answerView.snp.makeConstraints { make in + make.width.equalTo(85) + make.height.equalTo(52) + } + + UIView.animate(withDuration: 0.05 + Double(i)) { + answerView.alpha = 1 + } + tempAnswerViews.append(answerView) } - tempAnswerViews.append(answerView) + tempAnswerViews.shuffle() + stackView.addArrangedSubviews(tempAnswerViews) } - tempAnswerViews.shuffle() - stackView.addArrangedSubviews(tempAnswerViews) } @objc private func chooseAnswerAction(btn:UIButton){ + + if !islisten{ + alertError(msg: "请先听题");return + } if isPlayingIndex != nil { alertError(msg: "请先听题");return } - if rootViewModel.correctNum == 0 && !playIndex.contains(IndexPath(row: 2, section: 0)){ + if answterCount == 0 && !playIndex.contains(IndexPath(row: 2, section: 0)){ alertError(msg: "请先听题");return } - if rootViewModel.correctNum == 1 && !playIndex.contains(IndexPath(row: 1, section: 1)){ + if answterCount == 1 && !playIndex.contains(IndexPath(row: 1, section: 1)){ alertError(msg: "请先听题");return } - if rootViewModel.correctNum == 2 && !playIndex.contains(IndexPath(row: 2, section: 1)){ + if answterCount == 2 && !playIndex.contains(IndexPath(row: 2, section: 1)){ alertError(msg: "请先听题");return } @@ -244,7 +254,7 @@ subV?.btn_fullscreen.alpha = 0 }completion: { _ in DispatchQueue.main.asyncAfter(deadline: .now()+1.5) { - self.setAnswerStackView() + self.setAnswerStackView(force: true) } } default:break @@ -283,14 +293,16 @@ weakSelf.isPlayingIndex = index weakSelf.voicePlayer.playerEnd() - weakSelf.voicePlayer.playerAt(url: weakSelf.listenNewModel.subjectList[weakSelf.page][indexPath.row].correct) + + if indexPath.section == 1{ + weakSelf.voicePlayer.playerAt(url: weakSelf.listenNewModel.subjectList[weakSelf.page][indexPath.row + 3].correct) + }else{ + weakSelf.voicePlayer.playerAt(url: weakSelf.listenNewModel.subjectList[weakSelf.page][indexPath.row].correct) + } weakSelf.viewModel.selectIndex.accept(index) //点击答案,就显示 - if (index.section == 0 && index.row == 2) || (index.section == 1 && index.row > 0){ - weakSelf.viewModel.selectIndex.accept(index) - weakSelf.setAnswerStackView() - } + weakSelf.setAnswerStackView() collectionView.reloadItems(at: [index]) } @@ -335,7 +347,7 @@ extension HomeListenFight_lesson_3_VC:VoicePlayerDelegate{ func playComplete() { isPlayingIndex = nil - + islisten = true var nextRow = (viewModel.selectIndex.value?.row ?? 0) + 1 var section = (viewModel.selectIndex.value?.section ?? 0) + 0 @@ -359,6 +371,6 @@ } func playing() { - + islisten = false } } diff --git a/DolphinEnglishLearnStudent/Moudle/Home/Listen/View/ChooseLevelView.swift b/DolphinEnglishLearnStudent/Moudle/Home/Listen/View/ChooseLevelView.swift index a75f462..c4502e3 100644 --- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/View/ChooseLevelView.swift +++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/View/ChooseLevelView.swift @@ -15,6 +15,7 @@ @IBOutlet weak var tackView_level: UIStackView! private var clouseLevel:((Int)->Void)! + private var cancelClouse:(()->Void)! private var level:Int = 0 override func awakeFromNib() { @@ -24,7 +25,7 @@ layoutIfNeeded() } - static func show(clouse:@escaping (Int)->Void){ + static func show(clouse:@escaping (Int)->Void,cancelClouse:@escaping()->Void){ var needLoad:Bool = true for v in sceneDelegate?.window?.subviews ?? []{ @@ -35,6 +36,7 @@ let levelView = ChooseLevelView.jq_loadNibView() levelView.clouseLevel = clouse + levelView.cancelClouse = cancelClouse sceneDelegate?.window?.addSubview(levelView) levelView.frame = sceneDelegate?.window?.frame ?? .zero @@ -59,6 +61,7 @@ self.alpha = 0 } completion: { _ in self.removeFromSuperview() + self.cancelClouse() } } diff --git a/DolphinEnglishLearnStudent/Services/Services.swift b/DolphinEnglishLearnStudent/Services/Services.swift index b804c5e..8f46a4a 100644 --- a/DolphinEnglishLearnStudent/Services/Services.swift +++ b/DolphinEnglishLearnStudent/Services/Services.swift @@ -83,13 +83,16 @@ } /// 完成学习 - class func completeLearing(type:Int,studyTime:Int,studyIds:String,isComplete:Bool)->Observable<BaseResponse<SimpleModel>>{ + class func completeLearing(type:Int,studyTime:Int,studyIds:String,quarter:Int,week:Int,day:Int,accracy:Int)->Observable<BaseResponse<SimpleModel>>{ let params = ParamsAppender.build(url: All_Url) params.interface(url: "/study/base/study/completeLearning") .append(key: "type", value: type) .append(key: "studyTime", value: studyTime) .append(key: "studyIds", value: studyIds) - .append(key: "isComplete", value: isComplete) + .append(key: "week", value: week) + .append(key: "day", value: day) + .append(key: "quarter", value: quarter) + .append(key: "accuracy", value: accracy) return NetworkRequest.request(params: params, method: .post,encoding: JSONEncoding.default, progress: true) } -- Gitblit v1.7.1