From 6f7f02d5c8880ff670b2c694fe61f5af5a6e3e36 Mon Sep 17 00:00:00 2001 From: 无故事王国 <841720330@qq.com> Date: 星期四, 06 六月 2024 18:56:52 +0800 Subject: [PATCH] fix --- DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_1_CCell.swift | 10 DolphinEnglishLearnStudent/Assets.xcassets/Icon/icon_answer.imageset/Contents.json | 22 DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_1_CCell.xib | 17 DolphinEnglishLearnStudent/ViewModel/UserViewModel.swift | 24 DolphinEnglishLearnStudent/Moudle/Home/Listen/TCell/HomeListen_item_TCell.xib | 2 DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenSubVC.swift | 153 ++++- DolphinEnglishLearnStudent/Moudle/Me/TCell/Home_1_TCell.swift | 10 DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFightVC.swift | 103 +++ DolphinEnglishLearnStudent/Assets.xcassets/Icon/icon_answer.imageset/icon_answer@2x.png | 0 DolphinEnglishLearnStudent/Other/UIView/StudyHandleView.swift | 37 + DolphinEnglishLearnStudent/Config/VoicePlayer.swift | 98 +++ DolphinEnglishLearnStudent/Moudle/Home/VC/HomeStudyCompleteVC.swift | 26 + DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_2_VC.swift | 117 +++- DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_5_VC.swift | 148 +++++ DolphinEnglishLearnStudent/Moudle/Home/View/AwardListView.swift | 21 DolphinEnglishLearnStudent/Moudle/Home/HomeVC.swift | 4 DolphinEnglishLearnStudent/Moudle/Home/Listen/View/Lesson_4_AnswerView.xib | 25 DolphinEnglishLearnStudent/Services/Services.swift | 67 ++ DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_4_CCell.swift | 28 + DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_3_CCell.swift | 23 DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenMenuVC.swift | 22 DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_3_CCell.xib | 5 DolphinEnglishLearnStudent/Moudle/Me/TCell/GoodsItemTCell.swift | 22 DolphinEnglishLearnStudent/Moudle/Home/Listen/TCell/HomeListen_item_TCell.swift | 2 DolphinEnglishLearnStudent/Moudle/Me/MeVC.swift | 16 DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenVC.swift | 14 DolphinEnglishLearnStudent/Moudle/Home/Listen/View/Lesson_4_AnswerView.swift | 11 DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_4_VC.swift | 119 +++ DolphinEnglishLearnStudent/Moudle/Me/VC/ExchangeRecordHistoryVC.swift | 6 DolphinEnglishLearnStudent/Services/NetworkRequest.swift | 2 DolphinEnglishLearnStudent/Models/CommonModel.swift | 85 +++ DolphinEnglishLearnStudent/Moudle/Me/VC/StudyVC.swift | 17 DolphinEnglishLearnStudent/Moudle/Home/Listen/View/Lesson_3_AnswerView.swift | 3 DolphinEnglishLearnStudent/Moudle/Home/VC/HomeStudyCompleteVC.xib | 5 DolphinEnglishLearnStudent.xcodeproj/project.pbxproj | 4 DolphinEnglishLearnStudent/Moudle/Home/HomeListenFight_lesson_1_VC.swift | 55 + DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_3_VC.swift | 135 ++++ DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_4_CCell.xib | 6 DolphinEnglishLearnStudent/Assets.xcassets/Icon/icon_answer.imageset/icon_answer.png | 0 DolphinEnglishLearnStudent/Moudle/Me/VC/StudyVC.xib | 4 DolphinEnglishLearnStudent/Moudle/Me/TCell/GoodsItemTCell.xib | 1 41 files changed, 1,264 insertions(+), 205 deletions(-) diff --git a/DolphinEnglishLearnStudent.xcodeproj/project.pbxproj b/DolphinEnglishLearnStudent.xcodeproj/project.pbxproj index 03e9779..08f703d 100644 --- a/DolphinEnglishLearnStudent.xcodeproj/project.pbxproj +++ b/DolphinEnglishLearnStudent.xcodeproj/project.pbxproj @@ -74,6 +74,7 @@ 13649E9C2C00304C001B04E2 /* ListenFight_lesson_1_CCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13649E9A2C00304C001B04E2 /* ListenFight_lesson_1_CCell.swift */; }; 13649E9D2C00304C001B04E2 /* ListenFight_lesson_1_CCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13649E9B2C00304C001B04E2 /* ListenFight_lesson_1_CCell.xib */; }; 137CB4292BFF505800D32862 /* HomeListenFightVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 137CB4282BFF505800D32862 /* HomeListenFightVC.swift */; }; + 13812B9C2C0F02B700905CCE /* VoicePlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13812B9B2C0F02B600905CCE /* VoicePlayer.swift */; }; 138964002BFDF98200AEDCD9 /* StudyVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 138963FE2BFDF98200AEDCD9 /* StudyVC.swift */; }; 138964012BFDF98200AEDCD9 /* StudyVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 138963FF2BFDF98200AEDCD9 /* StudyVC.xib */; }; 13A049FF2C058B1400F1F52E /* HomeListenFight_lesson_5_VC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13A049FE2C058B1400F1F52E /* HomeListenFight_lesson_5_VC.swift */; }; @@ -182,6 +183,7 @@ 13649E9A2C00304C001B04E2 /* ListenFight_lesson_1_CCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListenFight_lesson_1_CCell.swift; sourceTree = "<group>"; }; 13649E9B2C00304C001B04E2 /* ListenFight_lesson_1_CCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ListenFight_lesson_1_CCell.xib; sourceTree = "<group>"; }; 137CB4282BFF505800D32862 /* HomeListenFightVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeListenFightVC.swift; sourceTree = "<group>"; }; + 13812B9B2C0F02B600905CCE /* VoicePlayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VoicePlayer.swift; sourceTree = "<group>"; }; 138963FE2BFDF98200AEDCD9 /* StudyVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StudyVC.swift; sourceTree = "<group>"; }; 138963FF2BFDF98200AEDCD9 /* StudyVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = StudyVC.xib; sourceTree = "<group>"; }; 13A049FE2C058B1400F1F52E /* HomeListenFight_lesson_5_VC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeListenFight_lesson_5_VC.swift; sourceTree = "<group>"; }; @@ -289,6 +291,7 @@ children = ( 1302783E2BFD978900DDCE81 /* Config.swift */, 1302783F2BFD978900DDCE81 /* Enums.swift */, + 13812B9B2C0F02B600905CCE /* VoicePlayer.swift */, ); path = Config; sourceTree = "<group>"; @@ -785,6 +788,7 @@ 13A04A032C05BFDC00F1F52E /* HomeListenGame_2_VC.swift in Sources */, 130278592BFD985E00DDCE81 /* BitrhdayPickerView.swift in Sources */, 133386382C007E91002EE788 /* HomeListenFight_lesson_2_VC.swift in Sources */, + 13812B9C2C0F02B700905CCE /* VoicePlayer.swift in Sources */, 1302787B2BFD9ED600DDCE81 /* MarketContentVC.swift in Sources */, 13649E9C2C00304C001B04E2 /* ListenFight_lesson_1_CCell.swift in Sources */, 13EEB8A02BFF28A7002996FC /* HomeListenVC.swift in Sources */, diff --git a/DolphinEnglishLearnStudent/Assets.xcassets/Icon/icon_answer.imageset/Contents.json b/DolphinEnglishLearnStudent/Assets.xcassets/Icon/icon_answer.imageset/Contents.json new file mode 100644 index 0000000..b1ef1f4 --- /dev/null +++ b/DolphinEnglishLearnStudent/Assets.xcassets/Icon/icon_answer.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "icon_answer.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "icon_answer@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DolphinEnglishLearnStudent/Assets.xcassets/Icon/icon_answer.imageset/icon_answer.png b/DolphinEnglishLearnStudent/Assets.xcassets/Icon/icon_answer.imageset/icon_answer.png new file mode 100644 index 0000000..37901a0 --- /dev/null +++ b/DolphinEnglishLearnStudent/Assets.xcassets/Icon/icon_answer.imageset/icon_answer.png Binary files differ diff --git a/DolphinEnglishLearnStudent/Assets.xcassets/Icon/icon_answer.imageset/icon_answer@2x.png b/DolphinEnglishLearnStudent/Assets.xcassets/Icon/icon_answer.imageset/icon_answer@2x.png new file mode 100644 index 0000000..081e2f0 --- /dev/null +++ b/DolphinEnglishLearnStudent/Assets.xcassets/Icon/icon_answer.imageset/icon_answer@2x.png Binary files differ diff --git a/DolphinEnglishLearnStudent/Config/VoicePlayer.swift b/DolphinEnglishLearnStudent/Config/VoicePlayer.swift new file mode 100644 index 0000000..56bd1a9 --- /dev/null +++ b/DolphinEnglishLearnStudent/Config/VoicePlayer.swift @@ -0,0 +1,98 @@ +// +// VoicePlayer.swift +// DolphinEnglishLearnStudent +// +// Created by 无故事王国 on 2024/6/4. +// + +import Foundation +import AVFAudio + + +/// 音频播放器 +class VoicePlayer:NSObject{ + /// 缓存地址 + private let voiceCacheDirectory = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first!.appendingPathComponent("voices") + private static var _sharedInstance: VoicePlayer? + private var player:AVAudioPlayer? + + //是否正在播放 + var isPlaying:Bool{return player?.isPlaying ?? false} + //播放完成回调 + private var playComplete:(()->Void)? + + + /// 单例 + /// - Returns: <#description#> + class func share() -> VoicePlayer { + guard let instance = _sharedInstance else { + _sharedInstance = VoicePlayer() + try? FileManager.default.createDirectory(at: _sharedInstance!.voiceCacheDirectory, withIntermediateDirectories: true) + return _sharedInstance! + } + return instance + } + + private override init() {} // 私有化init方法 + + ///销毁单例对象 + class func destroy() { + _sharedInstance = nil + } + + /// 播放语音 + /// - Parameter url: Https的语音地址 + func playerAt(url:String?){ + guard let u = url else {return} + if player?.isPlaying ?? false{ + VoicePlayer.share().playComplete?() //先通知完成播放 + player?.stop() + } + + //文件存在:直接播放缓存路径的语音 + let fileURL = voiceCacheDirectory.appendingPathComponent(URL(fileURLWithPath: u).lastPathComponent).droppedScheme() + if FileManager.default.fileExists(atPath: fileURL!.absoluteString){ + player = try? AVAudioPlayer(contentsOf: fileURL!) + player?.delegate = self + player?.play() + }else{ + //文件不存在:执行下载 + let downloadTask = URLSession.shared.downloadTask(with: URL(string: u)!) { tempLocalUrl, response, error in + if let tempLocalUrl = tempLocalUrl, error == nil { + do { + let finalCacheUrl = self.voiceCacheDirectory.appendingPathComponent(URL(fileURLWithPath: u).lastPathComponent) + try FileManager.default.moveItem(at: tempLocalUrl, to: finalCacheUrl) + self.player = try? AVAudioPlayer(contentsOf: finalCacheUrl) + self.player?.delegate = self + self.player?.play() + } catch { + print("视频缓存失败:catch") + } + } else { + print("视频缓存失败:\(error?.localizedDescription ?? "")") + } + } + downloadTask.resume() + } + } + + func playerEnd(){ + player?.stop() + playComplete?() + + } + + func playEnd(course:@escaping ()->Void){ + self.playComplete = course + } +} + +extension VoicePlayer:AVAudioPlayerDelegate{ + func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { + VoicePlayer.share().playComplete?() + } + + func audioPlayerDecodeErrorDidOccur(_ player: AVAudioPlayer, error: (any Error)?) { + print("播放错误") + } +} diff --git a/DolphinEnglishLearnStudent/Models/CommonModel.swift b/DolphinEnglishLearnStudent/Models/CommonModel.swift index b41fefc..f9b7941 100644 --- a/DolphinEnglishLearnStudent/Models/CommonModel.swift +++ b/DolphinEnglishLearnStudent/Models/CommonModel.swift @@ -173,14 +173,17 @@ var expressNumber: String = "" var expressTime: String = "" var goodsId: Int = 0 + var goodsName: String = "" var id: Int = 0 var insertTime: String = "" var integral: Int = 0 var orderNumber: String = "" - var state: Int = 0 + var state: Int = 0 //订单状态1待发货2已发货3已完成 var updateBy: String = "" var updateTime: String = "" var userId: Int = 0 + var goodsType = [String]() + var coverImg:String = "" } struct StudyGamesModel:HandyJSON{ @@ -191,23 +194,23 @@ struct StudyGamesRecordModel:HandyJSON{ var accuracy: Int = 0 - var createBy: String? - var createTime: String? + var createBy: String = "" + var createTime: String = "" var disabled: Bool = false var gameDifficulty: Int = 0 var gameId: Int = 0 - var gameName: String? + var gameName: String = "" var id: Int = 0 - var updateBy: String? - var updateTime: String? + var updateBy: String = "" + var updateTime: String = "" var userId: Int = 0 var useTime: Int = 0 } struct StudyDataRecordModel:HandyJSON{ var answer: Int = 0 - var createBy: String? - var createTime: String? + var createBy: String = "" + var createTime: String = "" var day: Int = 0 var disabled: Bool = false var id: Int = 0 @@ -219,8 +222,8 @@ var surplus: Int = 0 var todayStudy: Int = 0 var totalStudy: Int = 0 - var updateBy: String? - var updateTime: String? + var updateBy: String = "" + var updateTime: String = "" var userId: Int = 0 var week: Int = 0 var weekStudy: Int = 0 @@ -235,3 +238,65 @@ var type = 0 var week = 0 } + +class Listen1Model:HandyJSON{ + var data:Listen1DataModel? + var subjectList = [Listen1SubModel]() + + required init(){} +} +struct Listen1DataModel:HandyJSON{ + var createBy: String = "" + var createTime: String = "" + var day: Int = 0 + var disabled: Bool = false + var id: Int = 0 + var integral: Int = 0 + var isVip: Int = 0 + var studyId: Int = 0 + var subject: String = "" + var updateBy: String = "" + var updateTime: String = "" + var week: Int = 0 +} + +class Listen1SubModel:HandyJSON{ + + required init() {} + + var correct: String = "" + var createBy: String = "" + var createTime: String = "" + var disabled: Bool = false + var english: String = "" + var error: String = "" + var id: Int = 0 + var img: String = "" + var name: String = "" + var state: Int = 0 + var type: String = "" + var updateBy: String = "" + var updateTime: String = "" +} + +struct Listen4Model:HandyJSON{ + var data = [Listen4DataModel]() +} + +struct Listen4DataModel:HandyJSON{ + var answerSubject: Int = 0 + var createBy: String = "" + var createTime: String = "" + var day: Int = 0 + var disabled: Bool = false + var id: Int = 0 + var integral: Int = 0 + var isAnswer: Int = 0 + var isVip: Int = 0 + var studyId: Int = 0 + var subject: Int = 0 + var subjectList = [Listen1SubModel]() + var updateBy: String = "" + var updateTime: String = "" + var week: Int = 0 +} diff --git a/DolphinEnglishLearnStudent/Moudle/Home/HomeListenFight_lesson_1_VC.swift b/DolphinEnglishLearnStudent/Moudle/Home/HomeListenFight_lesson_1_VC.swift index 01c6142..ada1b6b 100644 --- a/DolphinEnglishLearnStudent/Moudle/Home/HomeListenFight_lesson_1_VC.swift +++ b/DolphinEnglishLearnStudent/Moudle/Home/HomeListenFight_lesson_1_VC.swift @@ -18,12 +18,12 @@ class HomeListenFight_lesson_1_VC: BaseVC { private var viewModel = FightAnswerViewModel() + private var listen1Model:Listen1Model! + private var randomElement:Listen1SubModel? + private var page:Int! + var rootViewModel:HomeListenFightViewModel! - private lazy var menuView:StudyHandleView = { - let menu = StudyHandleView.jq_loadNibView() - menu.listenType = .lesson1 - return menu - }() + private var menuView:StudyHandleView = StudyHandleView.jq_loadNibView() private lazy var collectionView:UICollectionView = { let flowLayout = UICollectionViewFlowLayout() @@ -37,9 +37,31 @@ return collection }() + required init(page:Int,listen1Model:Listen1Model){ + super.init(nibName: nil, bundle: nil) + self.page = page + self.listen1Model = listen1Model + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + override func viewDidLoad() { super.viewDidLoad() navigationItem.titleView = UIView() + collectionView.reloadData() + + menuView.listenType = .lesson1 + +// collectionView.isUserInteractionEnabled = false + //制造随机 + randomElement = listen1Model.subjectList.randomElement() + menuView.vioceSoundUrl = randomElement?.correct + + VoicePlayer.share().playEnd {[weak self] in + self?.menuView.reset() + } } override func setUI() { @@ -71,11 +93,16 @@ guard let index = index else { return } //判断选中是否正确逻辑 - if let cell = self?.collectionView.dequeueReusableCell(withReuseIdentifier: "_ListenFight_lesson_1_CCell", for: index) as? ListenFight_lesson_1_CCell{ var answer:Fight_lessonType = .none - answer = .success + if self?.randomElement?.id == self?.listen1Model.subjectList[index.row].id{ + answer = .success + self?.rootViewModel.correctNum += 1 + }else{ + answer = .fail + self?.rootViewModel.errorNum += 1 + } switch answer { case .success: @@ -83,7 +110,8 @@ self?.answerSuccess(cell) case .fail: self?.viewModel.answerType.accept(.fail) - self?.answerFail() +// self?.collectionView.isUserInteractionEnabled = false + self?.answerFail(errorSound: self?.listen1Model.subjectList[index.row].error) default:break } } @@ -93,7 +121,7 @@ //回答正确 private func answerSuccess(_ cell:ListenFight_lesson_1_CCell){ menuView.snp.removeConstraints() - collectionView.isUserInteractionEnabled = false +// collectionView.isUserInteractionEnabled = false let v = cell.view_topHandle.convert(cell.bounds, to: self.view) UIView.animate(withDuration: 0.3) { self.menuView.snp.updateConstraints { make in @@ -107,15 +135,17 @@ self.collectionView.reloadData() DispatchQueue.main.asyncAfter(deadline: .now()+2){ NotificationCenter.default.post(name: NextLession_Noti, object: nil) - self.collectionView.isUserInteractionEnabled = true +// self.collectionView.isUserInteractionEnabled = true self.viewModel.answerType.accept(.none) self.viewModel.selectIndex.accept(nil) + self.rootViewModel.answerItems[self.page] = self.listen1Model } } } - private func answerFail(){ + private func answerFail(errorSound:String?){ self.collectionView.reloadData() + VoicePlayer.share().playerAt(url: errorSound) } } @@ -136,10 +166,11 @@ }else{ cell.setState(state: .none) } + cell.setListen1SubModel(listen1Model.subjectList[indexPath.row]) return cell } func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - return 4 + return min(4,listen1Model.subjectList.count) } } diff --git a/DolphinEnglishLearnStudent/Moudle/Home/HomeVC.swift b/DolphinEnglishLearnStudent/Moudle/Home/HomeVC.swift index 77e0951..6e0ab31 100644 --- a/DolphinEnglishLearnStudent/Moudle/Home/HomeVC.swift +++ b/DolphinEnglishLearnStudent/Moudle/Home/HomeVC.swift @@ -15,6 +15,10 @@ AwardListView.show(items: data.data ?? []) {[weak self] model in let vc = MarketContentVC(goodsId: model.id) self?.push(vc: vc) + }closeClouse: {[weak self] in + let listenMenuVC = HomeListenMenuVC() + listenMenuVC.title = "第一年学习周目选择" + self?.push(vc: listenMenuVC) } }).disposed(by: disposeBag) } diff --git a/DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_1_CCell.swift b/DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_1_CCell.swift index 428604e..a7ca965 100644 --- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_1_CCell.swift +++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_1_CCell.swift @@ -15,12 +15,15 @@ class ListenFight_lesson_1_CCell: UICollectionViewCell { + @IBOutlet weak var label_title: UILabel! @IBOutlet weak var image_state: UIImageView! + @IBOutlet weak var image_cover: UIImageView! @IBOutlet weak var view_topHandle: UIView! override func awakeFromNib() { super.awakeFromNib() image_state.alpha = 0 image_state.transform = .init(scaleX: 0.1, y: 0.1) + label_title.isHidden = true } func setState(state:Fight_lessonType){ @@ -37,10 +40,17 @@ UIView.animate(withDuration: 0.6, delay: 0, usingSpringWithDamping: 0.3, initialSpringVelocity: 0.4, options: .layoutSubviews) { self.image_state.alpha = 1 self.image_state.transform = .init(scaleX: 1, y: 1) + UIView.animate(withDuration: 0.5, delay: 3.0) { + self.image_state.alpha = 0 + } } case .none: image_state.alpha = 0 image_state.transform = .init(scaleX: 0.1, y: 0.1) } } + + func setListen1SubModel(_ model:Listen1SubModel){ + image_cover.sd_setImage(with: URL(string: model.img)) + } } diff --git a/DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_1_CCell.xib b/DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_1_CCell.xib index 8047e93..a5641ef 100644 --- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_1_CCell.xib +++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_1_CCell.xib @@ -19,12 +19,25 @@ <subviews> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="JdK-rh-KJI"> <rect key="frame" x="5" y="5" width="435" height="40"/> + <subviews> + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="rgH-1a-mKt"> + <rect key="frame" x="0.0" y="0.0" width="435" height="40"/> + <color key="backgroundColor" red="0.53725490196078429" green="0.52941176470588236" blue="0.49411764705882355" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> + <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/> + <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> + <nil key="highlightedColor"/> + </label> + </subviews> <color key="backgroundColor" red="0.83137254900000002" green="0.82352941180000006" blue="0.80392156859999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <constraints> <constraint firstAttribute="height" constant="40" id="1mb-ik-h6n"/> + <constraint firstAttribute="trailing" secondItem="rgH-1a-mKt" secondAttribute="trailing" id="Zjf-E9-9in"/> + <constraint firstAttribute="bottom" secondItem="rgH-1a-mKt" secondAttribute="bottom" id="aMm-rB-Ltu"/> + <constraint firstItem="rgH-1a-mKt" firstAttribute="leading" secondItem="JdK-rh-KJI" secondAttribute="leading" id="eZG-zI-A7g"/> + <constraint firstItem="rgH-1a-mKt" firstAttribute="top" secondItem="JdK-rh-KJI" secondAttribute="top" id="pG4-rt-Gkh"/> </constraints> </view> - <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="bdL-d4-7NQ"> + <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="bdL-d4-7NQ"> <rect key="frame" x="5" y="45" width="435" height="329"/> </imageView> <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="kkd-SI-bwq"> @@ -51,7 +64,9 @@ </constraints> <size key="customSize" width="445" height="379"/> <connections> + <outlet property="image_cover" destination="bdL-d4-7NQ" id="r4U-gR-Ehg"/> <outlet property="image_state" destination="kkd-SI-bwq" id="oOC-yo-jjk"/> + <outlet property="label_title" destination="rgH-1a-mKt" id="8rB-l0-3TW"/> <outlet property="view_topHandle" destination="JdK-rh-KJI" id="3e6-NI-AsQ"/> </connections> <point key="canvasLocation" x="232.3170731707317" y="103.47457627118645"/> diff --git a/DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_3_CCell.swift b/DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_3_CCell.swift index 0674fda..89628e9 100644 --- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_3_CCell.swift +++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_3_CCell.swift @@ -12,8 +12,31 @@ @IBOutlet weak var img_cover: UIImageView! @IBOutlet weak var view_container: UIView! + @IBOutlet weak var btn_play: UIButton! + @IBOutlet weak var btn_playing: UIButton! + + private var model:Listen1SubModel! + private var playAtClouse:((IndexPath)->Void)? + var indexPath:IndexPath! + + override func awakeFromNib() { super.awakeFromNib() view_container.jq_addShadows(shadowColor: .black.withAlphaComponent(0.31), corner: 8, radius: 3, offset: CGSize(width: 0, height: 1), opacity: 1) } + + func setModel(_ model:Listen1SubModel,isplaying:Bool){ + self.model = model + self.btn_play.alpha = (isplaying ? 0:1) + } + + func palyVoiceAt(_ clouse:@escaping(IndexPath)->Void){ + self.playAtClouse = clouse + } + + + @IBAction func playAction(_ sender: Any) { + VoicePlayer.share().playerAt(url: model.correct ?? "") + playAtClouse?(indexPath) + } } diff --git a/DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_3_CCell.xib b/DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_3_CCell.xib index 82d42d6..fce015d 100644 --- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_3_CCell.xib +++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_3_CCell.xib @@ -24,6 +24,9 @@ <rect key="frame" x="104" y="10" width="32" height="32"/> <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/> <state key="normal" image="icon_play"/> + <connections> + <action selector="playAction:" destination="gTV-IL-0wX" eventType="touchUpInside" id="IWn-Zu-bCh"/> + </connections> </button> <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="9Dc-Ns-SMP"> <rect key="frame" x="25" y="12.5" width="27" height="27"/> @@ -75,6 +78,8 @@ </constraints> <size key="customSize" width="630" height="554"/> <connections> + <outlet property="btn_play" destination="7yc-PU-RgV" id="b2b-5W-bGC"/> + <outlet property="btn_playing" destination="9Dc-Ns-SMP" id="PsY-Nd-d5z"/> <outlet property="img_cover" destination="n5n-eb-5xI" id="Wk5-s2-MQj"/> <outlet property="view_container" destination="qxz-6s-e5b" id="Ikx-kW-UkZ"/> </connections> diff --git a/DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_4_CCell.swift b/DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_4_CCell.swift index 34434bc..ba4cd13 100644 --- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_4_CCell.swift +++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_4_CCell.swift @@ -13,9 +13,37 @@ @IBOutlet weak var img_cover: UIImageView! @IBOutlet weak var view_container: UIView! @IBOutlet weak var img_state: UIImageView! + @IBOutlet weak var btn_handle: UIButton! + @IBOutlet weak var btn_voice: UIButton! + @IBOutlet weak var btn_play: UIButton! + private var model:Listen1SubModel? + var indexPath:IndexPath! + private var playAtIndexClouse:((IndexPath)->Void)? + + override func awakeFromNib() { super.awakeFromNib() view_container.jq_addShadows(shadowColor: .black.withAlphaComponent(0.31), corner: 8, radius: 3, offset: CGSize(width: 0, height: 1), opacity: 1) } + func setModel(_ m:Listen1SubModel){ + model = m + img_cover.sd_setImage(with: URL(string: m.img)) + } + + func playAtIndex(clouse:@escaping(IndexPath)->Void){ + self.playAtIndexClouse = clouse + + } + + @IBAction func playAction(_ sender: UIButton) { + if let m = model{ + btn_play.isHidden = true + VoicePlayer.share().playerAt(url: m.correct) + playAtIndexClouse?(indexPath) + VoicePlayer.share().playEnd { + self.btn_play.isHidden = false + } + } + } } diff --git a/DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_4_CCell.xib b/DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_4_CCell.xib index 364abcb..fccf83c 100644 --- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_4_CCell.xib +++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_4_CCell.xib @@ -25,6 +25,9 @@ <rect key="frame" x="104" y="10" width="32" height="32"/> <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/> <state key="normal" image="icon_play"/> + <connections> + <action selector="playAction:" destination="gTV-IL-0wX" eventType="touchUpInside" id="FV8-uE-yj8"/> + </connections> </button> <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="kgj-Ss-D90"> <rect key="frame" x="65" y="12.5" width="27" height="27"/> @@ -89,6 +92,9 @@ </constraints> <size key="customSize" width="597" height="510"/> <connections> + <outlet property="btn_handle" destination="ZuK-r9-26C" id="Ztw-HE-Srj"/> + <outlet property="btn_play" destination="LLy-9v-eQJ" id="tTl-C3-lNJ"/> + <outlet property="btn_voice" destination="kgj-Ss-D90" id="sHd-pN-FVy"/> <outlet property="img_cover" destination="XW5-ds-CXG" id="yuo-h2-TG8"/> <outlet property="img_state" destination="eyJ-Qy-E0w" id="6YM-Di-5yt"/> <outlet property="view_container" destination="OJ6-0b-fVC" id="4Y2-jo-yTH"/> diff --git a/DolphinEnglishLearnStudent/Moudle/Home/Listen/TCell/HomeListen_item_TCell.swift b/DolphinEnglishLearnStudent/Moudle/Home/Listen/TCell/HomeListen_item_TCell.swift index 0df1d5b..3dee7ca 100644 --- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/TCell/HomeListen_item_TCell.swift +++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/TCell/HomeListen_item_TCell.swift @@ -8,6 +8,8 @@ import UIKit class HomeListen_item_TCell: UITableViewCell { + @IBOutlet weak var view_bg1: UIView! + @IBOutlet weak var view_bg2: UIView! @IBOutlet weak var label_title: UILabel! override func awakeFromNib() { diff --git a/DolphinEnglishLearnStudent/Moudle/Home/Listen/TCell/HomeListen_item_TCell.xib b/DolphinEnglishLearnStudent/Moudle/Home/Listen/TCell/HomeListen_item_TCell.xib index b3030e3..72ff327 100644 --- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/TCell/HomeListen_item_TCell.xib +++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/TCell/HomeListen_item_TCell.xib @@ -140,6 +140,8 @@ </tableViewCellContentView> <connections> <outlet property="label_title" destination="28J-ZC-IiE" id="kDk-K7-10L"/> + <outlet property="view_bg1" destination="9XB-yf-tzC" id="u8S-3q-p3Y"/> + <outlet property="view_bg2" destination="pk7-Y8-Mtb" id="Dyb-wb-cSg"/> </connections> <point key="canvasLocation" x="282.80487804878049" y="47.033898305084747"/> </tableViewCell> diff --git a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFightVC.swift b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFightVC.swift index 1b83400..f18f61c 100644 --- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFightVC.swift +++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFightVC.swift @@ -11,16 +11,30 @@ let NextLession_Noti = Notification.Name.init("NextLession_Noti") -enum ListenType{ - case lesson1 //自主学习-听音选图 - case lesson2 //自主学习-看图选音 - case lesson3 //自主学习-归纳排除 - case lesson4 //自主学习-有问有答 - case lesson5 //自主学习-音图相配 - case game1 //游戏类型-超级听力 - case game2 //游戏类型-超级记忆 - case story1 //故事类型-自主故事1-看图配音 - case story2 //故事类型-自主故事2-框架记忆 +enum ListenType:Int{ + case lesson1 = 1 //自主学习-听音选图 + case lesson2 = 2 //自主学习-看图选音 + case lesson3 = 3 //自主学习-归纳排除 + case lesson4 = 4 //自主学习-有问有答 + case lesson5 = 5 //自主学习-音图相配 + case game1 = 6 //游戏类型-超级听力 + case game2 = 7 //游戏类型-超级记忆 + case story1 = 8 //故事类型-自主故事1-看图配音 + case story2 = 9 //故事类型-自主故事2-框架记忆 + + var rawTitle:String{ + switch self { + case .lesson1:return "自主学习1-听音选图" + case .lesson2:return "自主学习2-看图选音" + case .lesson3:return "自主学习3-归纳排除" + case .lesson4:return "自主学习4-有问有答" + case .lesson5:return "自主学习5-音图相配" + case .game1:return "游戏类型1-超级听力" + case .game2:return "游戏类型2-超级记忆" + case .story1:return "自主故事1-看图配音" + case .story2:return "自主故事2-框架记忆" + } + } } class HomeListenFightViewModel{ @@ -29,11 +43,28 @@ var currentPage = BehaviorRelay<Int>(value: 0) var maxPage = BehaviorRelay<Int>(value: 5) var listenType = BehaviorRelay<ListenType>(value:.lesson1) + var times:Int = 0 + + //回答错误数量 + var correctNum:Int = 0{ + didSet{ + print("回答正确:\(correctNum)") + } + } + + var errorNum:Int = 0{ + didSet{ + print("回答错误:\(correctNum)") + } + } + + //所有回答的 + var answerItems = Dictionary<Int,Any>() //{page:0,data:String,currectAt:0} } class HomeListenFightVC: BaseVC { - private var viewModel = HomeListenFightViewModel() + var data:Any? private lazy var label_pageNum:UILabel = { let label = UILabel() @@ -81,8 +112,12 @@ private lazy var pageVC:FFPageViewController = { let vc = FFPageViewController() vc.scrollview.isScrollEnabled = false + vc.prePages = UInt(viewModel.maxPage.value) / 2 + vc.maxPages = UInt(viewModel.maxPage.value) + 1 return vc }() + + private var timer:Timer! init(listenType:ListenType) { @@ -112,6 +147,12 @@ label_pageNum.isHidden = true } + timer = Timer(fire: .distantPast, interval: 1.0, repeats: true, block: {[weak self] _ in + self?.viewModel.times += 1 + }) + + timer.fire() + RunLoop.current.add(timer, forMode: .common) } override func setUI() { @@ -172,8 +213,23 @@ //完成 if nextPage >= weakSelf.viewModel.maxPage.value{ - let vc = HomeStudyCompleteVC() - vc.title = "自主学习1-听音选图" + + var toalIntegral:Int = 0 + var ids = [Int]() + for v in weakSelf.viewModel.answerItems.values{ + if let v = v as? Listen1Model{ + toalIntegral += v.data?.integral ?? 0 + ids.append(v.data?.studyId ?? 0) + } + } + + Services.completeLearing(type: weakSelf.viewModel.listenType.value.rawValue, studyTime: weakSelf.viewModel.times, studyIds: ids, isComplete: false).subscribe(onNext: {data in + + }).disposed(by: weakSelf.disposeBag) + + weakSelf.timer.invalidate() + let vc = HomeStudyCompleteVC(correctNum: weakSelf.viewModel.correctNum, errorNum: weakSelf.viewModel.errorNum, totalCoin: toalIntegral) + vc.title = weakSelf.viewModel.listenType.value.rawTitle weakSelf.push(vc: vc) return } @@ -189,6 +245,10 @@ }).disposed(by: disposeBag) } + deinit{ + timer.invalidate() + } + @objc func quitAction(){ CommonAlertView.show(content: "未完成全部答题,确认退出吗?") { self.navigationController?.popViewController(animated: true) @@ -196,7 +256,7 @@ } @objc func beforeAction(){ - let beforePage = max(1, viewModel.currentPage.value - 1) + let beforePage = max(0, viewModel.currentPage.value - 1) pageVC.scroll(toPage: beforePage, animation: true) viewModel.currentPage.accept(beforePage) } @@ -214,27 +274,32 @@ func pageViewController(_ pageViewConteoller: FFPageViewController, controllerForPage page: Int) -> UIViewController { if viewModel.listenType.value == .lesson1{ - let vc = HomeListenFight_lesson_1_VC() + let vc = HomeListenFight_lesson_1_VC(page: page,listen1Model:data as! Listen1Model) + vc.rootViewModel = viewModel return vc } if viewModel.listenType.value == .lesson2{ - let vc = HomeListenFight_lesson_2_VC() + let vc = HomeListenFight_lesson_2_VC(page: page,listen1Model:data as! Listen1Model) + vc.rootViewModel = viewModel return vc } if viewModel.listenType.value == .lesson3{ - let vc = HomeListenFight_lesson_3_VC() + let vc = HomeListenFight_lesson_3_VC(page: page, listen1Model: data as! Listen1Model) + vc.rootViewModel = viewModel return vc } if viewModel.listenType.value == .lesson4{ - let vc = HomeListenFight_lesson_4_VC() + let vc = HomeListenFight_lesson_4_VC(page: page, listen4Model: data as! Listen4Model) + vc.rootViewModel = viewModel return vc } if viewModel.listenType.value == .lesson5{ - let vc = HomeListenFight_lesson_5_VC() + let vc = HomeListenFight_lesson_5_VC(page: page, listen1Model: data as! Listen1Model) + vc.rootViewModel = viewModel return vc } 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 9af90d0..572835a 100644 --- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_2_VC.swift +++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_2_VC.swift @@ -12,6 +12,11 @@ private var viewModel = FightAnswerViewModel() + private var listen1Model:Listen1Model! + private var randomElement:Listen1SubModel? + private var page:Int! + var rootViewModel:HomeListenFightViewModel! + private lazy var stackView:UIStackView = { let stackView = UIStackView() stackView.spacing = 78 @@ -31,14 +36,27 @@ return collection }() + + required init(page:Int,listen1Model:Listen1Model){ + super.init(nibName: nil, bundle: nil) + self.page = page + self.listen1Model = listen1Model + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + override func viewDidLoad() { super.viewDidLoad() navigationItem.titleView = UIView() - viewModel.selectIndex.accept(IndexPath(row: 0, section: 0)) + } override func setUI() { super.setUI() + + viewModel.selectIndex.accept(IndexPath(row: 0, section: 0)) collectionView.delegate = self collectionView.dataSource = self @@ -59,18 +77,52 @@ make.width.greaterThanOrEqualTo(100) } + addStackView() + VoicePlayer.share().playEnd {[weak self] in + + } + + } + + private func addStackView(){ + stackView.removeArrangedSubviews() + + var tempViews = [StudyHandleView]() for index in 0...2{ let handleView = StudyHandleView.jq_loadNibView() handleView.listenType = .lesson2 handleView.btn_choose.tag = 10 + index + + let row = viewModel.selectIndex.value!.row + let model = listen1Model.subjectList[row] + + if index == 0{ + handleView.vioceSoundUrl = model.correct + } + + if index == 1{ + handleView.vioceSoundUrl = model.error.components(separatedBy: ",").first + } + + if index == 2{ + handleView.vioceSoundUrl = model.error.components(separatedBy: ",").last + } + handleView.chooseClouse {[weak self] btn in + guard let weakSelf = self else { return } + let row = weakSelf.viewModel.selectIndex.value!.row var lessionType:Fight_lessonType = .none - lessionType = .success + if handleView.vioceSoundUrl == weakSelf.listen1Model.subjectList[row].correct{ + lessionType = .success + }else{ + lessionType = .fail + } switch lessionType { case .success: + weakSelf.rootViewModel.correctNum += 1 handleView.btn_choose.isEnabled = false handleView.btn_state.setImage(UIImage(named: "icon_success_small"), for: .normal) UIView.animate(withDuration: 0.5) { @@ -82,6 +134,7 @@ self?.answerSuccess(cell,index: index) } case .fail: + weakSelf.rootViewModel.errorNum += 1 handleView.btn_state.setImage(UIImage(named: "icon_waring_small"), for: .normal) UIView.animate(withDuration: 0.5) { handleView.btn_state.alpha = 1 @@ -97,9 +150,11 @@ make.height.equalTo(52) make.width.greaterThanOrEqualTo(159) } - stackView.addArrangedSubview(handleView) + tempViews.append(handleView) } + tempViews.shuffle() //乱序 + stackView.addArrangedSubviews(tempViews) } private func answerSuccess(_ cell:ListenFight_lesson_1_CCell,index:Int){ @@ -135,43 +190,40 @@ self.view.layoutIfNeeded() }completion: { _ in self.resetStackView() + } } private func resetStackView(){ - for v in stackView.arrangedSubviews as! [StudyHandleView]{ - v.view_choose.alpha = 0 - v.btn_choose.isEnabled = true - v.btn_choose.isSelected = false - v.btn_state.setImage(nil, for: .normal) - } let newRow = viewModel.selectIndex.value!.row+1 viewModel.selectIndex.accept(IndexPath(row: newRow, section: 0)) + collectionView.reloadData() if newRow == 4{ - NotificationCenter.default.post(name: NextLession_Noti, object: nil) + rootViewModel.answerItems[page] = listen1Model + NotificationCenter.default.post(name: NextLession_Noti, object: nil);return } + addStackView() } override func setRx() { - viewModel.selectIndex.subscribe(onNext: {[weak self] index in - - guard let index = index else { return } - - //判断选中是否正确逻辑 - if let cell = self?.collectionView.dequeueReusableCell(withReuseIdentifier: "_ListenFight_lesson_1_CCell", for: index) as? ListenFight_lesson_1_CCell{ - var answerType:Fight_lessonType = .none - answerType = .success - - switch answerType { - case .success: - self?.viewModel.answerType.accept(.success) - case .fail: - self?.viewModel.answerType.accept(.fail) - default:break - } - } - }).disposed(by: disposeBag) +// viewModel.selectIndex.subscribe(onNext: {[weak self] index in +// guard let index = index else { return } +// //判断选中是否正确逻辑 +// if self?.collectionView.dequeueReusableCell(withReuseIdentifier: "_ListenFight_lesson_1_CCell", for: index) is ListenFight_lesson_1_CCell{ +// var answerType:Fight_lessonType = .none +// answerType = .success +// switch answerType { +// case .success: +// self?.viewModel.answerType.accept(.success) +// self?.rootViewModel.correctNum += 1 +// case .fail: +// self?.viewModel.answerType.accept(.fail) +// self?.rootViewModel.errorNum += 1 +// default:break +// } +// } +// }).disposed(by: disposeBag) } } @@ -186,10 +238,17 @@ let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_ListenFight_lesson_1_CCell", for: indexPath) as! ListenFight_lesson_1_CCell cell.jq_addShadows(shadowColor: .black.withAlphaComponent(0.31), corner: 5, radius: 5, offset: CGSize(width: 0, height: 1), opacity: 1) cell.backgroundColor = .white + if viewModel.selectIndex.value?.row == indexPath.row{ + cell.label_title.isHidden = false + }else{ + cell.label_title.isHidden = true + } + cell.setListen1SubModel(listen1Model.subjectList[indexPath.row]) + cell.label_title.text = listen1Model.subjectList[indexPath.row].name return cell } func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - return 4 + return min(4,listen1Model.subjectList.count) } } 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 eae7dcf..65fa193 100644 --- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_3_VC.swift +++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_3_VC.swift @@ -31,10 +31,37 @@ return sta }() + private var listen1Model:Listen1Model! + private var page:Int! + private var answterCount:Int = 0 //回答计数,用于确定角标 + var rootViewModel:HomeListenFightViewModel! + + required init(page:Int,listen1Model:Listen1Model){ + super.init(nibName: nil, bundle: nil) + self.page = page + self.listen1Model = listen1Model + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func viewDidLoad() { super.viewDidLoad() navigationItem.titleView = UIView() - viewModel.selectIndex.accept(IndexPath(row: 0, section: 0)) +// viewModel.selectIndex.accept(IndexPath(row: 0, section: 0)) + + setAnswerStackView() + + VoicePlayer.share().playEnd { [weak self] in + guard let weakSelf = self else { return } + if weakSelf.viewModel.selectIndex.value != nil{ + weakSelf.collectionView.reloadItems(at: [weakSelf.viewModel.selectIndex.value!]) + weakSelf.viewModel.selectIndex.accept(nil) + } + weakSelf.collectionView.reloadData() + } } override func setUI() { @@ -83,9 +110,14 @@ private func setAnswerStackView(){ - for subView in stackView.arrangedSubviews{ - subView.removeFromSuperview() - } + stackView.removeArrangedSubviews() + + var tempImageArray = [String]() + + tempImageArray.append(listen1Model.subjectList[2].img ?? "") + tempImageArray.append(listen1Model.subjectList[4].img ?? "") + tempImageArray.append(listen1Model.subjectList[5].img ?? "") +// tempImageArray.shuffle() view.addSubview(stackView) stackView.snp.makeConstraints { make in @@ -98,8 +130,11 @@ 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) @@ -114,6 +149,9 @@ } @objc private func chooseAnswerAction(btn:UIButton){ + + if viewModel.selectIndex.value == nil{alertError(msg: "请先听题");return} + let index = btn.tag - 10 var subV:Lesson_3_AnswerView? @@ -123,36 +161,70 @@ } var answerType:Fight_lessonType = .none - answerType = .success + + var valueIndex:Int! //图片的角标 + if viewModel.selectIndex.value?.section == 0{ + valueIndex = viewModel.selectIndex.value!.row + } + if viewModel.selectIndex.value?.section == 1{ + valueIndex = viewModel.selectIndex.value!.row + 3 + } + + if subV?.imageUrl == listen1Model.subjectList[valueIndex].img{ + answerType = .success + }else{ + answerType = .fail + } switch answerType { case .success: + rootViewModel.correctNum += 1 viewModel.answerType.accept(.success) - let copyViewFrame = subV?.convert(subV!.bounds, to: self.view) - let copyView = subV?.copyView() copyView?.frame = copyViewFrame! - copyView?.backgroundColor = .red + copyView?.img_cover.image = subV?.img_cover.image + copyView?.img_cover.contentMode = .scaleToFill self.view.addSubview(copyView!) copyView?.layoutIfNeeded() - if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_ListenFight_lesson_3_CCell", for: viewModel.selectIndex.value!) as? ListenFight_lesson_3_CCell{ - cell.layoutIfNeeded() + var ansterIndePath:IndexPath? + if viewModel.selectIndex.value?.section == 0{ + ansterIndePath = IndexPath(row: 2, section: 0) + } + + if viewModel.selectIndex.value?.section == 1 && (viewModel.selectIndex.value?.row == 0 || viewModel.selectIndex.value?.row == 1){ + ansterIndePath = IndexPath(row: 1, section: 1) + } + + if viewModel.selectIndex.value?.section == 1 && viewModel.selectIndex.value?.row == 2{ + ansterIndePath = IndexPath(row: 2, section: 1) + } + + guard ansterIndePath != nil else {return} + + if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_ListenFight_lesson_3_CCell", for: ansterIndePath!) as? ListenFight_lesson_3_CCell{ var newFrame = cell.img_cover.convert(cell.img_cover.bounds, to: self.view) - copyView?.img_cover.image = cell.img_cover.image - newFrame.origin.x += 97 - newFrame.origin.y += (JQ_NavBarHeight - 15) + newFrame.origin.x += 0 + newFrame.origin.y += 0 UIView.animate(withDuration: 0.4) { copyView?.frame = newFrame } completion: { _ in - for subView in self.stackView.arrangedSubviews{ - subView.removeFromSuperview() + self.answterCount += 1 + if self.answterCount == 3{ + self.rootViewModel.answerItems[self.page] = self.listen1Model + NotificationCenter.default.post(name: NextLession_Noti, object: nil);return + } + + DispatchQueue.main.asyncAfter(deadline: .now()+1.5) { + self.setAnswerStackView() + self.viewModel.selectIndex.accept(nil) } } } case .fail: + rootViewModel.errorNum += 1 viewModel.answerType.accept(.fail) UIView.animate(withDuration: 0.4) { subV?.img_state.alpha = 1 @@ -173,8 +245,7 @@ extension HomeListenFight_lesson_3_VC:UICollectionViewDelegate{ func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { - viewModel.selectIndex.accept(indexPath) - setAnswerStackView() + } } @@ -191,7 +262,37 @@ func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_ListenFight_lesson_3_CCell", for: indexPath) as! ListenFight_lesson_3_CCell cell.backgroundColor = .clear + cell.indexPath = indexPath cell.contentView.backgroundColor = .clear + cell.palyVoiceAt {[weak self] index in + self?.viewModel.selectIndex.accept(index) + if (index.section == 0 && index.row == 2) || (index.section == 1 && index.row > 0){ + self?.viewModel.selectIndex.accept(index) + self?.setAnswerStackView() + } + + collectionView.reloadItems(at: [index]) + } + + if indexPath.section == 0{ + let model = listen1Model.subjectList[indexPath.row] + if indexPath.row != 2{ + cell.img_cover.sd_setImage(with: URL(string: model.img)) + }else{ + cell.img_cover.image = nil + } + cell.setModel(model,isplaying: viewModel.selectIndex.value == indexPath) + } + + if indexPath.section == 1{ + let model = listen1Model.subjectList[indexPath.row + 3] + if indexPath.row == 0{ + cell.img_cover.sd_setImage(with: URL(string: model.img)) + }else{ + cell.img_cover.image = nil + } + cell.setModel(model,isplaying: viewModel.selectIndex.value == indexPath) + } return cell } diff --git a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_4_VC.swift b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_4_VC.swift index 1751aa2..3f3a94d 100644 --- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_4_VC.swift +++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_4_VC.swift @@ -11,6 +11,13 @@ private var viewModel = FightAnswerViewModel() + private var listen4Model:Listen4Model! + private var page:Int! + var rootViewModel:HomeListenFightViewModel! + + private var answerIndex:IndexPath? //答案的Index + private var answerCount:Int = 0 //回答计数 + private lazy var stackView:UIStackView = { let sta = UIStackView() sta.spacing = 41 @@ -32,10 +39,22 @@ return collection }() + required init(page:Int,listen4Model:Listen4Model){ + super.init(nibName: nil, bundle: nil) + self.page = page + self.listen4Model = listen4Model + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } override func viewDidLoad() { super.viewDidLoad() + VoicePlayer.share().playEnd { + print("播放完成") + } } override func setUI() { @@ -54,12 +73,13 @@ } } - private func setAnswerStackView(){ - for subView in stackView.arrangedSubviews{ - subView.removeFromSuperview() + guard viewModel.selectIndex.value != nil else{ + alertError(msg: "请先听题");return } + + stackView.removeArrangedSubviews() if !view.subviews.contains(stackView){ view.addSubview(stackView) @@ -69,9 +89,24 @@ } } + + let answerId = listen4Model.data[viewModel.selectIndex.value!.section].answerSubject + var tempVoiceArray = [String]() + for v in listen4Model.data[viewModel.selectIndex.value!.section].subjectList{ + 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.voiceUrl = tempVoiceArray[i] answerView.btn_choose.addTarget(self, action: #selector(answerAction), for: .touchUpInside) answerView.alpha = 0 answerView.snp.makeConstraints { make in @@ -97,9 +132,25 @@ } } + var answerModel:Listen1SubModel? + for (index,v) in (listen4Model.data[viewModel.selectIndex.value!.section].subjectList).enumerated(){ + if v.id == listen4Model.data[viewModel.selectIndex.value!.section].answerSubject{ + answerModel = v + }else{ + answerIndex = IndexPath(row: index, section: viewModel.selectIndex.value!.section) + } + } var answerType:Fight_lessonType = .none - answerType = .success + if tempSubV?.voiceUrl == answerModel?.correct{ + answerType = .success + answerCount += 1 + rootViewModel.correctNum += 1 + }else{ + answerType = .fail + rootViewModel.errorNum += 1 + } + VoicePlayer.share().playerEnd() switch answerType { case .success: @@ -112,9 +163,8 @@ self.view.addSubview(copyView) self.view.layoutIfNeeded() - //获取Cell的顶部试图 - if let cell = self.collectionView.dequeueReusableCell(withReuseIdentifier: "_ListenFight_lesson_4_CCell", for: self.viewModel.selectIndex.value!) as? ListenFight_lesson_4_CCell{ + 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 @@ -123,7 +173,16 @@ UIView.animate(withDuration: 0.4) { copyView.frame = CGRect(origin: newRect1.origin, size: CGSize(width: 152, height: 52)) } completion: { _ in - self.setAnswerStackView() + self.viewModel.selectIndex.accept(nil) + self.stackView.removeArrangedSubviews() + self.stackView.layoutIfNeeded() + + //回答完成,下一答题 + if self.answerCount == 2{ + self.rootViewModel.answerItems[self.page] = self.listen4Model + VoicePlayer.share().playerEnd() + NotificationCenter.default.post(name: NextLession_Noti, object: nil);return + } } } } @@ -134,7 +193,7 @@ tempSubV?.img_state.alpha = 1 }completion: { _ in DispatchQueue.main.asyncAfter(deadline: .now()+3) { - self.setAnswerStackView() +// self.setAnswerStackView() } } case .none: @@ -145,18 +204,7 @@ extension HomeListenFight_lesson_4_VC:UICollectionViewDelegate{ func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { - viewModel.selectIndex.accept(indexPath) - - 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() - } - self.setAnswerStackView() +// viewModel.selectIndex.accept(indexPath) } } @@ -171,8 +219,25 @@ 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() + } + } - if indexPath == viewModel.selectIndex.value{ + let m = listen4Model.data[indexPath.section].subjectList[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) @@ -181,6 +246,14 @@ cell.img_state.alpha = 0 cell.img_state.transform = .init(scaleX: 0.1, y: 0.1) } + //问题 + if listen4Model.data[indexPath.section].subject == m.id{ + cell.btn_handle.setImage(UIImage(named: "icon_question"), for: .normal) + cell.view_handle.isHidden = true + }else{ + cell.view_handle.isHidden = false + } + cell.setModel(m) return cell } @@ -191,11 +264,11 @@ } func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - return 2 + return listen4Model.data[section].subjectList.count } func numberOfSections(in collectionView: UICollectionView) -> Int { - return 2 + return listen4Model.data.count } } diff --git a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_5_VC.swift b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_5_VC.swift index e2a941b..f4aa445 100644 --- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_5_VC.swift +++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_5_VC.swift @@ -10,11 +10,17 @@ class HomeListenFight_lesson_5_VC: BaseVC { private var viewModel = FightAnswerViewModel() + private var listen1Model:Listen1Model! + private var page:Int! + private var answterCount:Int = 0 //回答计数,用于确定角标 + private var playVoiceAt:Int? //播放声音的View + private var playVoiceRealAt:Int? //播放声音的View -被乱序后,真实Index + var rootViewModel:HomeListenFightViewModel! private lazy var collectionView:UICollectionView = { let flowLayout = UICollectionViewFlowLayout() let w = (JQ_ScreenW - 189 * 2 - 18) / 2.0 - flowLayout.itemSize = CGSize(width: w, height: w * 0.75) + flowLayout.itemSize = CGSize(width: w, height: w * 0.70) flowLayout.minimumInteritemSpacing = 15 flowLayout.minimumLineSpacing = 15 flowLayout.scrollDirection = .vertical @@ -32,25 +38,34 @@ return sta }() + private lazy var label_hint:UILabel = { + let label = UILabel() + label.font = .systemFont(ofSize: 18, weight: .medium) + label.textColor = .black + label.text = "语音对应内容" + label.textAlignment = .center + return label + }() + + required init(page:Int,listen1Model:Listen1Model){ + super.init(nibName: nil, bundle: nil) + self.page = page + self.listen1Model = listen1Model + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func viewDidLoad() { super.viewDidLoad() + collectionView.reloadData() } override func setUI() { super.setUI() - - 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(89) - make.left.equalTo(189) - make.width.equalTo(JQ_ScreenW - 189 * 2) - make.bottom.equalToSuperview() - } view.addSubview(stackView) stackView.snp.makeConstraints { make in @@ -59,7 +74,36 @@ make.height.equalTo(52) } + view.addSubview(label_hint) + label_hint.snp.makeConstraints { make in + make.left.right.equalToSuperview() + make.top.equalTo(stackView.snp.bottom).offset(6) + make.height.equalTo(0) + } + + collectionView.delegate = self + collectionView.dataSource = self + collectionView.showsVerticalScrollIndicator = false + collectionView.backgroundColor = .clear + view.addSubview(collectionView) + collectionView.snp.makeConstraints { make in + make.top.equalTo(self.label_hint.snp.bottom).offset(11) + make.left.equalTo(189) + make.width.equalTo(JQ_ScreenW - 189 * 2) + make.bottom.equalToSuperview() + } + + showHintText(false) + setAnswerStackView() + } + + override func setRx() { +// viewModel.selectIndex.subscribe(onNext: {indexPath in +// if let index = indexPath{ +// +// } +// }).disposed(by: disposeBag) } private func setAnswerStackView(){ @@ -76,9 +120,19 @@ } } - for i in 0...3{ + var tempArray = [StudyHandleView]() + for (i,value) in listen1Model.subjectList.enumerated(){ let answerView = StudyHandleView.jq_loadNibView() + answerView.listenType = .lesson5 answerView.view_choose.isHidden = true + answerView.tag = 1000+i + answerView.playAt {[weak self] index in + print("--->\(index)--\(answerView.frame.origin.x / 248)") + self?.playVoiceRealAt = Int(answerView.frame.origin.x) / 248 + self?.playVoiceAt = index - 1000 + self?.showHintText(true) + } + answerView.vioceSoundUrl = value.correct answerView.snp.makeConstraints { make in make.width.equalTo(159) make.height.equalTo(52) @@ -87,23 +141,62 @@ UIView.animate(withDuration: 0.05 + Double(i)) { answerView.alpha = 1 } + tempArray.append(answerView) + } + tempArray.shuffle() + stackView.addArrangedSubviews(tempArray) + } - stackView.insertArrangedSubview(answerView, at: 0) + private func showHintText(_ state:Bool){ + if let at = playVoiceAt{ + label_hint.text = listen1Model.subjectList[at].name + UIView.animate(withDuration: 0.5) { + if state{ + self.label_hint.snp.remakeConstraints { make in + make.left.right.equalToSuperview() + make.top.equalTo(self.stackView.snp.bottom).offset(6) + make.height.equalTo(25) + } + }else{ + self.label_hint.snp.remakeConstraints { make in + make.left.right.equalToSuperview() + make.top.equalTo(self.stackView.snp.bottom).offset(6) + make.height.equalTo(0) + } + } + self.view.layoutIfNeeded() + } } } } extension HomeListenFight_lesson_5_VC:UICollectionViewDelegate{ func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + + if playVoiceAt == nil{ + alertError(msg: "请先听题");return + } + viewModel.selectIndex.accept(indexPath) - var answerType:Fight_lessonType = .none - answerType = .success + let answer = listen1Model.subjectList[playVoiceAt!] + let selectAnswer = listen1Model.subjectList[indexPath.row] - let tempSubV = stackView.arrangedSubviews[indexPath.row] as! StudyHandleView + var answerType:Fight_lessonType = .none + + if answer.id == selectAnswer.id{ + answerType = .success + }else{ + answerType = .fail + } + + let tempSubV = stackView.arrangedSubviews[self.playVoiceRealAt!] as! StudyHandleView switch answerType { case .success: + answterCount += 1 + rootViewModel.correctNum += 1 + viewModel.answerType.accept(.success) DispatchQueue.main.asyncAfter(deadline: .now()+0.4) { let copyView = tempSubV.copyView() copyView.view_choose.isHidden = true @@ -116,21 +209,30 @@ //获取Cell的顶部试图 let flowLayout = self.collectionView.collectionViewLayout as! UICollectionViewFlowLayout - if let cell = self.collectionView.dequeueReusableCell(withReuseIdentifier: "_ListenFight_lesson_1_CCell", for: self.viewModel.selectIndex.value!) as? ListenFight_lesson_1_CCell{ + if let cell = self.collectionView.dequeueReusableCell(withReuseIdentifier: "_ListenFight_lesson_1_CCell", for: indexPath) as? ListenFight_lesson_1_CCell{ var newRect1 = cell.convert(cell.bounds, to: self.collectionView) newRect1.origin.x += (collectionView.frame.origin.x + 5) - newRect1.origin.y += 94 + newRect1.origin.y += 94 + 25 UIView.animateKeyframes(withDuration: 0.4, delay: 0,options: .calculationModeLinear) { copyView.frame = CGRect(origin: newRect1.origin, size: CGSize(width: flowLayout.itemSize.width - 10 , height: 40)) }completion: { _ in + self.playVoiceRealAt = nil + self.playVoiceAt = nil + if self.answterCount == 4{ + self.rootViewModel.answerItems[self.page] = self.listen1Model + VoicePlayer.share().playerEnd() + NotificationCenter.default.post(name: NextLession_Noti, object: nil) + } } } } case .fail: + viewModel.answerType.accept(.fail) + rootViewModel.errorNum += 1 collectionView.reloadData() case .none: break @@ -146,13 +248,15 @@ extension HomeListenFight_lesson_5_VC:UICollectionViewDataSource{ func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let model = listen1Model.subjectList[indexPath.row] let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_ListenFight_lesson_1_CCell", for: indexPath) as! ListenFight_lesson_1_CCell cell.jq_addShadows(shadowColor: .black.withAlphaComponent(0.31), corner: 8, radius: 3, offset: CGSize(width: 0, height: 1), opacity: 1) if viewModel.selectIndex.value == indexPath{ - cell.setState(state: .success) + cell.setState(state: viewModel.answerType.value) }else{ cell.setState(state: .none) } + cell.setListen1SubModel(model) return cell } @@ -163,7 +267,7 @@ } func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - return 4 + return listen1Model.subjectList.count } func numberOfSections(in collectionView: UICollectionView) -> Int { diff --git a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenMenuVC.swift b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenMenuVC.swift index 366d310..93f03ff 100644 --- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenMenuVC.swift +++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenMenuVC.swift @@ -26,7 +26,7 @@ private func getData(){ - Services.weekList(quarter: selectIndexPath.row).subscribe(onNext: {result in + Services.weekList(quarter: selectIndexPath.row + 1).subscribe(onNext: {result in self.dataItems[self.selectIndexPath.row] = result.data ?? [] self.collectionView.reloadData() }).disposed(by: disposeBag) @@ -53,14 +53,21 @@ extension HomeListenMenuVC:UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout{ func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { - let vc = HomeListenVC() + let model = dataItems[selectIndexPath.row][indexPath.row] + + let quarter = selectIndexPath.row + 1 //季度 + let week = model.week //周 + let vc = HomeListenVC(quarter: quarter, week: week) push(vc: vc) } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_HomeListenMenuCCell", for: indexPath) as! HomeListenMenuCCell - cell.setTitle(week: "第一周", title: "提示基础认知能力", coin: 2000) - cell.contentView.backgroundColor = UIColor.qmui_random() + let seal = indexPath.row % 10 + cell.contentView.backgroundColor = UIColor(hexString: repeatColors[seal]) + let model = dataItems[selectIndexPath.row][indexPath.row] + cell.setTitle(week: "第\(model.week.jq_cn)周", title: model.title, coin: model.totalIntegral) + return cell } @@ -91,6 +98,7 @@ getData() } tableView.reloadData() + collectionView.reloadData() } func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { @@ -154,6 +162,12 @@ private var label_title = UILabel() private var label_completeCoin = UILabel() + var listenWeekModel:ListenWeekModel!{ + didSet{ + + } + } + override init(frame: CGRect) { super.init(frame: frame) diff --git a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenSubVC.swift b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenSubVC.swift index 46a583a..75f8cbe 100644 --- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenSubVC.swift +++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenSubVC.swift @@ -10,11 +10,15 @@ class HomeListenSubVC: BaseVC { private var page:Int! + private var quarter:Int! + private var week:Int! private var tableView:UITableView! - required init(page:Int) { - self.page = page + required init(page:Int,quarter:Int,week:Int) { super.init(nibName: nil, bundle: nil) + self.page = page + self.quarter = quarter + self.week = week } required init?(coder: NSCoder) { @@ -45,37 +49,87 @@ extension HomeListenSubVC:UITableViewDelegate{ func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - if indexPath.section == 1{ + let day = page + 1 + + if page <= 4{ if indexPath.row == 0{ - JQ_currentViewController().jq_push(vc: HomeListenFightVC(listenType: .lesson1)) + //听音选图 + Services.listenSelectPicture(day:day, quarter: quarter, week: week).subscribe(onNext: {result in + if let data = result.data{ + let fightVC = HomeListenFightVC(listenType: .lesson1) + fightVC.title = ListenType.lesson1.rawTitle + fightVC.data = data + JQ_currentViewController().jq_push(vc:fightVC) + } + }).disposed(by: disposeBag) } if indexPath.row == 1{ - JQ_currentViewController().jq_push(vc: HomeListenFightVC(listenType: .lesson2)) + //看图选音 + Services.pictureSelectVoice(day: day, quarter: quarter, week: week).subscribe(onNext: {result in + if let data = result.data{ + let fightVC = HomeListenFightVC(listenType: .lesson2) + fightVC.title = ListenType.lesson2.rawTitle + fightVC.data = data + JQ_currentViewController().jq_push(vc:fightVC) + } + }).disposed(by: disposeBag) + } if indexPath.row == 2{ - JQ_currentViewController().jq_push(vc: HomeListenFightVC(listenType: .lesson3)) + //归纳排除 + Services.induceExclude(day: day, quarter: quarter, week: week).subscribe(onNext: {result in + if let data = result.data{ + let fightVC = HomeListenFightVC(listenType: .lesson3) + fightVC.title = ListenType.lesson3.rawTitle + fightVC.data = data + JQ_currentViewController().jq_push(vc: fightVC) + } + }).disposed(by: disposeBag) } if indexPath.row == 3{ - JQ_currentViewController().jq_push(vc: HomeListenFightVC(listenType: .lesson4)) + //有问有答 + Services.questionsAndAnswers(day: day, quarter: quarter, week: week).subscribe(onNext: {result in + if let data = result.data{ + let fightVC = HomeListenFightVC(listenType: .lesson4) + fightVC.title = ListenType.lesson4.rawTitle + fightVC.data = data + JQ_currentViewController().jq_push(vc: fightVC) + } + }).disposed(by: disposeBag) } if indexPath.row == 4{ - JQ_currentViewController().jq_push(vc: HomeListenFightVC(listenType: .lesson5)) + //音图相配 + Services.pictureMateVoice(day: day, quarter: quarter, week: week).subscribe(onNext: {result in + if let data = result.data{ + let fightVC = HomeListenFightVC(listenType: .lesson5) + fightVC.title = ListenType.lesson5.rawTitle + fightVC.data = data + JQ_currentViewController().jq_push(vc: fightVC) + } + }).disposed(by: disposeBag) } + } - if indexPath.row == 5{ + //自主游戏 + if page == 5{ + if indexPath.row == 0{ JQ_currentViewController().jq_push(vc: HomeListenFightVC(listenType: .game1)) } - if indexPath.row == 6{ + if indexPath.row == 1{ JQ_currentViewController().jq_push(vc: HomeListenFightVC(listenType: .game2)) } - if indexPath.row == 7{ + } + + //听故事 + if page == 6{ + if indexPath.row == 0{ JQ_currentViewController().jq_push(vc: HomeListenFightVC(listenType: .story1)) } - if indexPath.row == 8{ + if indexPath.row == 1{ JQ_currentViewController().jq_push(vc: HomeListenFightVC(listenType: .story2)) } } @@ -84,38 +138,76 @@ extension HomeListenSubVC:UITableViewDataSource{ func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - if section == 0{ - return 1 + + if page <= 4{ + if section == 0{return 1} + return 5 + }else{ + return 2 } - return 9 } func numberOfSections(in tableView: UITableView) -> Int { - if page <= 6{ + if page <= 4{ return 2 } return 1 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - if indexPath.section == 0{ + if indexPath.section == 0 && page <= 4{ let cell = tableView.dequeueReusableCell(withIdentifier: "_HomeListen_process_TCell", for: indexPath) as! HomeListen_process_TCell return cell }else{ let cell = tableView.dequeueReusableCell(withIdentifier: "_HomeListen_item_TCell", for: indexPath) as! HomeListen_item_TCell cell.label_title.text = "\(indexPath.row + 1)" - switch indexPath.row { - case 0:cell.label_title.text = "题目类型一" - case 1:cell.label_title.text = "题目类型二" - case 2:cell.label_title.text = "题目类型三" - case 3:cell.label_title.text = "题目类型四" - case 4:cell.label_title.text = "题目类型五" - case 5:cell.label_title.text = "游戏一" - case 6:cell.label_title.text = "游戏二" - case 7:cell.label_title.text = "故事一" - case 8:cell.label_title.text = "故事二" - default:break + if page <= 4{ + cell.view_bg1.isHidden = true + switch indexPath.row { + case 0: + cell.label_title.text = "自主学习1-听音选图" + cell.view_bg2.backgroundColor = UIColor(hexString: "#6EC3FF") + case 1: + cell.label_title.text = "自主学习2-看图选音" + cell.view_bg2.backgroundColor = UIColor(hexString: "#FF9A85") + case 2: + cell.label_title.text = "自主学习3-归纳排除" + cell.view_bg2.backgroundColor = UIColor(hexString: "#28C8C5") + case 3: + cell.label_title.text = "自主学习4-有问有答" + cell.view_bg2.backgroundColor = UIColor(hexString: "#F8A169") + case 4: + cell.label_title.text = "自主学习5-音图相配" + cell.view_bg2.backgroundColor = UIColor(hexString: "#92CADB") + default:break + } + } + + if page == 5{ + cell.view_bg2.isHidden = true + switch indexPath.row { + case 0: + cell.label_title.text = "自主游戏1-超级听力" + cell.view_bg1.backgroundColor = UIColor(hexString: "#6EC3FF") + case 1: + cell.label_title.text = "自主游戏2-超级记忆" + cell.view_bg1.backgroundColor = UIColor(hexString: "#FF9A85") + default:break + } + } + + if page == 6{ + cell.view_bg2.isHidden = true + switch indexPath.row { + case 0: + cell.label_title.text = "自主故事1-看图配音" + cell.view_bg1.backgroundColor = UIColor(hexString: "#6EC3FF") + case 1: + cell.label_title.text = "自主故事2-框架记忆" + cell.view_bg1.backgroundColor = UIColor(hexString: "#FF9A85") + default:break + } } return cell @@ -123,8 +215,9 @@ } func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { - if indexPath.section == 0{ - return 145.5 + if page <= 5{ + if indexPath.section == 0{return 145.5} + return 127.5 }else{ return 127.5 } diff --git a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenVC.swift b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenVC.swift index 3dba243..493f3cd 100644 --- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenVC.swift +++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenVC.swift @@ -13,6 +13,8 @@ //限制后面的点击:天数(1开始) private var limitDay = 7 + private var quarter:Int! + private var week:Int! private lazy var menu:SPPageMenu = { let menu = SPPageMenu(frame: .zero, trackerStyle: .line) @@ -35,6 +37,16 @@ return vc }() + required init(quarter:Int,week:Int) { + super.init(nibName: nil, bundle: nil) + self.quarter = quarter + self.week = week + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + override func viewDidLoad() { super.viewDidLoad() } @@ -98,6 +110,6 @@ } func pageViewController(_ pageViewConteoller: FFPageViewController, controllerForPage page: Int) -> UIViewController { - return HomeListenSubVC(page: page) + return HomeListenSubVC(page: page,quarter: quarter,week: week) } } diff --git a/DolphinEnglishLearnStudent/Moudle/Home/Listen/View/Lesson_3_AnswerView.swift b/DolphinEnglishLearnStudent/Moudle/Home/Listen/View/Lesson_3_AnswerView.swift index 42fee37..23ffac3 100644 --- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/View/Lesson_3_AnswerView.swift +++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/View/Lesson_3_AnswerView.swift @@ -14,6 +14,9 @@ @IBOutlet weak var btn_choose: UIButton! @IBOutlet weak var btn_fullscreen: UIButton! @IBOutlet weak var img_cover: UIImageView! + + var imageUrl:String = "" + override func awakeFromNib() { super.awakeFromNib() img_state.alpha = 0 diff --git a/DolphinEnglishLearnStudent/Moudle/Home/Listen/View/Lesson_4_AnswerView.swift b/DolphinEnglishLearnStudent/Moudle/Home/Listen/View/Lesson_4_AnswerView.swift index 1389531..f413c8a 100644 --- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/View/Lesson_4_AnswerView.swift +++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/View/Lesson_4_AnswerView.swift @@ -14,7 +14,9 @@ @IBOutlet weak var btn_choose: UIButton! @IBOutlet weak var view_state: UIView! @IBOutlet weak var view_handle: UIView! - + + var voiceUrl:String? + override func awakeFromNib() { super.awakeFromNib() img_state.alpha = 0 @@ -27,6 +29,9 @@ return copyV } - - + @IBAction func playAction(_ sender: UIButton) { + if let url = voiceUrl{ + VoicePlayer.share().playerAt(url: url) + } + } } diff --git a/DolphinEnglishLearnStudent/Moudle/Home/Listen/View/Lesson_4_AnswerView.xib b/DolphinEnglishLearnStudent/Moudle/Home/Listen/View/Lesson_4_AnswerView.xib index d9e5413..0df0a8b 100644 --- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/View/Lesson_4_AnswerView.xib +++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/View/Lesson_4_AnswerView.xib @@ -19,31 +19,42 @@ <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="qsr-6I-w3R"> <rect key="frame" x="0.0" y="0.0" width="152" height="52"/> <subviews> - <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="otl-1Z-qED"> - <rect key="frame" x="18" y="9.5" width="33" height="33"/> + <button opaque="NO" userInteractionEnabled="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="otl-1Z-qED"> + <rect key="frame" x="18" y="15" width="28" height="22"/> <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/> - <state key="normal" image="icon_question"/> + <state key="normal" image="icon_answer"/> </button> - <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="mba-RI-50M"> - <rect key="frame" x="70" y="12.5" width="27" height="27"/> + <button opaque="NO" userInteractionEnabled="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="mba-RI-50M"> + <rect key="frame" x="65" y="12.5" width="27" height="27"/> <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/> <state key="normal" image="icon_play_1"/> </button> <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon_fail" translatesAutoresizingMaskIntoConstraints="NO" id="mkh-g4-79e"> - <rect key="frame" x="108" y="10" width="32" height="32"/> + <rect key="frame" x="103" y="10" width="32" height="32"/> <constraints> <constraint firstAttribute="height" constant="32" id="unt-83-tZW"/> <constraint firstAttribute="width" constant="32" id="yDR-8r-kHx"/> </constraints> </imageView> + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="tfO-7L-o0T"> + <rect key="frame" x="0.0" y="0.0" width="152" height="52"/> + <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/> + <connections> + <action selector="playAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="mAa-LF-0SJ"/> + </connections> + </button> </subviews> <color key="backgroundColor" red="0.25490196079999999" green="0.63529411759999999" blue="0.92156862750000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <constraints> <constraint firstItem="mba-RI-50M" firstAttribute="leading" secondItem="otl-1Z-qED" secondAttribute="trailing" constant="19" id="0nx-t9-1zV"/> <constraint firstAttribute="width" constant="152" id="3Zx-vg-H2U"/> <constraint firstItem="otl-1Z-qED" firstAttribute="leading" secondItem="qsr-6I-w3R" secondAttribute="leading" constant="18" id="6CA-c8-Zr7"/> + <constraint firstAttribute="bottom" secondItem="tfO-7L-o0T" secondAttribute="bottom" id="8ro-2n-YNH"/> + <constraint firstAttribute="trailing" secondItem="tfO-7L-o0T" secondAttribute="trailing" id="A2h-po-R4k"/> <constraint firstItem="mba-RI-50M" firstAttribute="centerY" secondItem="otl-1Z-qED" secondAttribute="centerY" id="FTc-eb-PWk"/> + <constraint firstItem="tfO-7L-o0T" firstAttribute="top" secondItem="qsr-6I-w3R" secondAttribute="top" id="HqC-Ia-1OU"/> <constraint firstItem="mkh-g4-79e" firstAttribute="centerY" secondItem="otl-1Z-qED" secondAttribute="centerY" id="N6f-d4-80e"/> + <constraint firstItem="tfO-7L-o0T" firstAttribute="leading" secondItem="qsr-6I-w3R" secondAttribute="leading" id="QfH-1Q-LyV"/> <constraint firstItem="mkh-g4-79e" firstAttribute="leading" secondItem="mba-RI-50M" secondAttribute="trailing" constant="11" id="a9o-Lq-9SP"/> <constraint firstItem="otl-1Z-qED" firstAttribute="centerY" secondItem="qsr-6I-w3R" secondAttribute="centerY" id="v0P-gn-zbN"/> </constraints> @@ -94,8 +105,8 @@ <resources> <image name="btn_radio" width="52" height="52"/> <image name="btn_radio_u" width="52" height="52"/> + <image name="icon_answer" width="28" height="14"/> <image name="icon_fail" width="80" height="80"/> <image name="icon_play_1" width="27" height="27"/> - <image name="icon_question" width="33" height="33"/> </resources> </document> diff --git a/DolphinEnglishLearnStudent/Moudle/Home/VC/HomeStudyCompleteVC.swift b/DolphinEnglishLearnStudent/Moudle/Home/VC/HomeStudyCompleteVC.swift index 5181934..36daafe 100644 --- a/DolphinEnglishLearnStudent/Moudle/Home/VC/HomeStudyCompleteVC.swift +++ b/DolphinEnglishLearnStudent/Moudle/Home/VC/HomeStudyCompleteVC.swift @@ -8,11 +8,35 @@ import UIKit class HomeStudyCompleteVC: BaseVC { + @IBOutlet weak var label_coin: UILabel! + @IBOutlet weak var label_correctNum: UILabel! + @IBOutlet weak var label_totalNum: UILabel! + @IBOutlet weak var label_errorNum: UILabel! + @IBOutlet weak var label_ratioNum: UILabel! + + private var correctNum:Int = 0 + private var errorNum:Int = 0 + private var totalCoin:Int = 0 + required init(correctNum:Int,errorNum:Int,totalCoin:Int){ + super.init(nibName: nil, bundle: nil) + self.correctNum = correctNum + self.errorNum = errorNum + self.totalCoin = totalCoin + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + override func viewDidLoad() { super.viewDidLoad() - + label_coin.text = "恭喜你,已完成全部答题!获得\(totalCoin)积分!" + label_correctNum.text = "\(correctNum)次" + label_errorNum.text = "\(errorNum)次" + label_totalNum.text = "\(correctNum + errorNum)次" + label_ratioNum.text = String(format: "正确率:%.0lf%%", Double(correctNum) / Double(correctNum + errorNum) * 100) } override func setUI() { diff --git a/DolphinEnglishLearnStudent/Moudle/Home/VC/HomeStudyCompleteVC.xib b/DolphinEnglishLearnStudent/Moudle/Home/VC/HomeStudyCompleteVC.xib index 8fa2c40..84d415a 100644 --- a/DolphinEnglishLearnStudent/Moudle/Home/VC/HomeStudyCompleteVC.xib +++ b/DolphinEnglishLearnStudent/Moudle/Home/VC/HomeStudyCompleteVC.xib @@ -11,6 +11,11 @@ <objects> <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="HomeStudyCompleteVC" customModule="DolphinEnglishLearnStudent" customModuleProvider="target"> <connections> + <outlet property="label_coin" destination="0Rg-U5-bnk" id="Ue5-07-HUP"/> + <outlet property="label_correctNum" destination="GyL-R8-T1w" id="ljq-bs-33V"/> + <outlet property="label_errorNum" destination="8Lo-W3-dxd" id="y0q-RX-MkE"/> + <outlet property="label_ratioNum" destination="4uZ-XC-Xc3" id="cSZ-ND-O0D"/> + <outlet property="label_totalNum" destination="EAE-ID-4sP" id="Xpa-MR-y2Y"/> <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/> </connections> </placeholder> diff --git a/DolphinEnglishLearnStudent/Moudle/Home/View/AwardListView.swift b/DolphinEnglishLearnStudent/Moudle/Home/View/AwardListView.swift index 62af126..0f02d23 100644 --- a/DolphinEnglishLearnStudent/Moudle/Home/View/AwardListView.swift +++ b/DolphinEnglishLearnStudent/Moudle/Home/View/AwardListView.swift @@ -13,6 +13,7 @@ @IBOutlet weak var view_container: UIView! private var items = [RecommendModel]() private var clickClouse:((RecommendModel)->Void)! + private var closeClouse:(()->Void)! override func awakeFromNib() { super.awakeFromNib() self.alpha = 0 @@ -24,13 +25,14 @@ layoutIfNeeded() } - static func show(items:[RecommendModel],clouse:@escaping (RecommendModel)->Void){ + static func show(items:[RecommendModel],clouse:@escaping (RecommendModel)->Void,closeClouse:@escaping()->Void){ if items.count == 0{return} let awardListView = AwardListView.jq_loadNibView() awardListView.items = items awardListView.clickClouse = clouse + awardListView.closeClouse = closeClouse sceneDelegate?.window?.addSubview(awardListView) awardListView.frame = sceneDelegate?.window?.frame ?? .zero @@ -48,6 +50,7 @@ self.alpha = 0 self.view_container.transform = .init(scaleX: 0.1, y: 0.1) } completion: { _ in + self.closeClouse?() self.removeFromSuperview() } } @@ -57,14 +60,14 @@ func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { - UIView.animate(withDuration: 0.4) { - self.alpha = 0 - self.view_container.transform = .init(scaleX: 0.1, y: 0.1) - } completion: { _ in - self.removeFromSuperview() - let item = self.items[indexPath.row] - self.clickClouse(item) - } +// UIView.animate(withDuration: 0.4) { +// self.alpha = 0 +// self.view_container.transform = .init(scaleX: 0.1, y: 0.1) +// } completion: { _ in +// self.removeFromSuperview() +// let item = self.items[indexPath.row] +// self.clickClouse(item) +// } } } diff --git a/DolphinEnglishLearnStudent/Moudle/Me/MeVC.swift b/DolphinEnglishLearnStudent/Moudle/Me/MeVC.swift index 449d943..1b9f7d7 100644 --- a/DolphinEnglishLearnStudent/Moudle/Me/MeVC.swift +++ b/DolphinEnglishLearnStudent/Moudle/Me/MeVC.swift @@ -22,19 +22,27 @@ super.viewDidLoad() Services.userInfo().subscribe(onNext: {result in - if let model = result.data{ + var items = Array<String>() + + if let model = result.data?.user{ self.imge_cover.sd_setImage(with: URL(string: model.headImg)) self.label_name.text = model.name -// var items = Array<String>() -// items.append("剩余积分:\(model.integral)") -// items.append("学习进度:\(model.integral)") + items.append("剩余积分:\(model.integral)") } + + if let model = result.data?.userStudy{ + items.append("学习进度:\(model.week)") + items.append("学习总时长:\(model.totalStudy)小时") + } + self.label_info.text = items.joined(separator: "|") + }).disposed(by: disposeBag) } override func setUI() { super.setUI() + label_info.text = "" btn_address.spacingBetweenImageAndTitle = 11 btn_coinRecord.spacingBetweenImageAndTitle = 11 btn_exchangeRecord.spacingBetweenImageAndTitle = 11 diff --git a/DolphinEnglishLearnStudent/Moudle/Me/TCell/GoodsItemTCell.swift b/DolphinEnglishLearnStudent/Moudle/Me/TCell/GoodsItemTCell.swift index 6dc7fa9..0f53d37 100644 --- a/DolphinEnglishLearnStudent/Moudle/Me/TCell/GoodsItemTCell.swift +++ b/DolphinEnglishLearnStudent/Moudle/Me/TCell/GoodsItemTCell.swift @@ -17,6 +17,7 @@ @IBOutlet weak var label_sendInfo: UILabel! @IBOutlet weak var btn_state: UIButton! @IBOutlet weak var label_coin: UILabel! + @IBOutlet weak var img_cover: UIImageView! @IBOutlet weak var view_container: UIView! override func awakeFromNib() { @@ -29,7 +30,9 @@ func setModel(_ model:ExchangeRecordModel){ label_goodsNum.text = "商品数量:\(model.count)" label_coin.text = "\(model.integral)积分" - + label_goodsName.text = model.goodsName + label_types.text = model.goodsType.joined(separator: "|") + img_cover.sd_setImage(with: URL(string: model.coverImg)) var items_consignee = Array<String>() items_consignee.append(model.consigneeName) items_consignee.append(model.consigneePhone) @@ -42,6 +45,23 @@ label_sendInfo.isHidden = items_express.filter({!$0.isEmpty}).count == 0 label_sendInfo.text = "发货信息:" + items_express.joined(separator: "|") + + //订单状态1待发货2已发货3已完成 + switch model.state{ + case 1: + label_state.text = "待发货" + btn_state.setTitle("修改地址", for: .normal) + btn_state.isHidden = false + case 2: + label_state.text = "平台已发货,请耐心等待" + btn_state.setTitle("已收货", for: .normal) + btn_state.isHidden = false + case 3: + label_state.text = "已完成" + btn_state.isHidden = true + default: + btn_state.isHidden = true + } } @IBAction func handleAction(_ sender: UIButton) { diff --git a/DolphinEnglishLearnStudent/Moudle/Me/TCell/GoodsItemTCell.xib b/DolphinEnglishLearnStudent/Moudle/Me/TCell/GoodsItemTCell.xib index 938ac98..6ee0583 100644 --- a/DolphinEnglishLearnStudent/Moudle/Me/TCell/GoodsItemTCell.xib +++ b/DolphinEnglishLearnStudent/Moudle/Me/TCell/GoodsItemTCell.xib @@ -142,6 +142,7 @@ <viewLayoutGuide key="safeArea" id="njF-e1-oar"/> <connections> <outlet property="btn_state" destination="xwt-lH-fyW" id="YNc-qk-0gB"/> + <outlet property="img_cover" destination="HZS-Oe-5LR" id="jhE-JJ-jDa"/> <outlet property="label_coin" destination="nMG-SO-H2Z" id="weP-sJ-QLG"/> <outlet property="label_goodsName" destination="UdI-oe-WSO" id="o9d-iH-BCJ"/> <outlet property="label_goodsNum" destination="PlF-D7-xZD" id="1mj-HF-LGA"/> diff --git a/DolphinEnglishLearnStudent/Moudle/Me/TCell/Home_1_TCell.swift b/DolphinEnglishLearnStudent/Moudle/Me/TCell/Home_1_TCell.swift index 545162a..6682c87 100644 --- a/DolphinEnglishLearnStudent/Moudle/Me/TCell/Home_1_TCell.swift +++ b/DolphinEnglishLearnStudent/Moudle/Me/TCell/Home_1_TCell.swift @@ -6,6 +6,7 @@ // import UIKit +import JQTools class Home_1_TCell: UITableViewCell { @@ -25,7 +26,14 @@ var studyGamesRecordModel:StudyGamesRecordModel!{ didSet{ - + label_1.text = studyGamesRecordModel.createTime + label_2.text = studyGamesRecordModel.gameName + let date = Date.JQ_secondToDate(interval: studyGamesRecordModel.useTime) + var emuple = [String]() + if date.hour > 0{emuple.append("\(date.hour)小时")} + if date.minute > 0{emuple.append("\(date.minute)分钟")} + label_3.text = emuple.joined(separator: "") + label_4.text = "\(studyGamesRecordModel.accuracy)%" } } diff --git a/DolphinEnglishLearnStudent/Moudle/Me/VC/ExchangeRecordHistoryVC.swift b/DolphinEnglishLearnStudent/Moudle/Me/VC/ExchangeRecordHistoryVC.swift index 1a29931..a514611 100644 --- a/DolphinEnglishLearnStudent/Moudle/Me/VC/ExchangeRecordHistoryVC.swift +++ b/DolphinEnglishLearnStudent/Moudle/Me/VC/ExchangeRecordHistoryVC.swift @@ -37,8 +37,8 @@ tableView.register(UINib(nibName: "GoodsItemTCell", bundle: nil), forCellReuseIdentifier: "_GoodsItemTCell") view.addSubview(tableView) tableView.snp.makeConstraints { make in - make.left.equalTo(239 * Config.RatioW) - make.right.equalTo(-239 * Config.RatioW) + make.left.equalTo(159 * Config.RatioW) + make.right.equalTo(-159 * Config.RatioW) make.top.equalTo(self.view.safeAreaLayoutGuide.snp.top).offset(27 * Config.RatioW) make.bottom.equalTo(self.view.safeAreaLayoutGuide.snp.bottom).offset(-5) } @@ -62,7 +62,7 @@ } func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { - return 221 * Config.RatioH + return 241 * Config.RatioH } diff --git a/DolphinEnglishLearnStudent/Moudle/Me/VC/StudyVC.swift b/DolphinEnglishLearnStudent/Moudle/Me/VC/StudyVC.swift index ed38a0c..66d8c9b 100644 --- a/DolphinEnglishLearnStudent/Moudle/Me/VC/StudyVC.swift +++ b/DolphinEnglishLearnStudent/Moudle/Me/VC/StudyVC.swift @@ -6,21 +6,35 @@ // import UIKit +import JQTools class StudyVC: BaseVC { + + @IBOutlet weak var label_currentProcess: UILabel! + @IBOutlet weak var label_surplusProcess: UILabel! + @IBOutlet weak var label_studyTotalTimes: UILabel! + @IBOutlet weak var label_studyWeekTotalTimes: UILabel! @IBOutlet weak var view_menu: UIView! @IBOutlet weak var tableView: UITableView! private var gamesRecordModel:StudyGamesModel?{ didSet{ self.tableView.reloadData() + + label_currentProcess.text = "当前进度:周目\(gamesRecordModel?.record?.week.jq_cn ?? "")" + label_surplusProcess.text = "剩余进度:周目\(gamesRecordModel?.record?.surplus.jq_cn ?? "")" + + label_studyTotalTimes.attributedText = AttributedStringbuilder.build().add(string: "学习总时长:", withFont: .systemFont(ofSize: 16), withColor: UIColor(hexString: "#2B3648")!).add(string: "\(gamesRecordModel?.record?.totalStudy ?? 0)小时", withFont: .systemFont(ofSize: 16, weight: .medium), withColor: UIColor(hexString: "#2B3648")!).add(string: "|今日学习:", withFont: .systemFont(ofSize: 16), withColor: UIColor(hexString: "#2B3648")!).add(string: "\(gamesRecordModel?.record?.todayStudy ?? 0)小时", withFont: .systemFont(ofSize: 16, weight: .medium), withColor: UIColor(hexString: "#2B3648")!).mutableAttributedString + + + label_studyWeekTotalTimes.attributedText = AttributedStringbuilder.build().add(string: "本周学习时长:", withFont: .systemFont(ofSize: 16), withColor: UIColor(hexString: "#2B3648")!).add(string: "\(gamesRecordModel?.record?.weekStudy ?? 0)小时", withFont: .systemFont(ofSize: 16, weight: .medium), withColor: UIColor(hexString: "#2B3648")!).add(string: "|本月学习时长:", withFont: .systemFont(ofSize: 16), withColor: UIColor(hexString: "#2B3648")!).add(string: "\(gamesRecordModel?.record?.monthStudy ?? 0)小时", withFont: .systemFont(ofSize: 16, weight: .medium), withColor: UIColor(hexString: "#2B3648")!).mutableAttributedString + } } override func viewDidLoad() { super.viewDidLoad() - Services.studyGamesRecord().subscribe(onNext: {result in if let m = result.data{ self.gamesRecordModel = m @@ -59,7 +73,6 @@ if let m = gamesRecordModel?.gameRecordList[indexPath.row]{ cell.studyGamesRecordModel = m } - return cell } diff --git a/DolphinEnglishLearnStudent/Moudle/Me/VC/StudyVC.xib b/DolphinEnglishLearnStudent/Moudle/Me/VC/StudyVC.xib index a76d1a7..d7b715d 100644 --- a/DolphinEnglishLearnStudent/Moudle/Me/VC/StudyVC.xib +++ b/DolphinEnglishLearnStudent/Moudle/Me/VC/StudyVC.xib @@ -11,6 +11,10 @@ <objects> <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="StudyVC" customModule="DolphinEnglishLearnStudent" customModuleProvider="target"> <connections> + <outlet property="label_currentProcess" destination="6E8-Ab-gRb" id="70S-Tq-iJq"/> + <outlet property="label_studyTotalTimes" destination="crR-lR-Tnj" id="aM4-1l-jTW"/> + <outlet property="label_studyWeekTotalTimes" destination="r1z-jS-qK4" id="844-dB-a5N"/> + <outlet property="label_surplusProcess" destination="SYT-bU-Qar" id="z3n-Ny-Yfs"/> <outlet property="tableView" destination="byc-YG-6j2" id="BDN-57-WDq"/> <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/> <outlet property="view_menu" destination="1HY-aY-obo" id="m6s-HL-ZwQ"/> diff --git a/DolphinEnglishLearnStudent/Other/UIView/StudyHandleView.swift b/DolphinEnglishLearnStudent/Other/UIView/StudyHandleView.swift index e9922d4..425f138 100644 --- a/DolphinEnglishLearnStudent/Other/UIView/StudyHandleView.swift +++ b/DolphinEnglishLearnStudent/Other/UIView/StudyHandleView.swift @@ -7,6 +7,7 @@ import UIKit import JQTools +import AVFoundation class StudyHandleView: UIView,JQNibView{ @IBOutlet weak var btn_choose: UIButton! @@ -17,15 +18,28 @@ var listenType:ListenType? private var clouse:((UIButton)->Void)? + private var playComplete:(()->Void)? + private var playAtClouse:((Int)->Void)? + + private var voicePlayer = VoicePlayer.share() + var vioceSoundUrl:String? override func awakeFromNib() { super.awakeFromNib() btn_state.alpha = 0 view_choose.alpha = 0 + + voicePlayer.playEnd {[weak self] in + self?.reset() + } } func chooseClouse(callback:@escaping (UIButton)->Void){ clouse = callback + } + + func playAt(_ clouse:@escaping(Int)->Void){ + self.playAtClouse = clouse } func copyView()->StudyHandleView{ @@ -34,9 +48,26 @@ return copyV } - @IBAction func payAction(_ sender: UIButton) { + func reset(){ switch listenType { - case .lesson1: + case .lesson1,.lesson5: + btn_state.setImage(UIImage(named: "icon_play"), for: .normal) + btn_voice.alpha = 1 + btn_pay.alpha = 1 + btn_state.alpha = 0 + case .lesson2: + view_choose.alpha = 1 + default:break + } + self.superview?.layoutIfNeeded() + } + + @IBAction func payAction(_ sender: UIButton) { + guard let v = vioceSoundUrl else {return} + voicePlayer.playerAt(url: v) + playAtClouse?(self.tag) + switch listenType { + case .lesson1,.lesson5: btn_state.setImage(UIImage(named: "icon_playing"), for: .normal) btn_voice.alpha = 0 btn_pay.alpha = 0 @@ -46,7 +77,7 @@ default:break } } - + @IBAction func chooseAction(_ sender: UIButton) { sender.isSelected = !sender.isSelected clouse?(sender) diff --git a/DolphinEnglishLearnStudent/Services/NetworkRequest.swift b/DolphinEnglishLearnStudent/Services/NetworkRequest.swift index 7ad8825..03a8cf5 100644 --- a/DolphinEnglishLearnStudent/Services/NetworkRequest.swift +++ b/DolphinEnglishLearnStudent/Services/NetworkRequest.swift @@ -245,7 +245,7 @@ // // } // ob.onError(NetRequestError.InvaildSession) - case 401: + case 401,505,600: if !ignoreAlert{ alertError(msg: "登录失效,请重新登录");ob.onError(NetRequestError.InvaildSession) } diff --git a/DolphinEnglishLearnStudent/Services/Services.swift b/DolphinEnglishLearnStudent/Services/Services.swift index ea96788..37d216b 100644 --- a/DolphinEnglishLearnStudent/Services/Services.swift +++ b/DolphinEnglishLearnStudent/Services/Services.swift @@ -26,7 +26,70 @@ let params = ParamsAppender.build(url: All_Url) params.interface(url: "/study/base/study/weekList") params.append(key: "quarter", value: quarter) - return NetworkRequest.request(params: params, method: .get, progress: false) + return NetworkRequest.request(params: params, method: .get, progress: true) + } + + + /// 自主学习1-听音选图 + class func listenSelectPicture(day:Int,quarter:Int,week:Int)->Observable<BaseResponse<Listen1Model>>{ + let params = ParamsAppender.build(url: All_Url) + params.interface(url: "/study/base/study/listenSelectPicture") + params.append(key: "quarter", value: quarter) + params.append(key: "day", value: day) + params.append(key: "week", value: week) + return NetworkRequest.request(params: params, method: .get, progress: true) + } + + + /// 自主学习2-看图选音 + class func pictureSelectVoice(day:Int,quarter:Int,week:Int)->Observable<BaseResponse<Listen1Model>>{ + let params = ParamsAppender.build(url: All_Url) + params.interface(url: "/study/base/study/pictureSelectVoice") + params.append(key: "quarter", value: quarter) + params.append(key: "day", value: day) + params.append(key: "week", value: week) + return NetworkRequest.request(params: params, method: .get, progress: true) + } + + /// 自主学习3-归纳排除 + class func induceExclude(day:Int,quarter:Int,week:Int)->Observable<BaseResponse<Listen1Model>>{ + let params = ParamsAppender.build(url: All_Url) + params.interface(url: "/study/base/study/induceExclude") + params.append(key: "quarter", value: quarter) + params.append(key: "day", value: day) + params.append(key: "week", value: week) + return NetworkRequest.request(params: params, method: .get, progress: true) + } + + /// 自主学习4-有问有答 + class func questionsAndAnswers(day:Int,quarter:Int,week:Int)->Observable<BaseResponse<Listen4Model>>{ + let params = ParamsAppender.build(url: All_Url) + params.interface(url: "/study/base/study/questionsAndAnswers") + params.append(key: "quarter", value: quarter) + params.append(key: "day", value: day) + params.append(key: "week", value: week) + return NetworkRequest.request(params: params, method: .get, progress: true) + } + + /// 自主学习5-音图相配 + class func pictureMateVoice(day:Int,quarter:Int,week:Int)->Observable<BaseResponse<Listen1Model>>{ + let params = ParamsAppender.build(url: All_Url) + params.interface(url: "/study/base/study/pictureMateVoice") + params.append(key: "quarter", value: quarter) + params.append(key: "day", value: day) + params.append(key: "week", value: week) + return NetworkRequest.request(params: params, method: .get, progress: true) + } + + /// 完成学习 + class func completeLearing(type:Int,studyTime:Int,studyIds:[Int],isComplete:Bool)->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.map({"\($0)"})) + .append(key: "isComplete", value: isComplete) + return NetworkRequest.request(params: params, method: .post,encoding: JSONEncoding.default, progress: true) } } @@ -173,7 +236,7 @@ class func studyGamesRecord()->Observable<BaseResponse<StudyGamesModel>>{ let params = ParamsAppender.build(url: All_Url) - params.interface(url: "/study/base/study/record") + params.interface(url: "/study/base/study/studyRecord") return NetworkRequest.request(params: params, method: .get, progress: true) } diff --git a/DolphinEnglishLearnStudent/ViewModel/UserViewModel.swift b/DolphinEnglishLearnStudent/ViewModel/UserViewModel.swift index bb2051a..4db5fda 100644 --- a/DolphinEnglishLearnStudent/ViewModel/UserViewModel.swift +++ b/DolphinEnglishLearnStudent/ViewModel/UserViewModel.swift @@ -12,6 +12,12 @@ struct UserInfoModel:HandyJSON,Identifiable,Codable{ static let idKey = \UserInfoModel.id var id: Int = 0 + var user:UserInfoUserModel? + var userStudy:UserInfoStudyModel? + +} + +struct UserInfoUserModel:HandyJSON,Codable{ var account: String = "" var birthday: String = "" var createBy: String = "" @@ -31,7 +37,25 @@ var updateTime: String = "" var vipEndTime: String = "" var vipPayTime: String = "" +} +struct UserInfoStudyModel:HandyJSON,Codable{ + var answer: Int = 0 + var day: Int = 0 + var id: Int = 0 + var induction: Int = 0 + var listen: Int = 0 + var look: Int = 0 + var monthStudy: Int = 0 + var pair: Int = 0 + var surplus: Int = 0 + var todayStudy: Int = 0 + var totalStudy: Int = 0 + var updateBy: String? + var updateTime: String? + var userId: Int = 0 + var week: Int = 0 + var weekStudy: Int = 0 } class UserViewModel{ -- Gitblit v1.7.1