// // 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?() } } }