267 lines
7.9 KiB
Swift
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?()
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|