237 lines
9.9 KiB
Swift
237 lines
9.9 KiB
Swift
//
|
||
// MPPositive_RecommendViewController.swift
|
||
// MusicPlayer
|
||
//
|
||
// Created by Mr.Zhou on 2024/5/20.
|
||
//
|
||
|
||
import UIKit
|
||
///相关内容推荐
|
||
class MPPositive_RecommendViewController: MPPositive_BaseViewController,UIViewControllerTransitioningDelegate {
|
||
//load模块
|
||
private var loadRecommend:MPPositive_RecommendLoadViewModel!{
|
||
didSet{
|
||
DispatchQueue.main.async {
|
||
[weak self] in
|
||
guard let self = self else {return}
|
||
if loadRecommend != nil {
|
||
membersView.isHidden = false
|
||
segmentView.isHidden = false
|
||
listContainerView.isHidden = false
|
||
loadRecommend.resultReloadBlock = {
|
||
[weak self] in
|
||
//刷新分页控制器
|
||
guard let self = self else {return}
|
||
sectionLabel.text = loadRecommend?.members?.title
|
||
collectionView.reloadData()
|
||
dataSource.titles = loadRecommend?.sectionLists?.compactMap({$0.title}) ?? []
|
||
dataSource.reloadData(selectedIndex: 0)
|
||
segmentView.reloadData()
|
||
}
|
||
configure()
|
||
removeErrorView()
|
||
MP_HUD.hideNow()
|
||
}else {
|
||
membersView.isHidden = true
|
||
segmentView.isHidden = true
|
||
listContainerView.isHidden = true
|
||
}
|
||
}
|
||
}
|
||
}
|
||
//MARK: - 音乐人模块
|
||
///音乐人View
|
||
private lazy var membersView:UIView = createMusicMembersView()
|
||
//模块标题
|
||
private lazy var sectionLabel:UILabel = createLabel("Loading",font: .systemFont(ofSize: 18*width, weight: .regular), textColor: .white, textAlignment: .left)
|
||
//音乐人CollectionView
|
||
private lazy var collectionView:UICollectionView = {
|
||
let layout = UICollectionViewFlowLayout()
|
||
layout.itemSize = .init(width: 50*width, height: 90*width)
|
||
layout.sectionInset = .init(top: 0, left: 0, bottom: 0, right: 0)
|
||
layout.minimumInteritemSpacing = 16*width
|
||
layout.scrollDirection = .horizontal
|
||
let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
|
||
collectionView.backgroundColor = .clear
|
||
collectionView.showsVerticalScrollIndicator = false
|
||
collectionView.showsHorizontalScrollIndicator = false
|
||
collectionView.dataSource = self
|
||
collectionView.delegate = self
|
||
collectionView.register(MPPositive_RecommendMemberCollectionViewCell.self, forCellWithReuseIdentifier: MPPositive_RecommendMemberCollectionViewCellID)
|
||
|
||
return collectionView
|
||
}()
|
||
private let MPPositive_RecommendMemberCollectionViewCellID = "MPPositive_RecommendMemberCollectionViewCell"
|
||
//MARK: - 分页栏设置
|
||
//分页栏View
|
||
private lazy var segmentView:JXSegmentedView = {
|
||
var jxSegmentView = JXSegmentedView()
|
||
jxSegmentView.backgroundColor = .init(hex: "1A1A1A")
|
||
return jxSegmentView
|
||
}()
|
||
//数据源
|
||
private lazy var dataSource:JXSegmentedTitleDataSource = {
|
||
var dataSource = JXSegmentedTitleDataSource()
|
||
//标题未选中状态
|
||
dataSource.titleNormalColor = .init(hex: "#666666")
|
||
dataSource.titleNormalFont = .systemFont(ofSize: 16*width, weight: .regular)
|
||
//标题选中状态
|
||
dataSource.titleSelectedColor = .init(hex: "#80F988")
|
||
dataSource.titleSelectedFont = .systemFont(ofSize: 16*width, weight: .bold)
|
||
//是否颜色过度
|
||
dataSource.isTitleColorGradientEnabled = true
|
||
dataSource.isSelectedAnimable = true
|
||
dataSource.isItemTransitionEnabled = true
|
||
return dataSource
|
||
}()
|
||
//指示器
|
||
private lazy var indicator:JXSegmentedIndicatorLineView = {
|
||
let indicator = JXSegmentedIndicatorLineView()
|
||
indicator.indicatorWidth = 16*width
|
||
indicator.indicatorHeight = 3*width
|
||
indicator.indicatorCornerRadius = 1.5*width
|
||
indicator.indicatorColor = .init(hex: "#80F988")
|
||
indicator.indicatorPosition = .bottom
|
||
return indicator
|
||
}()
|
||
//分页内容承载框
|
||
fileprivate lazy var listContainerView:JXSegmentedListContainerView = {
|
||
let listContainerView = JXSegmentedListContainerView(dataSource: self)
|
||
listContainerView.backgroundColor = .clear
|
||
return listContainerView
|
||
}()
|
||
private var browseId:String!
|
||
/// 初始化
|
||
/// - Parameter browseId: 相关内容id
|
||
init(_ browseId:String) {
|
||
super.init(nibName: nil, bundle: nil)
|
||
self.browseId = browseId
|
||
MP_HUD.loading()
|
||
DispatchQueue.main.async {
|
||
[weak self] in
|
||
self?.loadRecommend = .init(browseId)
|
||
}
|
||
}
|
||
|
||
required init?(coder: NSCoder) {
|
||
super.init(coder: coder)
|
||
}
|
||
|
||
override func viewDidLoad() {
|
||
super.viewDidLoad()
|
||
setTitle("Recommend")
|
||
setPopBtn()
|
||
errorBlock = {
|
||
[weak self] in
|
||
guard let self = self else {
|
||
return
|
||
}
|
||
//移除所有(除了navView)的子控件,并告知页面处理错误,提示用户重试
|
||
view.subviews.forEach { item in
|
||
if item != self.navView {
|
||
//移除
|
||
if item.superview != nil {
|
||
item.removeFromSuperview()
|
||
}
|
||
}
|
||
}
|
||
//添加报错View
|
||
setErrorView()
|
||
MP_HUD.hideNow()
|
||
}
|
||
retryBlock = {
|
||
[weak self] in
|
||
guard let self = self else {return}
|
||
MP_HUD.loading()
|
||
DispatchQueue.main.async {
|
||
self.loadRecommend = .init(self.browseId)
|
||
}
|
||
}
|
||
}
|
||
private func configure() {
|
||
view.addSubview(membersView)
|
||
membersView.snp.makeConstraints { make in
|
||
make.width.equalTo(338*width)
|
||
make.height.equalTo(141*width)
|
||
make.top.equalTo(navView.snp.bottom).offset(33*width)
|
||
make.centerX.equalToSuperview()
|
||
}
|
||
segmentView.indicators = [indicator]
|
||
segmentView.dataSource = dataSource
|
||
//配置View
|
||
view.addSubview(segmentView)
|
||
segmentView.snp.makeConstraints { make in
|
||
make.left.right.equalToSuperview()
|
||
make.top.equalTo(membersView.snp.bottom).offset(10*width)
|
||
make.height.equalTo(60*width)
|
||
}
|
||
view.addSubview(listContainerView)
|
||
listContainerView.snp.makeConstraints { (make) in
|
||
make.left.right.bottom.equalToSuperview().priority(999)
|
||
make.top.equalTo(segmentView.snp.bottom).priority(999)
|
||
}
|
||
segmentView.contentScrollView = listContainerView.scrollView
|
||
segmentView.listContainer = listContainerView
|
||
}
|
||
|
||
//生成音乐人部分
|
||
private func createMusicMembersView() -> UIView {
|
||
let membersView:UIView = .init()
|
||
membersView.backgroundColor = .init(hex: "#1A1A1A")
|
||
membersView.layer.masksToBounds = true
|
||
membersView.layer.cornerRadius = 14*width
|
||
//添加内容
|
||
membersView.addSubview(sectionLabel)
|
||
sectionLabel.snp.makeConstraints { make in
|
||
make.top.equalToSuperview().offset(14*width)
|
||
make.left.equalToSuperview().offset(12*width)
|
||
make.right.equalToSuperview().offset(-12*width)
|
||
}
|
||
membersView.addSubview(collectionView)
|
||
collectionView.snp.makeConstraints { make in
|
||
make.top.equalToSuperview().offset(50*width)
|
||
make.left.equalToSuperview().offset(14*width)
|
||
make.right.equalToSuperview().offset(-10*width)
|
||
make.bottom.equalToSuperview()
|
||
}
|
||
return membersView
|
||
}
|
||
@objc override func popActionClick(_ sender:UIButton) {
|
||
super.popActionClick(sender)
|
||
MPPositive_Debouncer.shared.call {
|
||
[weak self] in
|
||
guard let self = self else {return}
|
||
navigationController?.popToRootViewController(animated: false)
|
||
}
|
||
}
|
||
}
|
||
//MARK: - collectionView
|
||
extension MPPositive_RecommendViewController:UICollectionViewDataSource, UICollectionViewDelegate {
|
||
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
|
||
return loadRecommend?.members?.items.count ?? 0
|
||
}
|
||
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
|
||
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: MPPositive_RecommendMemberCollectionViewCellID, for: indexPath) as! MPPositive_RecommendMemberCollectionViewCell
|
||
cell.itemView = loadRecommend?.members?.items[indexPath.row]
|
||
return cell
|
||
}
|
||
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
|
||
//用户查看艺术家
|
||
let artistVC = MPPositive_ArtistShowViewController(loadRecommend?.members?.items[indexPath.row].browseItem.artistId ?? "")
|
||
navigationController?.pushViewController(artistVC, animated: true)
|
||
}
|
||
}
|
||
//MARK: - JXSegmentedTitleDataSource
|
||
extension MPPositive_RecommendViewController: JXSegmentedListContainerViewDataSource, JXSegmentedViewDelegate {
|
||
func numberOfLists(in listContainerView: JXSegmentedListContainerView) -> Int {
|
||
return dataSource.titles.count
|
||
}
|
||
func listContainerView(_ listContainerView: JXSegmentedListContainerView, initListAt index: Int) -> JXSegmentedListContainerViewListDelegate {
|
||
let showView:MPPositive_RecommendShowTypeView = .init(listContainerView.frame, list: loadRecommend.sectionLists[index])
|
||
return showView
|
||
}
|
||
func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
|
||
return MPPositive_PresentationController(presentedViewController: presented, presenting: presenting)
|
||
}
|
||
}
|