| | |
| | | import QMUIKit |
| | | |
| | | class HomeListenFight_lesson_2_VC: BaseVC { |
| | | |
| | | private var viewModel = FightAnswerViewModel() |
| | | private var listenNewModel:ListenNewModel! |
| | | private var page:Int! |
| | | var rootViewModel:HomeListenFightViewModel! |
| | | var teamScheduleModel:TeamScheduleModel? |
| | | private var tempViews = [StudyHandleView]() |
| | | |
| | | private var playedIndex = Set<Int>() //已经播放过的view |
| | | private var voicePlayer = VoicePlayer.share() |
| | | private var isAnsterModel = Set<Listen1SubModel>() |
| | | |
| | | private var viewModel = FightAnswerViewModel() |
| | | private var listenNewModel:ListenNewModel! |
| | | private var page:Int! |
| | | var rootViewModel:HomeListenFightViewModel! |
| | | var teamScheduleModel:TeamScheduleModel? |
| | | private var tempViews = [StudyHandleView]() |
| | | |
| | | private var playedIndex = Set<Int>() //已经播放过的view |
| | | private var voicePlayer = VoicePlayer.share() |
| | | private var isAnsterModel = Set<Listen1SubModel>() |
| | | private var isOpen:Bool = false //是否展示标题文本 |
| | | |
| | | private lazy var stackView:UIStackView = { |
| | | let stackView = UIStackView() |
| | | stackView.spacing = 78 |
| | | stackView.distribution = .equalSpacing |
| | | return stackView |
| | | }() |
| | | |
| | | 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 |
| | | }() |
| | | |
| | | |
| | | 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() |
| | | |
| | | private var studieds = 0 |
| | | private var handleClouse:(()->Void)? |
| | | |
| | | private lazy var stackView:UIStackView = { |
| | | let stackView = UIStackView() |
| | | stackView.spacing = 78 |
| | | stackView.distribution = .equalSpacing |
| | | return stackView |
| | | }() |
| | | |
| | | 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 |
| | | }() |
| | | |
| | | |
| | | 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() |
| | | |
| | | Services.getIsOpen().subscribe(onNext: {data in |
| | | self.isOpen = data.data ?? false |
| | | self.collectionView.reloadData() |
| | | }).disposed(by: disposeBag) |
| | | |
| | | |
| | | //回传记录,始终保持答题进度 |
| | | if let team = teamScheduleModel{ |
| | | for teamId in team.teamIds{ |
| | | for v in listenNewModel.subjectList[page]{ |
| | | if team.topicIds.contains(v.id){ |
| | | rootViewModel.insertCorrectAnswer(teamId: "\(teamId)", answerId: v.id) |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | 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(){ |
| | | playedIndex.removeAll() |
| | | tempViews.removeAll() |
| | | |
| | | for subView in view.subviews{ |
| | | if subView is StudyHandleView{ |
| | | subView.removeFromSuperview() |
| | | } |
| | | } |
| | | setUI() |
| | | 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 setUI() { |
| | | super.setUI() |
| | | |
| | | viewModel.selectIndex.accept(IndexPath(row: 0, section: 0)) |
| | | |
| | | 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 !view.subviews.contains(stackView){ |
| | | view.addSubview(stackView) |
| | | } |
| | | |
| | | stackView.snp.makeConstraints { make in |
| | | make.top.equalTo(self.view.safeAreaLayoutGuide.snp.top).offset(24) |
| | | make.centerX.equalToSuperview() |
| | | make.height.equalTo(52) |
| | | make.width.greaterThanOrEqualTo(100) |
| | | } |
| | | |
| | | addStackView() |
| | | |
| | | } |
| | | |
| | | private func addStackView(){ |
| | | |
| | | for subV in stackView.arrangedSubviews{ |
| | | subV.removeFromSuperview() |
| | | } |
| | | tempViews.removeAll() |
| | | |
| | | for index in 0...2{ |
| | | let handleView = StudyHandleView.jq_loadNibView() |
| | | handleView.listenType = .lesson2 |
| | | handleView.view_choose.alpha = 0 |
| | | handleView.btn_choose.tag = 10 + index |
| | | handleView.tag = 20 + index |
| | | |
| | | let row = viewModel.selectIndex.value!.row |
| | | let model = listenNewModel.subjectList[page][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.playAt {[weak self] index in |
| | | self?.playedIndex.insert(index) |
| | | } |
| | | |
| | | |
| | | handleView.chooseClouse {[weak self] btn in |
| | | guard let weakSelf = self else { return } |
| | | if weakSelf.playedIndex.count != 3{ |
| | | handleView.btn_choose.isSelected = false |
| | | alertError(msg: "请听完");return |
| | | } |
| | | handleView.view_choose.alpha = 1 |
| | | var lessionType:Fight_lessonType = .none |
| | | if handleView.vioceSoundUrl == weakSelf.listenNewModel.subjectList[weakSelf.page][row].correct{ |
| | | lessionType = .success |
| | | weakSelf.voicePlayer.playSuccessVoice() |
| | | let teamId = weakSelf.listenNewModel.data?.id.components(separatedBy: ",")[weakSelf.page] |
| | | let answerId = weakSelf.listenNewModel.subjectList[weakSelf.page][row].id |
| | | weakSelf.rootViewModel.insertCorrectAnswer(teamId: teamId, answerId: answerId) |
| | | }else{ |
| | | lessionType = .fail |
| | | // 重置按钮至最初样式 |
| | | weakSelf.playedIndex.removeAll() |
| | | for sub in weakSelf.stackView.arrangedSubviews as! [StudyHandleView]{ |
| | | sub.btn_pay.isEnabled = true |
| | | sub.btn_choose.isEnabled = true |
| | | sub.resetView() |
| | | sub.view_choose.alpha = 0 |
| | | } |
| | | weakSelf.voicePlayer.playFailVoice() |
| | | } |
| | | |
| | | 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) { |
| | | handleView.btn_state.alpha = 1 |
| | | } |
| | | |
| | | let i = ceil(handleView.x / 300).int |
| | | if let cell = self?.collectionView.dequeueReusableCell(withReuseIdentifier: "_ListenFight_lesson_1_CCell", for: self!.viewModel.selectIndex.value!) as? ListenFight_lesson_1_CCell{ |
| | | self?.viewModel.answerType.accept(.success) |
| | | self?.answerSuccess(cell,index: i) |
| | | } |
| | | 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 |
| | | } |
| | | UIView.animate(withDuration: 0.5, delay: 1.2, options: .layoutSubviews) { |
| | | handleView.btn_pay.alpha = 1 |
| | | handleView.btn_voice.alpha = 1 |
| | | handleView.btn_state.alpha = 0 |
| | | } completion: { _ in |
| | | handleView.btn_choose.isSelected = false |
| | | } |
| | | default: |
| | | handleView.btn_state.setImage(nil, for: .normal) |
| | | } |
| | | } |
| | | |
| | | handleView.snp.makeConstraints { make in |
| | | make.height.equalTo(52) |
| | | make.width.greaterThanOrEqualTo(221) |
| | | } |
| | | tempViews.append(handleView) |
| | | } |
| | | |
| | | tempViews.shuffle() //乱序 |
| | | stackView.addArrangedSubviews(tempViews) |
| | | } |
| | | |
| | | private func answerSuccess(_ cell:ListenFight_lesson_1_CCell,index:Int){ |
| | | |
| | | let studyHandleView = stackView.arrangedSubviews[index] as! StudyHandleView |
| | | |
| | | let bounds = studyHandleView.convert(studyHandleView.bounds, to: self.view) |
| | | |
| | | //copy试图放在上面进行覆盖 |
| | | let copyHandleView = studyHandleView.copyView() |
| | | copyHandleView.view_choose.isHidden = true |
| | | copyHandleView.listenType = .lesson2 |
| | | copyHandleView.isplaying() |
| | | copyHandleView.vioceSoundUrl = listenNewModel.subjectList[page][self.viewModel.selectIndex.value!.row].correct |
| | | copyHandleView.jq_cornerRadius = 0 |
| | | view.addSubview(copyHandleView) |
| | | view.layoutIfNeeded() |
| | | |
| | | copyHandleView.snp.makeConstraints { make in |
| | | make.top.equalToSuperview().offset(bounds.origin.y) |
| | | make.left.equalToSuperview().offset(bounds.origin.x) |
| | | make.width.equalTo(159) |
| | | make.height.equalTo(52) |
| | | } |
| | | |
| | | view.layoutIfNeeded() |
| | | |
| | | let v = cell.view_topHandle.convert(cell.bounds, to: self.view) |
| | | UIView.animate(withDuration: 0.6) { |
| | | copyHandleView.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: { complete in |
| | | if complete{ |
| | | self.voicePlayer.playerAt(url: self.listenNewModel.subjectList[self.page][self.viewModel.selectIndex.value!.row].correct) |
| | | } |
| | | } |
| | | } |
| | | |
| | | private func resetStackView(){ |
| | | playedIndex.removeAll() |
| | | let newRow = viewModel.selectIndex.value!.row+1 |
| | | if newRow >= listenNewModel.subjectList[page].count{ //防止坐标越界 |
| | | NotificationCenter.default.post(name: NextLession_Noti, object: nil);return |
| | | } |
| | | |
| | | collectionView.reloadData() |
| | | viewModel.selectIndex.accept(IndexPath(row: newRow, section: 0)) |
| | | addStackView() |
| | | } |
| | | |
| | | override func setRx() {} |
| | | |
| | | |
| | | //回传记录,始终保持答题进度 |
| | | if let team = teamScheduleModel{ |
| | | for teamId in team.teamIds{ |
| | | for v in listenNewModel.subjectList[page]{ |
| | | if team.topicIds.contains(v.id){ |
| | | rootViewModel.insertCorrectAnswer(teamId: "\(teamId)", answerId: v.id) |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | 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(){ |
| | | playedIndex.removeAll() |
| | | tempViews.removeAll() |
| | | |
| | | for subView in view.subviews{ |
| | | if subView is StudyHandleView{ |
| | | subView.removeFromSuperview() |
| | | } |
| | | } |
| | | setUI() |
| | | 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 setUI() { |
| | | super.setUI() |
| | | |
| | | viewModel.selectIndex.accept(IndexPath(row: 0, section: 0)) |
| | | |
| | | 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 !view.subviews.contains(stackView){ |
| | | view.addSubview(stackView) |
| | | } |
| | | |
| | | stackView.snp.makeConstraints { make in |
| | | make.top.equalTo(self.view.safeAreaLayoutGuide.snp.top).offset(24) |
| | | make.centerX.equalToSuperview() |
| | | make.height.equalTo(40) |
| | | make.width.greaterThanOrEqualTo(125) |
| | | } |
| | | |
| | | addStackView() |
| | | } |
| | | |
| | | private func addStackView(){ |
| | | |
| | | for subV in stackView.arrangedSubviews{ |
| | | subV.removeFromSuperview() |
| | | } |
| | | tempViews.removeAll() |
| | | |
| | | for index in 0...2{ |
| | | let handleView = StudyHandleView.jq_loadNibView() |
| | | handleView.listenType = .lesson2 |
| | | handleView.view_choose.alpha = 0 |
| | | handleView.btn_choose.tag = 10 + index |
| | | handleView.tag = 20 + index |
| | | |
| | | let row = viewModel.selectIndex.value!.row |
| | | let model = listenNewModel.subjectList[page][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.playAt {[weak self] index in |
| | | self?.playedIndex.insert(index) |
| | | } |
| | | |
| | | |
| | | handleView.chooseClouse {[weak self] btn in |
| | | guard let weakSelf = self else { return } |
| | | if weakSelf.playedIndex.count < 3{ |
| | | handleView.btn_choose.isSelected = false |
| | | alertError(msg: "请听完");return |
| | | } |
| | | handleView.view_choose.alpha = 1 |
| | | var lessionType:Fight_lessonType = .none |
| | | if handleView.vioceSoundUrl == weakSelf.listenNewModel.subjectList[weakSelf.page][row].correct{ |
| | | lessionType = .success |
| | | weakSelf.voicePlayer.playSuccessVoice() |
| | | let teamId = weakSelf.listenNewModel.data?.id.components(separatedBy: ",")[weakSelf.page] |
| | | let answerId = weakSelf.listenNewModel.subjectList[weakSelf.page][row].id |
| | | weakSelf.rootViewModel.insertCorrectAnswer(teamId: teamId, answerId: answerId) |
| | | }else{ |
| | | lessionType = .fail |
| | | // 重置按钮至最初样式 |
| | | weakSelf.playedIndex.removeAll() |
| | | for sub in weakSelf.stackView.arrangedSubviews as! [StudyHandleView]{ |
| | | sub.btn_pay.isEnabled = true |
| | | sub.btn_choose.isEnabled = true |
| | | sub.resetView() |
| | | sub.view_choose.alpha = 0 |
| | | } |
| | | weakSelf.voicePlayer.playFailVoice() |
| | | } |
| | | |
| | | 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) { |
| | | handleView.btn_state.alpha = 1 |
| | | } |
| | | |
| | | let i = ceil(handleView.x / 300).int |
| | | if let cell = self?.collectionView.cellForItem(at: self!.viewModel.selectIndex.value!) as? ListenFight_lesson_1_CCell{ |
| | | self?.viewModel.answerType.accept(.success) |
| | | self?.answerSuccess(cell,index: i) |
| | | |
| | | if let data = self?.listenNewModel.list[self!.page]{ |
| | | Services.answerQuestion(id: data.id, status: 2).subscribe(onNext: {_ in |
| | | self?.handleClouse?() |
| | | }).disposed(by: weakSelf.disposeBag) |
| | | } |
| | | } |
| | | 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 |
| | | } |
| | | UIView.animate(withDuration: 0.5, delay: 1.2, options: .layoutSubviews) { |
| | | handleView.btn_pay.alpha = 1 |
| | | handleView.btn_voice.alpha = 1 |
| | | handleView.btn_state.alpha = 0 |
| | | } completion: { _ in |
| | | handleView.btn_choose.isSelected = false |
| | | } |
| | | |
| | | if let data = self?.listenNewModel.list[self!.page]{ |
| | | Services.answerQuestion(id: data.id, status: 3).subscribe(onNext: {_ in |
| | | self?.handleClouse?() |
| | | }).disposed(by: weakSelf.disposeBag) |
| | | } |
| | | |
| | | |
| | | default: |
| | | handleView.btn_state.setImage(nil, for: .normal) |
| | | } |
| | | } |
| | | |
| | | handleView.snp.makeConstraints { make in |
| | | make.height.equalTo(52) |
| | | make.width.greaterThanOrEqualTo(221) |
| | | } |
| | | tempViews.append(handleView) |
| | | } |
| | | |
| | | tempViews.shuffle() //乱序 |
| | | stackView.addArrangedSubviews(tempViews) |
| | | |
| | | DispatchQueue.main.asyncAfter(deadline: .now()+1) { |
| | | let temp = self.tempViews.first |
| | | temp?.isplaying() |
| | | self.voicePlayer.playerAt(url: temp?.vioceSoundUrl ?? "") |
| | | self.playedIndex.insert(0) |
| | | self.collectionView.reloadData() |
| | | } |
| | | } |
| | | |
| | | private func answerSuccess(_ cell:ListenFight_lesson_1_CCell,index:Int){ |
| | | studieds += 1 |
| | | let studyHandleView = stackView.arrangedSubviews[index] as! StudyHandleView |
| | | |
| | | let bounds = studyHandleView.convert(studyHandleView.bounds, to: self.view) |
| | | |
| | | //copy试图放在上面进行覆盖 |
| | | let copyHandleView = studyHandleView.copyView() |
| | | copyHandleView.view_choose.isHidden = true |
| | | copyHandleView.listenType = .lesson2 |
| | | copyHandleView.isplaying() |
| | | copyHandleView.vioceSoundUrl = listenNewModel.subjectList[page][self.viewModel.selectIndex.value!.row].correct |
| | | copyHandleView.jq_cornerRadius = 0 |
| | | view.addSubview(copyHandleView) |
| | | view.layoutIfNeeded() |
| | | |
| | | copyHandleView.snp.makeConstraints { make in |
| | | make.top.equalToSuperview().offset(bounds.origin.y) |
| | | make.left.equalToSuperview().offset(bounds.origin.x) |
| | | make.width.equalTo(159) |
| | | make.height.equalTo(52) |
| | | } |
| | | |
| | | view.layoutIfNeeded() |
| | | |
| | | let v = cell.view_topHandle.convert(cell.bounds, to: self.view) |
| | | UIView.animate(withDuration: 0.6) { |
| | | copyHandleView.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: { complete in |
| | | if complete{ |
| | | self.voicePlayer.playerAt(url: self.listenNewModel.subjectList[self.page][self.viewModel.selectIndex.value!.row].correct) |
| | | } |
| | | } |
| | | } |
| | | |
| | | private func resetStackView(){ |
| | | playedIndex.removeAll() |
| | | let newRow = viewModel.selectIndex.value!.row+1 |
| | | if newRow >= listenNewModel.subjectList[page].count{ //防止坐标越界 |
| | | NotificationCenter.default.post(name: NextLession_Noti, object: nil);return |
| | | } |
| | | |
| | | collectionView.reloadData() |
| | | viewModel.selectIndex.accept(IndexPath(row: newRow, section: 0)) |
| | | addStackView() |
| | | } |
| | | |
| | | override func setRx() { |
| | | NotificationCenter.default.rx.notification(ResetLession_Noti).take(until: self.rx.deallocated).subscribe(onNext: {[weak self]_ in |
| | | self?.restore() |
| | | self?.viewDidLoad() |
| | | }).disposed(by: disposeBag) |
| | | } |
| | | |
| | | func handleClouseAction(clouse:@escaping ()->Void){ |
| | | self.handleClouse = clouse |
| | | } |
| | | } |
| | | |
| | | extension HomeListenFight_lesson_2_VC:UICollectionViewDelegate{ |
| | | func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { |
| | | viewModel.selectIndex.accept(indexPath) |
| | | } |
| | | func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { |
| | | viewModel.selectIndex.accept(indexPath) |
| | | } |
| | | } |
| | | |
| | | extension HomeListenFight_lesson_2_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 |
| | | |
| | | if viewModel.selectIndex.value?.row == indexPath.row && isOpen{ |
| | | cell.label_title.isHidden = false |
| | | }else{ |
| | | cell.label_title.isHidden = true |
| | | } |
| | | |
| | | cell.setListen1SubModel(listenNewModel.subjectList[page][indexPath.row]) |
| | | cell.label_title.text = listenNewModel.subjectList[page][indexPath.row].name |
| | | return cell |
| | | } |
| | | |
| | | func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { |
| | | return listenNewModel.subjectList[page].count |
| | | } |
| | | |
| | | 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) |
| | | |
| | | if indexPath.row == studieds{ |
| | | cell.backgroundColor = .orange |
| | | }else{ |
| | | cell.backgroundColor = .white |
| | | } |
| | | |
| | | |
| | | |
| | | // if viewModel.selectIndex.value?.row == indexPath.row && isOpen{ |
| | | // cell.label_title.isHidden = false |
| | | // }else{ |
| | | cell.label_title.isHidden = true |
| | | // } |
| | | |
| | | cell.setListen1SubModel(listenNewModel.subjectList[page][indexPath.row]) |
| | | cell.label_title.text = listenNewModel.subjectList[page][indexPath.row].name |
| | | return cell |
| | | } |
| | | |
| | | func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { |
| | | return listenNewModel.subjectList[page].count |
| | | } |
| | | |
| | | func numberOfSections(in collectionView: UICollectionView) -> Int { |
| | | return 1 |
| | | } |
| | | } |
| | | |
| | | extension HomeListenFight_lesson_2_VC:VoicePlayerDelegate{ |
| | | func playing() { |
| | | view.isUserInteractionEnabled = false |
| | | print("正在播放") |
| | | //正在播放中,其他播放按钮先禁止 |
| | | for sub in stackView.arrangedSubviews as! [StudyHandleView]{ |
| | | sub.btn_pay.isEnabled = false |
| | | sub.btn_choose.isEnabled = false |
| | | } |
| | | } |
| | | |
| | | func playComplete() { |
| | | view.isUserInteractionEnabled = true |
| | | //对已经播放过的View,进行刷新 |
| | | for sub in stackView.arrangedSubviews as! [StudyHandleView]{ |
| | | sub.btn_pay.isEnabled = true |
| | | sub.btn_choose.isEnabled = true |
| | | if playedIndex.contains(sub.tag){ |
| | | sub.resetView() |
| | | sub.view_choose.alpha = playedIndex.contains(sub.tag) ? 1:0 |
| | | |
| | | } |
| | | } |
| | | |
| | | |
| | | for sub in view.subviews{ |
| | | if let v = sub as? StudyHandleView{ |
| | | v.resetView() |
| | | } |
| | | } |
| | | |
| | | |
| | | if viewModel.answerType.value == .success{ |
| | | let v = rootViewModel.answerCount.value |
| | | rootViewModel.answerCount.accept(v + 1) |
| | | viewModel.answerType.accept(.none) |
| | | |
| | | for sub in stackView.arrangedSubviews as! [StudyHandleView]{ |
| | | sub.btn_pay.isEnabled = false |
| | | sub.btn_choose.isEnabled = false |
| | | } |
| | | |
| | | DispatchQueue.main.asyncAfter(deadline: .now()+2) { |
| | | |
| | | |
| | | self.resetStackView() |
| | | } |
| | | } |
| | | |
| | | } |
| | | func playing() { |
| | | view.isUserInteractionEnabled = false |
| | | print("正在播放") |
| | | //正在播放中,其他播放按钮先禁止 |
| | | for sub in stackView.arrangedSubviews as! [StudyHandleView]{ |
| | | sub.btn_pay.isEnabled = false |
| | | sub.btn_choose.isEnabled = false |
| | | } |
| | | } |
| | | |
| | | func playComplete() { |
| | | collectionView.reloadData() |
| | | view.isUserInteractionEnabled = true |
| | | //对已经播放过的View,进行刷新 |
| | | for sub in stackView.arrangedSubviews as! [StudyHandleView]{ |
| | | sub.btn_pay.isEnabled = true |
| | | sub.btn_choose.isEnabled = true |
| | | if playedIndex.contains(sub.tag){ |
| | | sub.resetView() |
| | | sub.view_choose.alpha = playedIndex.contains(sub.tag) ? 1:0 |
| | | } |
| | | } |
| | | |
| | | |
| | | for sub in view.subviews{ |
| | | if let v = sub as? StudyHandleView{ |
| | | v.resetView() |
| | | } |
| | | } |
| | | |
| | | for v in tempViews{ |
| | | if v.isplayend{ |
| | | v.resetView() |
| | | } |
| | | } |
| | | |
| | | for (i,v) in tempViews.enumerated(){ |
| | | if v.isplayend == false{ |
| | | self.playedIndex.insert(i) |
| | | v.isplaying() |
| | | voicePlayer.playerAt(url: v.vioceSoundUrl) |
| | | break |
| | | } |
| | | } |
| | | |
| | | |
| | | if viewModel.answerType.value == .success{ |
| | | let v = rootViewModel.answerCount.value |
| | | rootViewModel.answerCount.accept(v + 1) |
| | | viewModel.answerType.accept(.none) |
| | | |
| | | for sub in stackView.arrangedSubviews as! [StudyHandleView]{ |
| | | sub.btn_pay.isEnabled = false |
| | | sub.btn_choose.isEnabled = false |
| | | } |
| | | |
| | | DispatchQueue.main.asyncAfter(deadline: .now()+2) { |
| | | self.resetStackView() |
| | | } |
| | | } |
| | | |
| | | } |
| | | } |