// // SPHomeHeaderView.swift // Thimra // // Created by 曾觉新 on 2025/4/14. // import UIKit class SPHomeHeaderView: UICollectionReusableView { var viewModel: SPHomeViewModel? { didSet { let moduleModel = viewModel?.moduleModel stackView.removeAllArrangedSubview() stackView.addArrangedSubview(bannerView) bannerView.reloadData() if let historyList = viewModel?.playHistoryArr, historyList.count > 0 { stackView.addArrangedSubview(playHistoryView) playHistoryView.dataArr = historyList } if let list = moduleModel?.nineSquare?.list, list.count > 0 { stackView.addArrangedSubview(exploreView) exploreView.titleLabel.text = moduleModel?.nineSquare?.title exploreView.dataArr = list } // stackView.addArrangedSubview(trendingView) // trendingView.dataArr = moduleModel?.bannerData // // stackView.addArrangedSubview(hotView) // hotView.dataArr = moduleModel?.bannerData // // stackView.addArrangedSubview(shortsForYouView) // shortsForYouView.dataArr = moduleModel?.bannerData stackView.addArrangedSubview(titleView) } } private lazy var stackView: UIStackView = { let view = UIStackView() view.axis = .vertical view.spacing = 25 return view }() private lazy var bannerView: ZKCycleScrollView = { let view = ZKCycleScrollView(frame: .zero, shouldInfiniteLoop: true) view.itemSize = .init(width: 234, height: Self.bannerHeight()) view.itemAlpha = true view.itemZoomScale = 0.9 view.itemSpacing = 10 view.rotationAngle = 5 view.delegate = self view.dataSource = self view.hidesPageControl = true view.register(SPHomeZoomBannerCell.self, forCellWithReuseIdentifier: "banner") view.snp.makeConstraints { make in make.width.equalTo(kSPScreenWidth) make.height.equalTo(Self.bannerHeight()) } return view }() private lazy var playHistoryView: SPHomePlayHistoryView = { let view = SPHomePlayHistoryView() return view }() private lazy var exploreView: SPHomeExploreView = { let view = SPHomeExploreView() return view }() private lazy var trendingView: SPHomeTrendingView = { let view = SPHomeTrendingView() return view }() private lazy var hotView: SPHomeHotView = { let view = SPHomeHotView() return view }() private lazy var shortsForYouView: SPHomeShortsForYouView = { let view = SPHomeShortsForYouView() return view }() private lazy var titleView: SPHomeDataItemView = { let view = SPHomeDataItemView() view.titleLabel.text = "More for you!".localized return view }() override init(frame: CGRect) { super.init(frame: frame) _setupUI() } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } } extension SPHomeHeaderView { private func _setupUI() { addSubview(stackView) stackView.snp.makeConstraints { make in make.edges.equalToSuperview() } } } //MARK: -------------- UICollectionViewDelegate & UICollectionViewDataSource -------------- extension SPHomeHeaderView: UICollectionViewDelegate, UICollectionViewDataSource { func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = SPHomeZoomBannerCell.dequeueReusableCell(collectionView: collectionView, indexPath: indexPath) cell.model = self.viewModel?.moduleModel?.bannerData?[indexPath.row] return cell } func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return self.viewModel?.moduleModel?.bannerData?.count ?? 0 } func numberOfSections(in collectionView: UICollectionView) -> Int { return 1 } func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { let model = self.viewModel?.moduleModel?.bannerData?[indexPath.row] let vc = SPPlayerDetailViewController() vc.shortPlayId = model?.short_play_id self.viewController?.navigationController?.pushViewController(vc, animated: true) } } //MARK: -------------- ZKCycleScrollViewDelegate & ZKCycleScrollViewDataSource -------------- extension SPHomeHeaderView: ZKCycleScrollViewDelegate, ZKCycleScrollViewDataSource { func cycleScrollView(_ cycleScrollView: ZKCycleScrollView, cellForItemAt index: Int) -> ZKCycleScrollViewCell { let cell = cycleScrollView.dequeueReusableCell(withReuseIdentifier: "banner", for: index) as! SPHomeZoomBannerCell cell.model = self.viewModel?.moduleModel?.bannerData?[index] return cell } func numberOfItems(in cycleScrollView: ZKCycleScrollView) -> Int { return self.viewModel?.moduleModel?.bannerData?.count ?? 0 } func cycleScrollView(_ cycleScrollView: ZKCycleScrollView, didSelectItemAt index: Int) { let model = self.viewModel?.moduleModel?.bannerData?[index] let vc = SPPlayerDetailViewController() vc.shortPlayId = model?.short_play_id self.viewController?.navigationController?.pushViewController(vc, animated: true) } } extension SPHomeHeaderView { static func contentHeight(viewModel: SPHomeViewModel) -> CGFloat { var height = bannerHeight() let moduleModel = viewModel.moduleModel ///历史记录 if let historyList = viewModel.playHistoryArr, historyList.count > 0 { height = height + SPHomePlayHistoryView.contentHeight(dataArr: historyList) + 25 } ///九宫格数据 if let list = moduleModel?.nineSquare?.list, list.count > 0 { height = height + SPHomeExploreView.contentHeight(dataArr: list) + 25 } // height = height + SPHomeTrendingView.contentHeight(dataArr: moduleModel?.bannerData ?? []) + 25 // // // height = height + SPHomeHotView.contentHeight(dataArr: moduleModel?.bannerData ?? []) + 25 // // height = height + SPHomeShortsForYouView.contentHeight(dataArr: moduleModel?.bannerData ?? []) + 25 ///标题高度 height = height + SPHomeDataItemView.contentHeight(dataArr: []) + 25 return height } static func bannerHeight() -> CGFloat { return 336 } }