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