| | |
| | | import RxRelay |
| | | |
| | | class FightAnswerViewModel{ |
| | | var selectIndex = BehaviorRelay<IndexPath?>(value: nil) |
| | | var answerType = BehaviorRelay<Fight_lessonType>(value: .none) |
| | | var selectIndex = BehaviorRelay<IndexPath?>(value: nil) |
| | | var answerType = BehaviorRelay<Fight_lessonType>(value: .none) |
| | | } |
| | | |
| | | /// 题目类型一 |
| | | class HomeListenFight_lesson_1_VC: BaseVC { |
| | | |
| | | private var viewModel = FightAnswerViewModel() |
| | | private var listenNewModel:ListenNewModel! |
| | | private var randomElement:Listen1SubModel? |
| | | private var page:Int! |
| | | private(set) var isListen:Bool = false |
| | | private var isAnsterComplete:Bool = false //是否已经回答完成[小题] |
| | | private var isAnsterDone:Bool = false //是否已经回答完成[大题] |
| | | private var viewModel = FightAnswerViewModel() |
| | | private var listenNewModel:ListenNewModel! |
| | | private var randomElement:Listen1SubModel? |
| | | private var page:Int! |
| | | private(set) var isListen:Bool = false |
| | | private var isAnsterComplete:Bool = false //是否已经回答完成[小题] |
| | | private var isAnsterDone:Bool = false //是否已经回答完成[大题] |
| | | |
| | | private var isAnsterModel = [Listen1SubModel]() |
| | | private var menuView:VoiceHandleView? |
| | | private var isAnsterModel = [Listen1SubModel]() |
| | | |
| | | private lazy var collectionView:UICollectionView = { |
| | | let flowLayout = UICollectionViewFlowLayout() |
| | | let w = (JQ_ScreenW - 194 * 2 - 25) / 2 |
| | | flowLayout.itemSize = CGSize(width: w, height: w * 0.745) |
| | | flowLayout.minimumLineSpacing = 25 |
| | | flowLayout.minimumInteritemSpacing = 25 |
| | | flowLayout.scrollDirection = .vertical |
| | | let collection = UICollectionView(frame: .zero, collectionViewLayout: flowLayout) |
| | | collection.register(UINib(nibName: "ListenFight_lesson_1_CCell", bundle: nil), forCellWithReuseIdentifier: "_ListenFight_lesson_1_CCell") |
| | | collection.isScrollEnabled = false |
| | | return collection |
| | | }() |
| | | //已回答过的题 |
| | | private var answerList = [Listen1SubModel]() |
| | | |
| | | var rootViewModel:HomeListenFightViewModel! |
| | | var teamScheduleModel:TeamScheduleModel?{ |
| | | didSet{ |
| | | if let m = teamScheduleModel{ |
| | | var temp = [Listen1SubModel]() |
| | | for v in listenNewModel.subjectList[page]{ |
| | | //已回答 |
| | | if m.topicIds.contains(v.id){ |
| | | temp.append(v) |
| | | } |
| | | } |
| | | isAnsterModel.insert(contentsOf: temp, at: 0) |
| | | private var menuView:VoiceHandleView? |
| | | private var handleClouse:(()->Void)? |
| | | |
| | | //todo |
| | | // let teamId = weakSelf.listenNewModel.data?.id.components(separatedBy: ",")[weakSelf.page] |
| | | // weakSelf.rootViewModel.insertCorrectAnswer(teamId: teamId, answerId: weakSelf.listenNewModel.subjectList[weakSelf.page][index.row].id) |
| | | private lazy var collectionView:UICollectionView = { |
| | | let flowLayout = UICollectionViewFlowLayout() |
| | | let w = (JQ_ScreenW - 194 * 2 - 25) / 2 |
| | | flowLayout.itemSize = CGSize(width: w, height: w * 0.745) |
| | | flowLayout.minimumLineSpacing = 25 |
| | | flowLayout.minimumInteritemSpacing = 25 |
| | | flowLayout.scrollDirection = .vertical |
| | | let collection = UICollectionView(frame: .zero, collectionViewLayout: flowLayout) |
| | | collection.register(UINib(nibName: "ListenFight_lesson_1_CCell", bundle: nil), forCellWithReuseIdentifier: "_ListenFight_lesson_1_CCell") |
| | | collection.isScrollEnabled = false |
| | | return collection |
| | | }() |
| | | |
| | | var rootViewModel:HomeListenFightViewModel! |
| | | var teamScheduleModel:TeamScheduleModel?{ |
| | | didSet{ |
| | | if let m = teamScheduleModel{ |
| | | var temp = [Listen1SubModel]() |
| | | for v in listenNewModel.subjectList[page]{ |
| | | //已回答 |
| | | if m.topicIds.contains(v.id){ |
| | | temp.append(v) |
| | | } |
| | | } |
| | | isAnsterModel.insert(contentsOf: temp, at: 0) |
| | | } |
| | | } |
| | | } |
| | | |
| | | required init(page:Int,listenNewModel:ListenNewModel){ |
| | | super.init(nibName: nil, bundle: nil) |
| | | self.page = page |
| | | self.listenNewModel = listenNewModel |
| | | } |
| | | |
| | | required init?(coder: NSCoder) { |
| | | fatalError("init(coder:) has not been implemented") |
| | | } |
| | | |
| | | override func viewDidLoad() { |
| | | super.viewDidLoad() |
| | | navigationItem.titleView = UIView() |
| | | collectionView.reloadData() |
| | | print("加载======DidLoad") |
| | | |
| | | //回传记录,始终保持答题进度 |
| | | // if let team = teamScheduleModel{ |
| | | // let v = team.schedule - 1 |
| | | // for i in 0..<v{ |
| | | // isAnsterModel.append(listenNewModel.subjectList[page][i]) |
| | | // } |
| | | // } |
| | | |
| | | //制造随机 |
| | | // listenNewModel.subjectList[page].shuffle() |
| | | getNextAnswer(isFirst: true) |
| | | menuView?.listenType = .lesson1 |
| | | |
| | | DispatchQueue.main.asyncAfter(deadline: .now()+2) { |
| | | VoicePlayer.share().playerAt(url: self.randomElement?.correct) |
| | | self.menuView?.playing() |
| | | } |
| | | } |
| | | |
| | | override func viewDidAppear(_ animated: Bool) { |
| | | super.viewDidAppear(animated) |
| | | VoicePlayer.share().delegate = self |
| | | } |
| | | |
| | | override func viewDidDisappear(_ animated: Bool) { |
| | | super.viewDidDisappear(animated) |
| | | VoicePlayer.share().delegate = nil |
| | | VoicePlayer.share().playerInterrupt() |
| | | } |
| | | |
| | | |
| | | func restore(){ |
| | | teamScheduleModel?.topicIds.removeAll() |
| | | teamScheduleModel?.teamIds.removeAll() |
| | | answerList.removeAll() |
| | | rootViewModel.currentPage.accept(0) |
| | | rootViewModel.answerCount.accept(1) |
| | | isAnsterDone = false |
| | | isAnsterModel.removeAll() |
| | | isAnsterComplete = false |
| | | viewModel.answerType.accept(.none) |
| | | viewModel.selectIndex.accept(nil) |
| | | menuView?.resetView() |
| | | setUI() |
| | | collectionView.reloadData() |
| | | getNextAnswer(isFirst: true) |
| | | } |
| | | |
| | | } |
| | | } |
| | | } |
| | | func tobefore(){ |
| | | if isAnsterModel.count == 1{return} |
| | | |
| | | required init(page:Int,listenNewModel:ListenNewModel){ |
| | | super.init(nibName: nil, bundle: nil) |
| | | self.page = page |
| | | self.listenNewModel = listenNewModel |
| | | } |
| | | isAnsterModel.removeLast() |
| | | |
| | | required init?(coder: NSCoder) { |
| | | fatalError("init(coder:) has not been implemented") |
| | | } |
| | | rootViewModel.answerCount.accept(page + isAnsterModel.count) |
| | | |
| | | override func viewDidLoad() { |
| | | super.viewDidLoad() |
| | | navigationItem.titleView = UIView() |
| | | collectionView.reloadData() |
| | | print("加载======DidLoad") |
| | | randomElement = isAnsterModel.last |
| | | menuView?.playUrl = randomElement?.correct |
| | | VoicePlayer.share().playerAt(url: self.randomElement?.correct) |
| | | menuView?.playing() |
| | | |
| | | //回传记录,始终保持答题进度 |
| | | if let team = teamScheduleModel{ |
| | | let v = team.schedule - 1 |
| | | for i in 0..<v{ |
| | | isAnsterModel.append(listenNewModel.subjectList[page][i]) |
| | | } |
| | | } |
| | | // listenNewModel.subjectList[page].shuffle() |
| | | collectionView.reloadData() |
| | | } |
| | | |
| | | //制造随机 |
| | | listenNewModel.subjectList[page].shuffle() |
| | | getNextAnswer(isFirst: true) |
| | | menuView?.listenType = .lesson1 |
| | | /// 下一题 |
| | | /// - Parameter isFirst: 是否首次进入,首次页码不+1 |
| | | private func getNextAnswer(isFirst:Bool = false){ |
| | | isListen = false |
| | | if isAnsterModel.count == 4{ |
| | | |
| | | DispatchQueue.main.asyncAfter(deadline: .now()+2) { |
| | | VoicePlayer.share().playerAt(url: self.randomElement?.correct) |
| | | self.menuView?.playing() |
| | | } |
| | | DispatchQueue.main.asyncAfter(deadline: .now()+2){[weak self] in |
| | | guard let weakSelf = self else { return } |
| | | NotificationCenter.default.post(name: NextLession_Noti, object: nil) |
| | | weakSelf.viewModel.answerType.accept(.none) |
| | | weakSelf.viewModel.selectIndex.accept(nil) |
| | | weakSelf.isListen = false |
| | | let v = weakSelf.rootViewModel.answerCount.value |
| | | weakSelf.rootViewModel.answerCount.accept(v + 1) |
| | | } |
| | | return |
| | | } |
| | | |
| | | randomElement = listenNewModel.subjectList[page].randomElement() //随机抽题 |
| | | |
| | | if randomElement != nil{ |
| | | //如果已经回答,或标记为已回答(返回上一小题时) |
| | | if isAnsterModel.contains(randomElement!){ |
| | | answerList.append(randomElement!) |
| | | getNextAnswer();return |
| | | } |
| | | |
| | | //没有回答 |
| | | if !isAnsterModel.contains(randomElement!){ |
| | | isAnsterModel.append(randomElement!) |
| | | } |
| | | |
| | | } |
| | | menuView?.playUrl = randomElement?.correct |
| | | |
| | | // listenNewModel.subjectList[page].shuffle() |
| | | isAnsterComplete = false |
| | | viewModel.answerType.accept(.none) |
| | | setUI() |
| | | |
| | | //自动播放下一题语音 |
| | | DispatchQueue.main.asyncAfter(deadline: .now()+2) { |
| | | VoicePlayer.share().playerAt(url: self.randomElement?.correct) |
| | | self.menuView?.playing() |
| | | } |
| | | |
| | | if !isAnsterDone && isAnsterModel.count <= 4 && !isFirst{ |
| | | let v = rootViewModel.answerCount.value |
| | | rootViewModel.answerCount.accept(v + 1) |
| | | } |
| | | } |
| | | |
| | | override func setUI() { |
| | | super.setUI() |
| | | |
| | | if !view.subviews.contains(collectionView){ |
| | | collectionView.delegate = self |
| | | collectionView.dataSource = self |
| | | collectionView.backgroundColor = UIColor(hexStr: "#C3BFB3") |
| | | view.addSubview(collectionView) |
| | | collectionView.snp.makeConstraints { make in |
| | | make.top.equalTo(self.view.safeAreaLayoutGuide.snp.top).offset(101) |
| | | make.left.equalTo(194) |
| | | make.right.equalTo(-194) |
| | | make.bottom.equalToSuperview() |
| | | } |
| | | } |
| | | |
| | | if menuView == nil{ |
| | | menuView = VoiceHandleView() |
| | | view.addSubview(menuView!) |
| | | menuView?.snp.makeConstraints { make in |
| | | make.top.equalTo(self.view.safeAreaLayoutGuide.snp.top).offset(24) |
| | | make.centerX.equalToSuperview() |
| | | // make.height.equalTo(52) |
| | | make.height.equalTo(40) |
| | | // make.width.equalTo(159) |
| | | make.width.equalTo(189) |
| | | } |
| | | }else{ |
| | | menuView?.snp.remakeConstraints { make in |
| | | make.top.equalTo(self.view.safeAreaLayoutGuide.snp.top).offset(24) |
| | | make.centerX.equalToSuperview() |
| | | // make.height.equalTo(52) |
| | | make.height.equalTo(40) |
| | | // make.width.equalTo(159) |
| | | make.width.equalTo(189) |
| | | } |
| | | } |
| | | |
| | | collectionView.reloadData() |
| | | } |
| | | |
| | | override func viewDidLayoutSubviews() { |
| | | super.viewDidLayoutSubviews() |
| | | let flowLayout = self.collectionView.collectionViewLayout as! UICollectionViewFlowLayout |
| | | let w = (self.collectionView.size.width - flowLayout.minimumLineSpacing) / 2 |
| | | let h = (self.collectionView.size.height - flowLayout.minimumInteritemSpacing) / 2 |
| | | |
| | | if flowLayout.itemSize.width != w || flowLayout.itemSize.height != h{ |
| | | flowLayout.itemSize = CGSize(width: w, height: h) |
| | | collectionView.reloadData() |
| | | } |
| | | } |
| | | |
| | | override func setRx() { |
| | | viewModel.selectIndex.subscribe(onNext: {[weak self] index in |
| | | guard let weakSelf = self else { return } |
| | | guard let index = index else { return } |
| | | if weakSelf.viewModel.answerType.value == .success {return} |
| | | //判断选中是否正确逻辑 |
| | | if let cell = self?.collectionView.cellForItem(at: index) as? ListenFight_lesson_1_CCell{ |
| | | var answer:Fight_lessonType = .none |
| | | if self?.randomElement?.id == weakSelf.listenNewModel.subjectList[weakSelf.page][index.row].id{ |
| | | answer = .success |
| | | self?.randomElement?.isAnster = true |
| | | self?.isListen = false |
| | | if self?.isAnsterComplete == false{ |
| | | self?.rootViewModel.correctNum += 1 |
| | | } |
| | | self?.isAnsterComplete = true |
| | | |
| | | VoicePlayer.share().playSuccessVoice() |
| | | |
| | | let teamId = weakSelf.listenNewModel.data?.id.components(separatedBy: ",")[weakSelf.page] |
| | | weakSelf.rootViewModel.insertCorrectAnswer(teamId: teamId, answerId: weakSelf.listenNewModel.subjectList[weakSelf.page][index.row].id) |
| | | |
| | | var cin = 0 |
| | | for (ci,v) in weakSelf.listenNewModel.subjectList[weakSelf.page].enumerated(){ |
| | | if v.id == self?.randomElement?.id{ |
| | | cin = ci;break |
| | | } |
| | | } |
| | | |
| | | if weakSelf.page >= 1{cin += 4} |
| | | |
| | | let model = weakSelf.listenNewModel.list[cin] |
| | | model.status = 2 |
| | | Services.answerQuestion(id: model.id, status: 2).subscribe(onNext: {_ in |
| | | weakSelf.handleClouse?() |
| | | }).disposed(by: weakSelf.disposeBag) |
| | | |
| | | DispatchQueue.main.asyncAfter(deadline: .now()+2) { |
| | | VoicePlayer.share().playerAt(url: weakSelf.listenNewModel.subjectList[weakSelf.page][index.row].correct) |
| | | } |
| | | }else{ |
| | | answer = .fail |
| | | VoicePlayer.share().playFailVoice() |
| | | self?.isListen = false |
| | | if self?.isAnsterComplete == false{ |
| | | self?.rootViewModel.errorNum += 1 |
| | | } |
| | | |
| | | var cin = 0 |
| | | for (ci,v) in weakSelf.listenNewModel.subjectList[weakSelf.page].enumerated(){ |
| | | if v.id == self?.randomElement?.id{ |
| | | cin = ci;break |
| | | } |
| | | } |
| | | |
| | | if weakSelf.page >= 1{cin += 4} |
| | | let model = weakSelf.listenNewModel.list[cin] |
| | | model.status = 3 |
| | | Services.answerQuestion(id: model.id, status: 3).subscribe(onNext: {_ in |
| | | weakSelf.handleClouse?() |
| | | }).disposed(by: weakSelf.disposeBag) |
| | | } |
| | | |
| | | |
| | | switch answer { |
| | | case .success: |
| | | self?.viewModel.answerType.accept(.success) |
| | | self?.answerSuccess(cell) |
| | | case .fail: |
| | | self?.viewModel.answerType.accept(.fail) |
| | | self?.collectionView.reloadData() |
| | | default:break |
| | | } |
| | | } |
| | | }).disposed(by: disposeBag) |
| | | |
| | | NotificationCenter.default.rx.notification(ResetLession_Noti).take(until: self.rx.deallocated).subscribe(onNext: {[weak self]_ in |
| | | self?.restore() |
| | | self?.viewDidLoad() |
| | | }).disposed(by: disposeBag) |
| | | } |
| | | |
| | | } |
| | | //回答正确 |
| | | private func answerSuccess(_ cell:ListenFight_lesson_1_CCell){ |
| | | menuView?.snp.removeConstraints() |
| | | menuView?.playing() |
| | | menuView?.jq_cornerRadius = 0 |
| | | let v = cell.view_topHandle.convert(cell.bounds, to: self.view) |
| | | UIView.animate(withDuration: 0.3) { |
| | | self.menuView?.snp.updateConstraints { make in |
| | | make.top.equalTo(self.view).offset(v.origin.y) |
| | | make.left.equalToSuperview().offset(v.origin.x) |
| | | make.width.equalTo(v.size.width - 10) |
| | | make.height.equalTo(40) |
| | | } |
| | | self.view.layoutIfNeeded() |
| | | }completion: { _ in |
| | | self.collectionView.reloadData() |
| | | } |
| | | } |
| | | |
| | | override func viewDidAppear(_ animated: Bool) { |
| | | super.viewDidAppear(animated) |
| | | VoicePlayer.share().delegate = self |
| | | } |
| | | |
| | | override func viewDidDisappear(_ animated: Bool) { |
| | | super.viewDidDisappear(animated) |
| | | VoicePlayer.share().delegate = nil |
| | | VoicePlayer.share().playerInterrupt() |
| | | } |
| | | |
| | | |
| | | func restore(){ |
| | | isAnsterDone = false |
| | | isAnsterModel.removeAll() |
| | | isAnsterComplete = false |
| | | viewModel.answerType.accept(.none) |
| | | viewModel.selectIndex.accept(nil) |
| | | menuView?.resetView() |
| | | setUI() |
| | | collectionView.reloadData() |
| | | getNextAnswer(isFirst: true) |
| | | } |
| | | |
| | | func tobefore(){ |
| | | if isAnsterModel.count == 1{return} |
| | | |
| | | isAnsterModel.removeLast() |
| | | |
| | | rootViewModel.answerCount.accept(page + isAnsterModel.count) |
| | | |
| | | randomElement = isAnsterModel.last |
| | | menuView?.playUrl = randomElement?.correct |
| | | VoicePlayer.share().playerAt(url: self.randomElement?.correct) |
| | | menuView?.playing() |
| | | |
| | | listenNewModel.subjectList[page].shuffle() |
| | | collectionView.reloadData() |
| | | } |
| | | |
| | | /// 下一题 |
| | | /// - Parameter isFirst: 是否首次进入,首次页码不+1 |
| | | private func getNextAnswer(isFirst:Bool = false){ |
| | | isListen = false |
| | | if isAnsterModel.count == 4{ |
| | | |
| | | DispatchQueue.main.asyncAfter(deadline: .now()+3){[weak self] in |
| | | guard let weakSelf = self else { return } |
| | | NotificationCenter.default.post(name: NextLession_Noti, object: nil) |
| | | weakSelf.viewModel.answerType.accept(.none) |
| | | weakSelf.viewModel.selectIndex.accept(nil) |
| | | weakSelf.isListen = false |
| | | let v = weakSelf.rootViewModel.answerCount.value |
| | | weakSelf.rootViewModel.answerCount.accept(v + 1) |
| | | } |
| | | return |
| | | } |
| | | |
| | | randomElement = listenNewModel.subjectList[page].randomElement() //随机抽题 |
| | | if randomElement != nil{ |
| | | //如果已经回答,或标记为已回答(返回上一小题时) |
| | | if isAnsterModel.contains(randomElement!){ |
| | | getNextAnswer();return |
| | | } |
| | | |
| | | //没有回答 |
| | | if !isAnsterModel.contains(randomElement!){ |
| | | isAnsterModel.append(randomElement!) |
| | | } |
| | | |
| | | } |
| | | menuView?.playUrl = randomElement?.correct |
| | | |
| | | listenNewModel.subjectList[page].shuffle() |
| | | isAnsterComplete = false |
| | | viewModel.answerType.accept(.none) |
| | | collectionView.reloadData() |
| | | setUI() |
| | | |
| | | //自动播放下一题语音 |
| | | DispatchQueue.main.asyncAfter(deadline: .now()+2) { |
| | | VoicePlayer.share().playerAt(url: self.randomElement?.correct) |
| | | self.menuView?.playing() |
| | | } |
| | | |
| | | if !isAnsterDone && isAnsterModel.count <= 4 && !isFirst{ |
| | | let v = rootViewModel.answerCount.value |
| | | rootViewModel.answerCount.accept(v + 1) |
| | | } |
| | | } |
| | | |
| | | override func setUI() { |
| | | super.setUI() |
| | | |
| | | if !view.subviews.contains(collectionView){ |
| | | collectionView.delegate = self |
| | | collectionView.dataSource = self |
| | | collectionView.backgroundColor = UIColor(hexStr: "#C3BFB3") |
| | | view.addSubview(collectionView) |
| | | collectionView.snp.makeConstraints { make in |
| | | make.top.equalTo(self.view.safeAreaLayoutGuide.snp.top).offset(101) |
| | | make.left.equalTo(194) |
| | | make.right.equalTo(-194) |
| | | make.bottom.equalToSuperview() |
| | | } |
| | | } |
| | | |
| | | if menuView == nil{ |
| | | menuView = VoiceHandleView() |
| | | view.addSubview(menuView!) |
| | | menuView?.snp.makeConstraints { make in |
| | | make.top.equalTo(self.view.safeAreaLayoutGuide.snp.top).offset(24) |
| | | make.centerX.equalToSuperview() |
| | | make.height.equalTo(52) |
| | | make.width.equalTo(159) |
| | | } |
| | | }else{ |
| | | menuView?.snp.remakeConstraints { make in |
| | | make.top.equalTo(self.view.safeAreaLayoutGuide.snp.top).offset(24) |
| | | make.centerX.equalToSuperview() |
| | | make.height.equalTo(52) |
| | | make.width.equalTo(159) |
| | | } |
| | | } |
| | | |
| | | collectionView.reloadData() |
| | | } |
| | | |
| | | override func viewDidLayoutSubviews() { |
| | | super.viewDidLayoutSubviews() |
| | | let flowLayout = self.collectionView.collectionViewLayout as! UICollectionViewFlowLayout |
| | | let w = (self.collectionView.size.width - flowLayout.minimumLineSpacing) / 2 |
| | | let h = (self.collectionView.size.height - flowLayout.minimumInteritemSpacing) / 2 |
| | | |
| | | if flowLayout.itemSize.width != w || flowLayout.itemSize.height != h{ |
| | | flowLayout.itemSize = CGSize(width: w, height: h) |
| | | collectionView.reloadData() |
| | | } |
| | | } |
| | | |
| | | override func setRx() { |
| | | viewModel.selectIndex.subscribe(onNext: {[weak self] index in |
| | | guard let weakSelf = self else { return } |
| | | guard let index = index else { return } |
| | | if weakSelf.viewModel.answerType.value == .success {return} |
| | | //判断选中是否正确逻辑 |
| | | if let cell = self?.collectionView.dequeueReusableCell(withReuseIdentifier: "_ListenFight_lesson_1_CCell", for: index) as? ListenFight_lesson_1_CCell{ |
| | | var answer:Fight_lessonType = .none |
| | | if self?.randomElement?.id == weakSelf.listenNewModel.subjectList[weakSelf.page][index.row].id{ |
| | | answer = .success |
| | | self?.randomElement?.isAnster = true |
| | | self?.isListen = false |
| | | if self?.isAnsterComplete == false{ |
| | | self?.rootViewModel.correctNum += 1 |
| | | } |
| | | self?.isAnsterComplete = true |
| | | |
| | | VoicePlayer.share().playSuccessVoice() |
| | | |
| | | let teamId = weakSelf.listenNewModel.data?.id.components(separatedBy: ",")[weakSelf.page] |
| | | weakSelf.rootViewModel.insertCorrectAnswer(teamId: teamId, answerId: weakSelf.listenNewModel.subjectList[weakSelf.page][index.row].id) |
| | | |
| | | DispatchQueue.main.asyncAfter(deadline: .now()+2) { |
| | | VoicePlayer.share().playerAt(url: weakSelf.listenNewModel.subjectList[weakSelf.page][index.row].correct) |
| | | } |
| | | }else{ |
| | | answer = .fail |
| | | VoicePlayer.share().playFailVoice() |
| | | self?.isListen = false |
| | | if self?.isAnsterComplete == false{ |
| | | self?.rootViewModel.errorNum += 1 |
| | | } |
| | | } |
| | | |
| | | switch answer { |
| | | case .success: |
| | | self?.viewModel.answerType.accept(.success) |
| | | self?.answerSuccess(cell) |
| | | case .fail: |
| | | self?.viewModel.answerType.accept(.fail) |
| | | self?.collectionView.reloadData() |
| | | default:break |
| | | } |
| | | } |
| | | }).disposed(by: disposeBag) |
| | | } |
| | | |
| | | //回答正确 |
| | | private func answerSuccess(_ cell:ListenFight_lesson_1_CCell){ |
| | | menuView?.snp.removeConstraints() |
| | | menuView?.playing() |
| | | menuView?.jq_cornerRadius = 0 |
| | | let v = cell.view_topHandle.convert(cell.bounds, to: self.view) |
| | | UIView.animate(withDuration: 0.3) { |
| | | self.menuView?.snp.updateConstraints { make in |
| | | make.top.equalTo(self.view).offset(v.origin.y + UIDevice.jq_safeEdges.top + 101 + 50) |
| | | make.left.equalToSuperview().offset(v.origin.x + 194) |
| | | make.width.equalTo(v.size.width - 10) |
| | | make.height.equalTo(40) |
| | | } |
| | | self.view.layoutIfNeeded() |
| | | }completion: { _ in |
| | | self.collectionView.reloadData() |
| | | } |
| | | } |
| | | func handleClouseAction(clouse:@escaping ()->Void){ |
| | | self.handleClouse = clouse |
| | | } |
| | | } |
| | | |
| | | extension HomeListenFight_lesson_1_VC:UICollectionViewDelegate{ |
| | | func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { |
| | | if !isListen{ |
| | | alertError(msg: "请先听题");return |
| | | } |
| | | viewModel.selectIndex.accept(indexPath) |
| | | } |
| | | func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { |
| | | if !isListen{ |
| | | alertError(msg: "请先听题");return |
| | | } |
| | | viewModel.selectIndex.accept(indexPath) |
| | | } |
| | | } |
| | | |
| | | extension HomeListenFight_lesson_1_VC:UICollectionViewDataSource{ |
| | | func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { |
| | | 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 |
| | | func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { |
| | | 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 == indexPath{ |
| | | cell.setState(state: viewModel.answerType.value) |
| | | }else{ |
| | | cell.setState(state: .none) |
| | | } |
| | | cell.setListen1SubModel(listenNewModel.subjectList[page][indexPath.row]) |
| | | return cell |
| | | } |
| | | if viewModel.selectIndex.value == indexPath{ |
| | | cell.setState(state: viewModel.answerType.value) |
| | | }else{ |
| | | cell.setState(state: .none) |
| | | } |
| | | cell.setListen1SubModel(listenNewModel.subjectList[page][indexPath.row]) |
| | | return cell |
| | | } |
| | | |
| | | func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { |
| | | return listenNewModel.subjectList[page].count |
| | | } |
| | | func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { |
| | | return listenNewModel.subjectList[page].count |
| | | } |
| | | } |
| | | |
| | | extension HomeListenFight_lesson_1_VC:VoicePlayerDelegate{ |
| | | func playing() { |
| | | isListen = false |
| | | self.view.isUserInteractionEnabled = false |
| | | } |
| | | func playing() { |
| | | isListen = false |
| | | self.view.isUserInteractionEnabled = false |
| | | } |
| | | |
| | | func playComplete() { |
| | | isListen = true |
| | | self.view.isUserInteractionEnabled = true |
| | | self.menuView?.resetView() |
| | | func playComplete() { |
| | | isListen = true |
| | | self.view.isUserInteractionEnabled = true |
| | | self.menuView?.resetView() |
| | | |
| | | if isAnsterComplete{ |
| | | getNextAnswer() |
| | | } |
| | | } |
| | | if isAnsterComplete{ |
| | | getNextAnswer() |
| | | } |
| | | } |
| | | } |