//
|
// HomeListenFight_lesson_4_VC.swift
|
// DolphinEnglishLearnStudent
|
//
|
// Created by 无故事王国 on 2024/5/28.
|
//
|
|
import UIKit
|
|
class HomeListenFight_lesson_4_VC: BaseVC {
|
|
private var viewModel = FightAnswerViewModel()
|
|
private var listenNewModel:ListenNewModel!
|
private var page:Int!
|
var rootViewModel:HomeListenFightViewModel!
|
|
private var answerIndex:IndexPath? //答案的Index
|
private var answerCount:Int = 0 //回答计数
|
private var answerIndexs = Set<IndexPath>() //回答过的Index集合
|
private var filterItems = [[Listen1SubModel]]() //此类型特殊,需要数据清理
|
// private var isPlayedAnsterSet = Set<Int>() //已经播放了的
|
|
private lazy var stackView:UIStackView = {
|
let sta = UIStackView()
|
sta.spacing = 41
|
sta.distribution = .equalSpacing
|
sta.axis = .vertical
|
return sta
|
}()
|
|
private lazy var collectionView:UICollectionView = {
|
let flowLayout = UICollectionViewFlowLayout()
|
let w = (JQ_ScreenW - 164 * 2 - 62) / 2.0
|
flowLayout.itemSize = CGSize(width: w, height: w * 0.842)
|
flowLayout.minimumInteritemSpacing = 0
|
flowLayout.scrollDirection = .vertical
|
let collection = UICollectionView(frame: .zero, collectionViewLayout: flowLayout)
|
collection.contentInset = UIEdgeInsets(top: 33, left: 0, bottom: 0, right: 0)
|
collection.register(UINib(nibName: "ListenFight_lesson_4_CCell", bundle: nil), forCellWithReuseIdentifier: "_ListenFight_lesson_4_CCell")
|
collection.register(UICollectionReusableView.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "header")
|
collection.isScrollEnabled = false
|
return collection
|
}()
|
|
private var voicePlayer = VoicePlayer.share()
|
|
required init(page:Int,listenNewModel:ListenNewModel){
|
super.init(nibName: nil, bundle: nil)
|
self.page = page
|
self.listenNewModel = listenNewModel
|
let temp1 = Array(listenNewModel.subjectList[page][0...1])
|
let temp2 = Array(listenNewModel.subjectList[page][2...3])
|
|
filterItems.append(temp1)
|
filterItems.append(temp2)
|
}
|
|
required init?(coder: NSCoder) {
|
fatalError("init(coder:) has not been implemented")
|
}
|
|
func restore(){
|
answerIndexs.removeAll()
|
answerCount = 0
|
answerIndex = nil
|
for subView in view.subviews{
|
if subView is Lesson_4_AnswerView{
|
subView.removeFromSuperview()
|
}
|
}
|
|
setUI()
|
collectionView.reloadData()
|
}
|
|
override func viewDidLoad() {
|
super.viewDidLoad()
|
}
|
|
override func viewDidAppear(_ animated: Bool) {
|
super.viewDidAppear(animated)
|
voicePlayer.delegate = self
|
}
|
|
override func viewDidDisappear(_ animated: Bool) {
|
super.viewDidDisappear(animated)
|
voicePlayer.delegate = nil
|
VoicePlayer.share().playerInterrupt()
|
}
|
|
|
override func setUI() {
|
super.setUI()
|
|
if !view.subviews.contains(collectionView){
|
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(0)
|
make.left.equalTo(164)
|
make.width.equalTo(JQ_ScreenW - 164 * 2)
|
make.bottom.equalToSuperview()
|
}
|
}
|
|
override func viewDidLayoutSubviews() {
|
super.viewDidLayoutSubviews()
|
let flowLayout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout
|
|
let w = (collectionView.size.width - flowLayout.minimumLineSpacing) / 2
|
let h = (collectionView.size.height - flowLayout.minimumInteritemSpacing) / 2.1
|
|
if flowLayout.itemSize.width != w || flowLayout.itemSize.height != h{
|
flowLayout.itemSize = CGSize(width: w, height: h)
|
collectionView.reloadData()
|
}
|
}
|
|
private func setAnswerStackView(){
|
|
guard let selectIndex = viewModel.selectIndex.value else{
|
alertError(msg: "请先听题");return
|
}
|
|
for v in stackView.subviews{
|
v.removeFromSuperview()
|
}
|
|
if !view.subviews.contains(stackView){
|
view.addSubview(stackView)
|
stackView.snp.makeConstraints { make in
|
make.right.equalToSuperview().offset(-14)
|
make.centerY.equalToSuperview()
|
}
|
}
|
|
let answerModel = filterItems[selectIndex.section].filter({$0.isQuestion == 0}).first!
|
let answerId = answerModel.id
|
|
var tempVoiceArray = [String]()
|
for v in filterItems[selectIndex.section]{
|
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.tag = 20 + i
|
answerView.voiceUrl = tempVoiceArray[i]
|
answerView.btn_isAnswer.setImage(viewModel.selectIndex.value?.row == 1 ? UIImage(named: "icon_question"):UIImage(named: "icon_answer"), for: .normal)
|
answerView.btn_choose.addTarget(self, action: #selector(answerAction), for: .touchUpInside)
|
answerView.alpha = 0
|
answerView.snp.makeConstraints { make in
|
make.width.equalTo(221)
|
make.height.equalTo(52)
|
}
|
answerView.btn_choose.isEnabled = false
|
answerView.playAt { index in
|
answerView.btn_choose.isEnabled = true
|
}
|
|
UIView.animate(withDuration: 0.05 + Double(i)) {
|
answerView.alpha = 1
|
}
|
|
stackView.insertArrangedSubview(answerView, at: 0)
|
}
|
}
|
|
@objc func answerAction(btn:UIButton){
|
|
var islistenDone:Int = 0
|
for v in stackView.arrangedSubviews as! [Lesson_4_AnswerView]{
|
if v.btn_choose.isEnabled == true{
|
islistenDone += 1
|
}
|
}
|
|
if islistenDone != 3{
|
alertError(msg: "请先听完");return
|
}
|
|
guard let selectIndex = viewModel.selectIndex.value else{
|
alertError(msg: "请先听题");return
|
}
|
|
var tempSubV:Lesson_4_AnswerView?
|
|
for subV in stackView.arrangedSubviews{
|
if let s = subV as? Lesson_4_AnswerView{
|
s.btn_choose.isSelected = btn.tag == s.btn_choose.tag
|
if s.btn_choose.isSelected{tempSubV = s}
|
}
|
}
|
|
var answerModel:Listen1SubModel?
|
for (index,v) in filterItems[selectIndex.section].enumerated(){
|
let m = filterItems[selectIndex.section].filter({$0.isQuestion == 0}).first
|
if v.id == m?.id{
|
answerModel = v
|
answerIndex = IndexPath(row: index, section: viewModel.selectIndex.value!.section)
|
}
|
}
|
|
var answerType:Fight_lessonType = .none
|
if tempSubV?.voiceUrl == answerModel?.correct{
|
answerType = .success
|
voicePlayer.playSuccessVoice()
|
|
let teamId = self.listenNewModel.data?.id.components(separatedBy: ",")[self.page]
|
let answerId = answerModel!.id
|
self.rootViewModel.insertCorrectAnswer(teamId: teamId, answerId: answerId)
|
|
|
DispatchQueue.main.asyncAfter(deadline: .now()+2) {
|
self.voicePlayer.playerAt(url: tempSubV!.voiceUrl)
|
}
|
|
//防止重复答题造成计数错误的问题
|
if !answerIndexs.contains(answerIndex!){
|
answerCount += 1
|
rootViewModel.correctNum += 1
|
let v = rootViewModel.answerCount.value + 1
|
rootViewModel.answerCount.accept(v)
|
}
|
|
}else{
|
answerType = .fail
|
voicePlayer.playFailVoice()
|
rootViewModel.errorNum += 1
|
}
|
voicePlayer.playerEnd()
|
answerIndexs.insert(answerIndex!)
|
|
switch answerType {
|
case .success:
|
DispatchQueue.main.asyncAfter(deadline: .now()+0.4) {
|
if let copyView = tempSubV?.copyView(){
|
tempSubV?.alpha = 0
|
let newRect = tempSubV!.view_handle.convert(tempSubV!.bounds, to: self.view)
|
copyView.frame = CGRect(origin: newRect.origin, size: CGSize(width: 159, height: 52))
|
copyView.view_state.isHidden = true
|
copyView.isCopy = true
|
copyView.btn_isAnswer.setImage(self.viewModel.selectIndex.value?.row == 1 ? UIImage(named: "icon_question"):UIImage(named: "icon_answer"), for: .normal)
|
copyView.img_play.alpha = 1
|
copyView.voiceUrl = tempSubV!.voiceUrl
|
self.view.addSubview(copyView)
|
self.view.layoutIfNeeded()
|
|
//获取Cell的顶部试图
|
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
|
|
self.collectionView.reloadData()
|
UIView.animate(withDuration: 0.4) {
|
copyView.frame = CGRect(origin: newRect1.origin, size: CGSize(width: 159, height: 52))
|
} completion: { _ in
|
self.viewModel.selectIndex.accept(nil)
|
for v in self.stackView.subviews{
|
v.removeFromSuperview()
|
}
|
self.stackView.layoutIfNeeded()
|
|
//回答完成,下一答题
|
if self.answerIndexs.count == 2{
|
let v = self.rootViewModel.answerCount.value + 1
|
self.rootViewModel.answerCount.accept(v)
|
// self.rootViewModel.answerItems[self.page] = self.listenNewModel.subjectList[self.page]
|
self.voicePlayer.playerEnd()
|
NotificationCenter.default.post(name: NextLession_Noti, object: nil)
|
self.voicePlayer.playerEnd()
|
return
|
}
|
}
|
}
|
}
|
}
|
|
case .fail:
|
UIView.animate(withDuration: 0.4) {
|
tempSubV?.img_state.alpha = 1
|
}completion: { _ in
|
DispatchQueue.main.asyncAfter(deadline: .now()+3) {
|
// self.setAnswerStackView()
|
}
|
}
|
case .none:
|
break
|
}
|
}
|
}
|
|
extension HomeListenFight_lesson_4_VC:UICollectionViewDelegate{
|
|
}
|
|
extension HomeListenFight_lesson_4_VC:UICollectionViewDelegateFlowLayout{
|
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
|
return CGSize.zero
|
}
|
}
|
|
extension HomeListenFight_lesson_4_VC:UICollectionViewDataSource{
|
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
|
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()
|
}
|
}
|
let m = filterItems[indexPath.section][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)
|
}
|
}else{
|
cell.img_state.alpha = 0
|
cell.img_state.transform = .init(scaleX: 0.1, y: 0.1)
|
}
|
|
if indexPath.row == 1{
|
cell.btn_handle.setImage(UIImage(named: "icon_answer"), for: .normal)
|
cell.view_handle.isHidden = true
|
}else{
|
cell.btn_handle.setImage(UIImage(named: "icon_question"), for: .normal)
|
cell.view_handle.isHidden = true
|
}
|
|
//问题
|
if filterItems[indexPath.section][indexPath.row].isQuestion == 0{
|
cell.view_handle.isHidden = true
|
}else{
|
cell.view_handle.isHidden = false
|
}
|
cell.setModel(m)
|
|
|
if answerIndexs.count == 0 && indexPath.section == 1{
|
cell.view_handle.backgroundColor = .gray.withAlphaComponent(0.5)
|
cell.btn_play.isEnabled = false
|
}else{
|
cell.view_handle.backgroundColor = UIColor(hexString: "#41A2EB")
|
cell.btn_play.isEnabled = true
|
}
|
|
return cell
|
}
|
|
func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
|
let reusableView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "header", for: indexPath)
|
return reusableView
|
|
}
|
|
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
|
return filterItems[section].count
|
}
|
|
func numberOfSections(in collectionView: UICollectionView) -> Int {
|
return filterItems.count
|
}
|
}
|
|
extension HomeListenFight_lesson_4_VC:VoicePlayerDelegate{
|
func playComplete() {
|
self.view.isUserInteractionEnabled = true
|
}
|
|
func playing() {
|
self.view.isUserInteractionEnabled = false
|
}
|
}
|