BeeReel/BeeReel/Class/Home/Controller/BRHomeViewController.swift
2025-07-22 19:59:14 +08:00

267 lines
7.9 KiB
Swift

//
// BRHomeViewController.swift
// BeeReel
//
// Created by on 2025/6/25.
//
import UIKit
class BRHomeViewController: BRViewController {
private lazy var viewModel = BRHomeViewModel()
private lazy var spotlightVC: BRSpotlightViewViewController = {
let vc = BRSpotlightViewViewController()
vc.viewModel = self.viewModel
return vc
}()
private lazy var vcArr: [BRViewController] = {
return [
spotlightVC,
BRHomeTop10ViewController(),
BRPopularPicksViewController(),
BRNewReleasesViewController(),
BRHomeCategoriesViewController()
]
}()
private lazy var requestGroup = DispatchGroup()
private lazy var pageParam: WMZPageParam = {
let param = WMZPageParam()
param.wTitleArr = [
"Spotlight".localized,
"Top 10".localized,
"Popular Picks".localized,
"New Releases".localized,
"Categories".localized
]
param.wViewController = { [weak self] index in
return self?.vcArr[index]
}
param.wMenuHeadView = { [weak self] in
if let bannerArr = self?.viewModel.bannerArr, bannerArr.count > 0 {
return self?.headerView
} else {
return nil
}
}
//
param.wBounces = true
param.wMenuTitleColor = .colorFFFFFF()
param.wMenuTitleSelectColor = .colorFFFFFF()
param.wMenuTitleUIFont = .fontMedium(ofSize: 12)
param.wMenuTitleSelectUIFont = .fontMedium(ofSize: 12)
param.wMenuTitleRadios = 17
param.wMenuHeight = 34
param.wMenuTitleOffset = 10
param.wMenuInsets = UIEdgeInsets(top: 40, left: 59, bottom: 0, right: 15)
param.wMenuBgColor = .clear
param.wBgColor = .clear
param.wTopSuspension = true
param.wCustomDataViewTopOffset = UIScreen.statusBarHeight
param.wCustomMenuTitle = { [weak self] buttons in
buttons?.forEach({ button in
self?.setMenuTitle(button: button)
})
}
param.wCustomNaviBarY = { _ in
return 0
}
param.wCustomTabbarY = { _ in
return 0
}
param.wEventChildVCDidSroll = { [weak self] (pageVC, oldPoint, newPonit, currentScrollView) in
guard let self = self else { return }
let top = max(0, newPonit.y)
self.bgImageView.snp.updateConstraints { make in
make.top.equalToSuperview().offset(-top)
}
self.updateStatusBarStyle()
}
return param
}()
private lazy var pageView: WMZPageView = {
let view = WMZPageView(frame: self.view.bounds, autoFix: true, param: pageParam, parentReponder: self)
view.backgroundColor = .clear
view.downSc?.backgroundColor = .clear
view.downSc?.br_addRefreshHeader { [weak self] in
self?.handleHeaderRefresh(nil)
}
return view
}()
private lazy var bgImageView: UIImageView = {
let imageView = UIImageView(image: UIImage(named: "home_header_bg_image"))
imageView.isHidden = true
return imageView
}()
private lazy var titleLabel: UILabel = {
let label = UILabel()
label.font = .fontMedium(ofSize: 17)
label.textColor = .color1C1C1C()
label.text = "Browse Genres".localized
return label
}()
private lazy var headerView: BRHomeHeaderView = {
let view = BRHomeHeaderView()
view.frame = .init(x: 0, y: 0, width: UIScreen.width, height: view.contentHeight)
return view
}()
private lazy var menuLeftView: UIView = {
let view = UIView()
view.backgroundColor = self.view.backgroundColor
return view
}()
private lazy var searchButton: UIButton = {
let button = UIButton(type: .custom)
button.setImage(UIImage(named: "search_button_01"), for: .normal)
return button
}()
override func viewDidLoad() {
super.viewDidLoad()
self.edgesForExtendedLayout = [.top, .bottom]
self.statusBarStyle = .lightContent
self.navigationController?.isNavigationBarHidden = true
br_setupUI()
requestHomeData()
setupPageView()
updateStatusBarStyle()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.setNavigationBarHidden(true, animated: true)
}
private func updateStatusBarStyle() {
let point = self.pageView.downSc?.contentOffset ?? .zero
if point.y < 300, let bannerArr = self.viewModel.bannerArr, bannerArr.count > 0 {
self.statusBarStyle = .lightContent
} else {
self.statusBarStyle = .darkContent
}
}
override func handleHeaderRefresh(_ completer: (() -> Void)?) {
self.requestGroup.enter()
requestHomeData { [weak self] in
self?.requestGroup.leave()
}
if let vc = self.pageView.upSc.currentVC as? BRViewController {
self.requestGroup.enter()
vc.handleHeaderRefresh { [weak self] in
self?.requestGroup.leave()
}
}
self.requestGroup.notify(queue: .main) { [weak self] in
self?.pageView.downSc?.br_endHeaderRefreshing()
}
}
}
extension BRHomeViewController {
private func br_setupUI() {
view.addSubview(bgImageView)
view.addSubview(pageView)
menuLeftView.addSubview(searchButton)
bgImageView.snp.makeConstraints { make in
make.top.equalToSuperview().offset(0)
make.left.right.equalToSuperview()
make.height.equalTo(UIScreen.statusBarHeight + 300)
}
searchButton.snp.makeConstraints { make in
make.left.equalToSuperview().offset(15)
make.centerY.equalToSuperview()
}
}
///
private func setMenuTitle(button: UIButton) {
button.setBackgroundImage(UIImage(named: "menu_bg_image_01"), for: .selected)
button.setBackgroundImage(UIImage(color: .colorD3D3D3()), for: .normal)
button.layer.masksToBounds = true
}
private func setupPageView() {
self.pageView.upSc.addSubview(titleLabel)
self.pageView.upSc.addSubview(menuLeftView)
// self.pageView.upSc.sendSubviewToBack(menuBgView)
titleLabel.snp.makeConstraints { make in
make.left.equalToSuperview().offset(15)
make.top.equalToSuperview().offset(10)
}
menuLeftView.snp.makeConstraints { make in
make.left.equalToSuperview()
make.top.equalToSuperview().offset(pageParam.wMenuInsets.top)
make.height.equalTo(34)
make.width.equalTo(59)
}
}
}
extension BRHomeViewController {
private func requestHomeData(completer: (() -> Void)? = nil) {
BRHomeAPI.requestHomeData { [weak self] list in
guard let self = self else { return }
if let list = list {
self.viewModel.homeOldDataArr = list
self.headerView.bannerArr = self.viewModel.bannerArr
if let bannerArr = self.viewModel.bannerArr, bannerArr.count > 0 {
self.bgImageView.isHidden = false
self.pageView.updateHeadView()
} else {
self.bgImageView.isHidden = true
}
self.spotlightVC.reloadData()
}
self.updateStatusBarStyle()
completer?()
}
}
}