Visual_Novel_iOS/crush/Crush/Src/Modules/Discover/View/DiscoverRootPageView.swift

232 lines
7.5 KiB
Swift
Raw Normal View History

2025-10-09 10:29:35 +00:00
//
// DiscoverRootPageView.swift
//
//
// Created by Leon on 2025/7/22.
//
import JXPagingView
import JXSegmentedView
import UIKit
class DiscoverRootPageView: CLContainer {
private var bgBdView : UIView!
private lazy var pagingView = JXPagingListRefreshView(delegate: self)
lazy var headerView: DiscoverHeadView = DiscoverHeadView()
lazy var pinHeaderView: DiscoverHeadPinHeader = DiscoverHeadPinHeader()
private var headerViewHeight: CGFloat = 288
private var headerPinHeadHeight: Int = 96
private var controllers = [JXPagingViewListViewDelegate]()
// Data
var characterNodes: [DictNode] = [DictNode]()
var tagsNodes: [DictNode] = [DictNode]()
override init(frame: CGRect) {
super.init(frame: frame)
setupViews()
setupData()
setupEvent()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func setupViews() {
bgBdView = {
let v = UIView()
v.backgroundColor = .c.cbd
addSubview(v)
v.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
v.alpha = 0
return v
}()
pagingView.mainTableView.backgroundColor = UIColor.clear
pagingView.mainTableView.gestureDelegate = self
pagingView.pinSectionHeaderVerticalOffset = Int(UIWindow.statusBarHeight)
pagingView.listContainerView.listCellBackgroundColor = .clear
addSubview(pagingView)
pagingView.snp.makeConstraints { make in
make.leading.trailing.equalToSuperview()
make.bottom.equalToSuperview()
make.top.equalToSuperview()
}
pinHeaderView.segmentedView.listContainer = pagingView.listContainerView
pinHeaderView.segmentedView.delegate = self
//pinHeaderView.subSegementedView.delegate = self
}
//
private func setupData() {
guard let characterNodes = AppDictManager.shared.aiDict?.characterDictList else {
return
}
self.characterNodes = characterNodes
controllers.removeAll()
var titles = [String]()
// First Tab: All
do{
titles.append("All")
let vc = DiscoverRolesGridController()
vc.allCatogryTab = true
//
let viewModel = DiscoverHomeRolesViewModel()
viewModel.character = nil
vc.viewModel = viewModel
controllers.append(vc)
}
for per in characterNodes {
titles.append(per.name)
let vc = DiscoverRolesGridController()
//
let viewModel = DiscoverHomeRolesViewModel()
viewModel.character = per
viewModel.tags = per.childDictList
viewModel.selectTagCode = per.childDictList?.first?.code
vc.viewModel = viewModel
controllers.append(vc)
}
pinHeaderView.dataSource.titles = titles
refreshSubTagsSegmentView()
}
///
private func refreshSubTagsSegmentView() {
let titleIndex = pinHeaderView.segmentedView.selectedIndex
// First tab is All
if titleIndex > 0{
let selectCharacterNode = characterNodes[titleIndex - 1]
tagsNodes = selectCharacterNode.childDictList ?? []
}else{
tagsNodes = []
}
// let selectTagNode = tagsNodes[pinHeaderView.subSegementedView.selectedIndex]
// var titles = [String]()
// for per in tagsNodes {
// titles.append("#\(per.name)")
// }
// pinHeaderView.subDataSouce.titles = titles
// pinHeaderView.subSegementedView.reloadData()
}
private func setupEvent() {
headerView.heightChangeBlock = { [weak self] height in
self?.headerViewHeight = height
self?.pagingView.resizeTableHeaderViewHeight()
}
// pinHeaderView.filterButton.addTarget(self, action: #selector(tapFilterButton(button:)), for: .touchUpInside)
}
// MARK: - Public
func setupFilter(filter: RolesFilterModel){
dlog("当前: params:\(filter.toNonNilDictionary())")
for (index, vc) in controllers.enumerated() {
if let gridVc = vc as? DiscoverRolesGridController{
// #warning("test")
gridVc.viewModel.filterModel = filter
if index == pinHeaderView.segmentedView.selectedIndex{
gridVc.loadNewData()
}else{
gridVc.refreshDatasWhenAppear = true
}
}
}
}
// MARK: Action
// @objc private func tapFilterButton(button: UIButton){
// if pinHeaderView.filterConditionCount >= 2{
// pinHeaderView.setupFilterCount(0)
// }else{
// pinHeaderView.setupFilterCount(2)
// }
// }
}
extension DiscoverRootPageView {
}
extension DiscoverRootPageView: JXPagingViewDelegate, JXSegmentedViewDelegate {
func tableHeaderViewHeight(in _: JXPagingView) -> Int {
return Int(headerViewHeight)
}
func tableHeaderView(in _: JXPagingView) -> UIView {
return headerView
}
func heightForPinSectionHeader(in _: JXPagingView) -> Int {
return headerPinHeadHeight
}
func viewForPinSectionHeader(in _: JXPagingView) -> UIView {
return pinHeaderView
}
func numberOfLists(in _: JXPagingView) -> Int {
return controllers.count
}
func pagingView(_: JXPagingView, initListAtIndex index: Int) -> JXPagingViewListViewDelegate {
let vc = controllers[index]
return vc
}
func segmentedView(_ segmentedView: JXSegmentedView, didSelectedItemAt index: Int) {
if segmentedView == pinHeaderView.segmentedView {
refreshSubTagsSegmentView()
}
// else if segmentedView == pinHeaderView.subSegementedView {
// let selectTag = tagsNodes[index]
// if let currentVc = controllers[pinHeaderView.segmentedView.selectedIndex] as? DiscoverRolesGridController {
// currentVc.tryLoad(code: selectTag.code!)
// }
// }
}
func mainTableViewDidScroll(_ scrollView: UIScrollView) {
NaviAlphaHandle.changeNaviViewsAlpha(scrollView: scrollView, alphaViews: [bgBdView, navigationView?.bgView], oppositeViews: [])
}
}
extension DiscoverRootPageView: JXPagingMainTableViewGestureDelegate {
func mainTableViewGestureRecognizer(
_ gestureRecognizer: UIGestureRecognizer,
shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
// UICollectionView
if let panGesture = otherGestureRecognizer as? UIPanGestureRecognizer,
let otherView = otherGestureRecognizer.view,
otherView is UICollectionView {
let velocity = panGesture.velocity(in: otherView)
//
if abs(velocity.x) > abs(velocity.y) {
return false
}
}
// segmentedView
// if otherGestureRecognizer == segmentedView.collectionView.panGestureRecognizer {
// return false
// }
return gestureRecognizer.isKind(of: UIPanGestureRecognizer.self)
&& otherGestureRecognizer.isKind(of: UIPanGestureRecognizer.self)
}
}