Visual_Novel_iOS/crush/Crush/Src/Modules/Discover/DiscoverRolesGridController...

238 lines
7.8 KiB
Swift
Raw Normal View History

2025-10-09 10:29:35 +00:00
//
// DiscoverRolesGridController.swift
// Crush
//
// Created by Leon on 2025/9/8.
//
import JXPagingView
import UIKit
class DiscoverRolesGridController: CLBaseGridController {
var viewModel: DiscoverHomeRolesViewModel!
var tagsChooseView = HorizontalScrollTagsView()
var selectTagCodes = [String]()
var allCatogryTab: Bool = false
// aiId
var loadedAiIds = [Int]()
// Flag
var refreshDatasWhenAppear:Bool = false
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
setupViews()
setupDatas()
setupEvents()
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if refreshDatasWhenAppear{
collectionView.mj_header?.beginRefreshing()
refreshDatasWhenAppear = false
}
}
private func setupViews() {
if allCatogryTab{
collectionView.snp.remakeConstraints { make in
make.edges.equalToSuperview()
}
}else{
view.addSubview(tagsChooseView)
tagsChooseView.snp.makeConstraints { make in
make.top.leading.trailing.equalToSuperview()
make.height.equalTo(56)
}
collectionView.snp.remakeConstraints { make in
make.top.equalTo(tagsChooseView.snp.bottom)
make.leading.trailing.bottom.equalToSuperview()
}
}
navigationView.isHidden = true
collectionView.register(MeRootPageRollCell.self, forCellWithReuseIdentifier: "MeRootPageRollCell")
collectionView.register(UICollectionReusableView.self,
forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader,
withReuseIdentifier: "UICollectionReusableView")
let lr = CGFloat.lrs
let itemW = (UIScreen.width - lr * 2 - 16) * 0.5
let itemH = itemW * 260 / 165.0 + 112
layout.scrollDirection = .vertical
layout.minimumLineSpacing = 0
layout.minimumInteritemSpacing = 16
layout.sectionInset = .init(top: 12, left: lr, bottom: 24 + UIWindow.safeAreaBottom, right: lr)
layout.itemSize = .init(width: itemW, height: itemH)
layout.invalidateLayout()
addRefreshHeaderFooter()
}
private func setupDatas() {
// collectionView.mj_header?.beginRefreshing()
loadNewData()
if allCatogryTab == false{
var tagsName = [String]()
for per in viewModel.tags ?? [] {
let formatString = "#\(per.name)"
tagsName.append(formatString)
}
tagsChooseView.setTags(tagsName)
}
}
override func loadData() {
if page == 1{
loadedAiIds.removeAll()
}
viewModel.loadRoles(pn: page, codes: selectTagCodes, exList: loadedAiIds) { [weak self] status, roles in
self?.collectionView.mj_header?.endRefreshing()
self?.collectionView.mj_footer?.endRefreshing()
if status {
let array = roles ?? []
for per in array {
if let theId = per.aiId{
self?.loadedAiIds.append(theId)
}
}
if self?.page == 1 {
self?.collectionView.contentOffset = .zero
self?.datas = array
self?.collectionView.mj_footer?.resetNoMoreData()
// self?.view.setupEmpty(empty: array.count <= 0, msg: "")
if array.count > 0 {
self?.view.hideEmpty()
} else {
self?.view.showStartYEmpty(text: "暂无角色", startY: 96)
}
} else {
self?.datas.append(contentsOf: array)
if array.count <= 0 {
self?.collectionView.mj_footer?.endRefreshingWithNoMoreData()
}
}
self?.collectionView.reloadData()
}
}
}
private func setupEvents() {
tagsChooseView.selectionCallback = {[weak self] selectedTags, selectedIndices in
guard let `self` = self else {
return
}
print("选中的标签: \(selectedTags)")
print("选中的索引: \(selectedIndices)")
self.selectTagCodes.removeAll()
for (index, tag) in (self.viewModel.tags ?? []).enumerated() {
if selectedIndices.contains(index) {
if let code = tag.code {
self.selectTagCodes.append(code)
}
}
}
self.loadNewData()
}
}
// MARK: - Public
// func tryLoad(code: String) {
// if let tagCode = viewModel.selectTagCode, code == tagCode {
// return
// }
// viewModel.selectTagCode = code
// loadNewData()
// }
// MARK: - UICollectionView
override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return datas.count
}
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "MeRootPageRollCell", for: indexPath) as! MeRootPageRollCell
cell.cellType = .discoverList
if let data = datas[indexPath.item] as? AIRoleInfo {
cell.config(data: data)
}
return cell
}
override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
if let data = datas[indexPath.item] as? AIRoleInfo {
AppRouter.goChatVC(aiId: data.aiId)
}
}
// func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
// if kind == UICollectionView.elementKindSectionHeader {
// let header = collectionView.dequeueReusableSupplementaryView(
// ofKind: kind,
// withReuseIdentifier: "UICollectionReusableView",
// for: indexPath
// )
//
// if !allCatogryTab{
// if tagsChooseView.superview == nil || tagsChooseView.superview != header {
// tagsChooseView.removeFromSuperview()
// }
//
// header.addSubview(tagsChooseView)
// tagsChooseView.snp.makeConstraints { make in
// make.top.leading.trailing.equalToSuperview()
// make.bottom.equalToSuperview()
// }
// }
//
// return header
// }
// return UICollectionReusableView()
// }
//
// func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
// let height = allCatogryTab ? 0.0 : 56.0
// return CGSize(width: UIScreen.width, height: height)
// }
}
extension DiscoverRolesGridController {
}
extension DiscoverRolesGridController: JXPagingViewListViewDelegate {
func listView() -> UIView {
return view
}
func listScrollView() -> UIScrollView {
return collectionView
}
func listViewDidScrollCallback(callback: @escaping (UIScrollView) -> Void) {
listViewDidScrollCallback = callback
}
}