//
|
// HomeListenFight_lesson_1_VC.swift
|
// DolphinEnglishLearnStudent
|
//
|
// Created by 无故事王国 on 2024/5/24.
|
//
|
|
import UIKit
|
import JQTools
|
import RxRelay
|
|
class FightAnswerViewModel{
|
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 isAnsterModel = [Listen1SubModel]()
|
|
private var menuView:VoiceHandleView?
|
private var handleClouse:(()->Void)?
|
|
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()
|
|
//回传记录,始终保持答题进度
|
// if let team = teamScheduleModel{
|
// let v = team.schedule - 1
|
// for i in 0..<v{
|
// isAnsterModel.append(listenNewModel.subjectList[page][i])
|
// }
|
// }
|
|
getNextAnswer(isFirst: true)
|
menuView?.listenType = .lesson1
|
|
rootViewModel.currentPage.subscribe(onNext: {[unowned self] cpage in
|
if cpage == self.page{
|
self.restore()
|
self.randomElement = self.listenNewModel.subjectList[self.page].randomElement() //随机抽题
|
DispatchQueue.main.asyncAfter(deadline: .now()+2) {
|
VoicePlayer.share().playerAt(url: self.randomElement?.correct)
|
self.menuView?.playing()
|
}
|
}
|
}).disposed(by: disposeBag)
|
|
|
}
|
|
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()
|
// 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}
|
|
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()+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!){
|
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)
|
|
weakSelf.isAnsterModel.append(weakSelf.listenNewModel.subjectList[weakSelf.page][index.row])
|
|
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()
|
}
|
}
|
|
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)
|
}
|
}
|
|
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
|
|
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
|
}
|
}
|
|
extension HomeListenFight_lesson_1_VC:VoicePlayerDelegate{
|
func playing() {
|
isListen = false
|
self.view.isUserInteractionEnabled = false
|
}
|
|
func playComplete() {
|
isListen = true
|
self.view.isUserInteractionEnabled = true
|
self.menuView?.resetView()
|
|
if isAnsterComplete{
|
getNextAnswer()
|
}
|
}
|
}
|