ThimraTV/MoviaBox/Class/Home/View/SPHomeHeaderView.swift
2025-06-19 09:50:44 +08:00

330 lines
11 KiB
Swift

//
// SPHomeHeaderView.swift
// MoviaBox
//
// Created by on 2025/4/14.
//
import UIKit
class SPHomeHeaderView: UICollectionReusableView {
var viewModel: SPHomeViewModel? {
didSet {
let moduleModel = viewModel?.moduleModel
let bannerModel = self.viewModel?.moduleModel?.bannerData?.first
setBannerBgImage(model: bannerModel)
stackView.removeAllArrangedSubview()
if let bannerData = moduleModel?.bannerData, bannerData.count > 0 {
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
}
if let list = viewModel?.categoryDataArr1, list.count > 0 {
stackView.addArrangedSubview(categoryVideoView1)
categoryVideoView1.dataArr = list
}
if let list = moduleModel?.hotData, list.count > 0 {
stackView.addArrangedSubview(trendingView)
trendingView.dataArr = list
}
if let list = viewModel?.categoryDataArr2, list.count > 0 {
stackView.addArrangedSubview(categoryVideoView2)
categoryVideoView2.dataArr = list
}
//
// stackView.addArrangedSubview(hotView)
// hotView.dataArr = moduleModel?.bannerData
//
// stackView.addArrangedSubview(shortsForYouView)
// shortsForYouView.dataArr = moduleModel?.bannerData
if (viewModel?.dataArr.count ?? 0) > 0 {
stackView.addArrangedSubview(titleView)
}
}
}
private var currentBannerModel: SPShortModel?
var isDidAppear: Bool = false {
didSet {
self.categoryVideoView1.isDidAppear = isDidAppear
self.categoryVideoView2.isDidAppear = isDidAppear
}
}
private lazy var stackView: UIStackView = {
let view = UIStackView()
view.axis = .vertical
view.spacing = 25
return view
}()
private lazy var bannerBgImageView: SPFadeEdgeImageView = {
let imageView = SPFadeEdgeImageView()
imageView.contentMode = .scaleAspectFill
return imageView
}()
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.85
view.rotationAngle = 12
view.itemSpacing = 15
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 categoryVideoView1: SPHomeCategoryVideoView = {
let view = SPHomeCategoryVideoView()
view.image = UIImage(named: "category_bg_image_01")
return view
}()
///
private lazy var categoryVideoView2: SPHomeCategoryVideoView = {
let view = SPHomeCategoryVideoView()
view.image = UIImage(named: "category_bg_image_02")
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 = "movia_more_for_you".localized
view.iconImageView.image = UIImage(named: "mark_icon_02")
return view
}()
override init(frame: CGRect) {
super.init(frame: frame)
_setupUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func setBannerBgImage(model: SPShortModel?) {
self.currentBannerModel = model
if let image = model?.blurImage {
self.bannerBgImageView.image = image
return
}
self.bannerBgImageView.sp_setImage(url: model?.image_url) { [weak self] image, url in
guard let self = self else { return }
if model == self.currentBannerModel {
if model?.blurImage == nil {
model?.blurImage = image?.applyBlur()
}
self.bannerBgImageView.image = model?.blurImage
}
}
}
}
extension SPHomeHeaderView {
private func _setupUI() {
addSubview(bannerBgImageView)
addSubview(stackView)
stackView.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
bannerBgImageView.snp.makeConstraints { make in
// make.top.equalTo(20)
make.top.equalToSuperview()
make.centerX.equalToSuperview()
make.width.equalTo(kSPScreenWidth)
make.height.equalTo(Self.bannerHeight())
}
}
}
//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, didScrollFromIndex fromIndex: Int, toIndex: Int) {
let model = self.viewModel?.moduleModel?.bannerData?[toIndex]
setBannerBgImage(model: model)
}
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: CGFloat = 0
let moduleModel = viewModel.moduleModel
if let bannerData = moduleModel?.bannerData, bannerData.count > 0 {
height = height + bannerHeight()
}
///
if let historyList = viewModel.playHistoryArr, historyList.count > 0 {
if height > 0 {
height = height + 25
}
height = height + SPHomePlayHistoryView.contentHeight(dataArr: historyList)
}
///
if let list = moduleModel?.nineSquare?.list, list.count > 0 {
if height > 0 {
height = height + 25
}
height = height + SPHomeExploreView.contentHeight(dataArr: list)
}
///
if viewModel.categoryDataArr1.count > 0 {
if height > 0 {
height = height + 25
}
height = height + SPHomeCategoryVideoView.contentHeight()
}
///
if viewModel.categoryDataArr2.count > 0 {
if height > 0 {
height = height + 25
}
height = height + SPHomeCategoryVideoView.contentHeight()
}
if let list = moduleModel?.hotData, list.count > 0 {
if height > 0 {
height = height + 25
}
height = height + SPHomeTrendingView.contentHeight(dataArr: list)
}
//
//
// 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
}
}