232 lines
7.5 KiB
Swift
232 lines
7.5 KiB
Swift
//
|
||
// 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)
|
||
}
|
||
}
|