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

232 lines
7.5 KiB
Swift
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// 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)
}
}