//
|
// HomeListenFight_lesson_3_VC.swift
|
// DolphinEnglishLearnStudent
|
//
|
// Created by 无故事王国 on 2024/5/27.
|
//
|
|
import UIKit
|
import Lantern
|
|
class HomeListenFight_lesson_3_VC: BaseVC {
|
|
private var viewModel = FightAnswerViewModel()
|
|
private lazy var collectionView:UICollectionView = {
|
let flowLayout = UICollectionViewFlowLayout()
|
let w = (JQ_ScreenW - 97 - 54 - 36) / 3.0
|
flowLayout.itemSize = CGSize(width: w, height: w * 0.947)
|
flowLayout.minimumInteritemSpacing = 18
|
flowLayout.scrollDirection = .vertical
|
let collection = UICollectionView(frame: .zero, collectionViewLayout: flowLayout)
|
collection.register(UINib(nibName: "ListenFight_lesson_3_CCell", bundle: nil), forCellWithReuseIdentifier: "_ListenFight_lesson_3_CCell")
|
collection.register(UICollectionReusableView.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "header")
|
collection.isScrollEnabled = false
|
return collection
|
}()
|
|
private lazy var stackView:UIStackView = {
|
let sta = UIStackView()
|
sta.spacing = 5
|
sta.distribution = .equalSpacing
|
sta.axis = .horizontal
|
return sta
|
}()
|
|
private var listenNewModel:ListenNewModel!
|
private var page:Int!
|
private var answterCount:Int = 0 //回答计数,用于确定角标
|
var rootViewModel:HomeListenFightViewModel!
|
private var voicePlayer = VoicePlayer.share()
|
private var playIndex = Set<IndexPath>() //顺序播放
|
private var isPlayingIndex:IndexPath? //正在播放中
|
private var islisten:Bool = false
|
|
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 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 viewDidLoad() {
|
super.viewDidLoad()
|
navigationItem.titleView = UIView()
|
playIndex.insert(IndexPath(row: 0, section: 0))
|
}
|
|
func restore(){
|
answterCount = 0
|
for subView in view.subviews{
|
if subView is Lesson_3_AnswerView{
|
subView.removeFromSuperview()
|
}
|
}
|
setUI()
|
collectionView.reloadData()
|
|
}
|
|
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(97)
|
make.right.equalTo(-54)
|
make.bottom.equalToSuperview()
|
}
|
}
|
|
override func setRx() {
|
|
}
|
|
override func viewDidLayoutSubviews() {
|
super.viewDidLayoutSubviews()
|
let flowLayout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout
|
|
let w = (collectionView.size.width - flowLayout.minimumLineSpacing) / 3.1
|
let h = (collectionView.size.height - flowLayout.minimumInteritemSpacing) / 2 - 40
|
if flowLayout.itemSize.width != w || flowLayout.itemSize.height != h{
|
flowLayout.itemSize = CGSize(width: w, height: h)
|
collectionView.reloadData()
|
}
|
}
|
|
private func setAnswerStackView(force:Bool = false){
|
|
|
for v in stackView.arrangedSubviews{
|
v.removeFromSuperview()
|
}
|
|
|
if isPlayingIndex == IndexPath(row: 2, section: 0) || isPlayingIndex == IndexPath(row: 1, section: 1) || isPlayingIndex == IndexPath(row: 2, section: 1) || !force{
|
var tempImageArray = [String]()
|
|
tempImageArray.append(listenNewModel.subjectList[page][2].img)
|
tempImageArray.append(listenNewModel.subjectList[page][4].img)
|
tempImageArray.append(listenNewModel.subjectList[page][5].img)
|
|
view.addSubview(stackView)
|
stackView.snp.makeConstraints { make in
|
make.right.equalToSuperview().offset(-82)
|
make.centerY.equalToSuperview()
|
make.height.equalTo(52)
|
}
|
|
var tempAnswerViews = [Lesson_3_AnswerView]()
|
for i in 0...2{
|
let answerView = Lesson_3_AnswerView.jq_loadNibView()
|
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)
|
}
|
|
UIView.animate(withDuration: 0.05 + Double(i)) {
|
answerView.alpha = 1
|
}
|
tempAnswerViews.append(answerView)
|
}
|
tempAnswerViews.shuffle()
|
stackView.addArrangedSubviews(tempAnswerViews)
|
}
|
}
|
|
@objc private func chooseAnswerAction(btn:UIButton){
|
|
guard viewModel.selectIndex.value != nil else {return}
|
|
if !islisten{
|
alertError(msg: "请先听题");return
|
}
|
|
if isPlayingIndex != nil {
|
alertError(msg: "请先听题");return
|
}
|
|
if answterCount == 0 && !playIndex.contains(IndexPath(row: 2, section: 0)){
|
alertError(msg: "请先听题");return
|
}
|
|
if answterCount == 1 && !playIndex.contains(IndexPath(row: 1, section: 1)){
|
alertError(msg: "请先听题");return
|
}
|
|
if answterCount == 2 && !playIndex.contains(IndexPath(row: 2, section: 1)){
|
alertError(msg: "请先听题");return
|
}
|
|
var subV:Lesson_3_AnswerView?
|
|
for (_,v) in (stackView.arrangedSubviews as! [Lesson_3_AnswerView]).enumerated(){
|
if v.btn_choose.tag == btn.tag{
|
subV = v;break
|
}
|
}
|
|
var answerType:Fight_lessonType = .none
|
|
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 == listenNewModel.subjectList[page][valueIndex].img{
|
answerType = .success
|
voicePlayer.playSuccessVoice()
|
}else{
|
answerType = .fail
|
voicePlayer.playFailVoice()
|
}
|
|
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?.img_cover.contentMode = .scaleToFill
|
copyView?.img_cover.image = subV?.img_cover.image
|
self.view.addSubview(copyView!)
|
copyView?.layoutIfNeeded()
|
|
var ansterIndePath:IndexPath?
|
if viewModel.selectIndex.value?.section == 0{
|
ansterIndePath = IndexPath(row: 2, section: 0)
|
playIndex.insert(IndexPath(row: 0, section: 1)) //下一个准备播放
|
}
|
|
if viewModel.selectIndex.value?.section == 1 && (viewModel.selectIndex.value?.row == 0 || viewModel.selectIndex.value?.row == 1){
|
ansterIndePath = IndexPath(row: 1, section: 1)
|
playIndex.insert(IndexPath(row: 2, section: 1)) //下一个准备播放
|
}
|
|
if viewModel.selectIndex.value?.section == 1 && viewModel.selectIndex.value?.row == 2{
|
ansterIndePath = IndexPath(row: 2, section: 1)
|
}
|
|
guard ansterIndePath != nil else {return}
|
self.viewModel.selectIndex.accept(nil)
|
|
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)
|
newFrame.origin.x += 0
|
newFrame.origin.y += 0
|
UIView.animate(withDuration: 0.4) {
|
copyView?.frame = newFrame
|
} completion: { _ in
|
self.answterCount += 1
|
self.voicePlayer.playerAt(url: self.listenNewModel.subjectList[self.page][valueIndex].correct)
|
|
let teamId = self.listenNewModel.data?.id.components(separatedBy: ",")[self.page]
|
let answerId = self.listenNewModel.subjectList[self.page][valueIndex].id
|
self.rootViewModel.insertCorrectAnswer(teamId: teamId, answerId: answerId)
|
|
DispatchQueue.main.asyncAfter(deadline: .now()+1.0) {
|
self.setAnswerStackView()
|
let v = self.rootViewModel.answerCount.value + 1
|
self.rootViewModel.answerCount.accept(v)
|
self.collectionView.reloadData()
|
}
|
}
|
}
|
|
case .fail:
|
rootViewModel.errorNum += 1
|
viewModel.answerType.accept(.fail)
|
UIView.animate(withDuration: 0.4) {
|
subV?.img_state.alpha = 1
|
subV?.btn_fullscreen.alpha = 0
|
}completion: { _ in
|
DispatchQueue.main.asyncAfter(deadline: .now()+1.5) {
|
self.setAnswerStackView(force: true)
|
}
|
}
|
default:break
|
}
|
}
|
|
@objc private func fullscreenAction(btn:UIButton){
|
|
var answerView:Lesson_3_AnswerView!
|
for (_,v) in (stackView.arrangedSubviews as! [Lesson_3_AnswerView]).enumerated(){
|
if v.btn_fullscreen.tag == btn.tag{
|
answerView = v;break
|
}
|
}
|
|
|
let lantern = Lantern()
|
lantern.numberOfItems = { () in
|
return 1
|
}
|
|
lantern.cellClassAtIndex = { _ in
|
LanternImageCell.self
|
}
|
|
|
lantern.transitionAnimator = LanternZoomAnimator(previousView: { index -> UIView? in
|
return answerView.img_cover
|
})
|
|
|
// UIPageIndicator样式的页码指示器
|
lantern.pageIndicator = LanternDefaultPageIndicator()
|
|
lantern.pageIndex = 0
|
|
lantern.reloadCellAtIndex = { context in
|
let lanternCell = context.cell as? LanternImageCell
|
lanternCell?.imageView.image = answerView.img_cover.image
|
}
|
//不要使用push
|
lantern.show()
|
}
|
}
|
|
extension HomeListenFight_lesson_3_VC:UICollectionViewDelegate{
|
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
|
|
}
|
}
|
|
extension HomeListenFight_lesson_3_VC:UICollectionViewDelegateFlowLayout{
|
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
|
if section == 0{
|
return CGSize.zero
|
}
|
return CGSizeMake(JQ_ScreenW, 100)
|
}
|
}
|
|
extension HomeListenFight_lesson_3_VC:UICollectionViewDataSource{
|
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.canClick(playIndex.contains(indexPath))
|
cell.palyVoiceAt {[weak self] index in
|
guard let weakSelf = self else { return }
|
weakSelf.isPlayingIndex = index
|
|
weakSelf.voicePlayer.playerEnd()
|
|
if indexPath.section == 1{
|
weakSelf.voicePlayer.playerAt(url: weakSelf.listenNewModel.subjectList[weakSelf.page][indexPath.row + 3].correct)
|
}else{
|
weakSelf.voicePlayer.playerAt(url: weakSelf.listenNewModel.subjectList[weakSelf.page][indexPath.row].correct)
|
}
|
|
weakSelf.viewModel.selectIndex.accept(index)
|
//点击答案,就显示
|
weakSelf.setAnswerStackView()
|
|
collectionView.reloadItems(at: [index])
|
}
|
|
if indexPath.section == 0{
|
let model = listenNewModel.subjectList[page][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: isPlayingIndex == indexPath)
|
}
|
|
if indexPath.section == 1{
|
let model = listenNewModel.subjectList[page][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: isPlayingIndex == indexPath)
|
}
|
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 3
|
}
|
|
func numberOfSections(in collectionView: UICollectionView) -> Int {
|
return 2
|
}
|
}
|
|
extension HomeListenFight_lesson_3_VC:VoicePlayerDelegate{
|
func playComplete() {
|
view.isUserInteractionEnabled = true
|
isPlayingIndex = nil
|
islisten = true
|
var nextRow = (viewModel.selectIndex.value?.row ?? 0) + 1
|
var section = (viewModel.selectIndex.value?.section ?? 0) + 0
|
|
if nextRow >= 3{
|
nextRow = 0;section = 1
|
}
|
|
|
if self.answterCount == 3{
|
NotificationCenter.default.post(name: NextLession_Noti, object: nil)
|
return
|
}
|
|
if (viewModel.selectIndex.value?.section == 0 && viewModel.selectIndex.value?.row == 2) || (viewModel.selectIndex.value?.section == 1 && viewModel.selectIndex.value?.row == 1){
|
collectionView.reloadData()
|
return
|
}
|
playIndex.insert(IndexPath(row: nextRow, section: section)) //下一个准备播放
|
collectionView.reloadData()
|
}
|
|
func playing() {
|
islisten = false
|
view.isUserInteractionEnabled = false
|
}
|
}
|