205 lines
8.1 KiB
Swift
205 lines
8.1 KiB
Swift
//
|
||
// MPPositive_ArtistShowViewController.swift
|
||
// MusicPlayer
|
||
//
|
||
// Created by Mr.Zhou on 2024/5/15.
|
||
//
|
||
|
||
import UIKit
|
||
|
||
class MPPositive_ArtistShowViewController: MPPositive_BaseViewController {
|
||
///头视图
|
||
private lazy var headView:MPPositive_ArtistShowHeaderView = .init(frame: .init(x: 0, y: 0, width: screen_Width, height: 385*width))
|
||
///艺术家Label
|
||
private lazy var nameLabel:UILabel = {
|
||
let label:UILabel = createLabel(font: .systemFont(ofSize: 20*width, weight: .regular), textColor: .white, textAlignment: .left)
|
||
label.alpha = 0
|
||
return label
|
||
}()
|
||
//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
|
||
indicator.verticalOffset = 5*width
|
||
return indicator
|
||
}()
|
||
///分页内容承载框
|
||
fileprivate lazy var pagingView: JXPagingView = {
|
||
let pagingView = JXPagingView(delegate: self)
|
||
pagingView.backgroundColor = .clear
|
||
pagingView.isHidden = true
|
||
pagingView.mainTableView.backgroundColor = .clear
|
||
//禁止弹簧效果
|
||
pagingView.mainTableView.bounces = false
|
||
return pagingView
|
||
}()
|
||
private var artist:MPPositive_ArtistViewModel!{
|
||
didSet{
|
||
if artist != nil {
|
||
pagingView.isHidden = false
|
||
//更新头部视图数据
|
||
headView.artistid = self.browseid
|
||
headView.artist = artist
|
||
|
||
//更新分页数据源
|
||
dataSource.titles = artist.lists.compactMap({$0.title})
|
||
nameLabel.text = artist.header?.title
|
||
dataSource.reloadData(selectedIndex: 0)
|
||
segmentView.reloadData()
|
||
}
|
||
}
|
||
}
|
||
var browseid:String = ""
|
||
var iscollection:Bool = false
|
||
|
||
/// 艺术家页面
|
||
/// - Parameter browseId: 艺术家Id
|
||
init(_ browseId:String) {
|
||
super.init(nibName: nil, bundle: nil)
|
||
browseid = browseId
|
||
//进行网络请求
|
||
MP_NetWorkManager.shared.requestArtist(browseId) { [weak self] result in
|
||
DispatchQueue.main.async {
|
||
[weak self] in
|
||
guard let self = self else {return}
|
||
artist = result
|
||
}
|
||
}
|
||
}
|
||
|
||
required init?(coder: NSCoder) {
|
||
super.init(coder: coder)
|
||
}
|
||
override func viewDidLoad() {
|
||
super.viewDidLoad()
|
||
setPopBtn()
|
||
setTitle("")
|
||
configure()
|
||
}
|
||
|
||
private func configure() {
|
||
segmentView.dataSource = dataSource
|
||
segmentView.indicators = [indicator]
|
||
view.addSubview(pagingView)
|
||
pagingView.snp.makeConstraints { make in
|
||
make.top.equalToSuperview()
|
||
make.left.right.bottom.equalToSuperview().priority(999)
|
||
}
|
||
segmentView.listContainer = pagingView.listContainerView
|
||
pagingView.listContainerView.backgroundColor = .clear
|
||
pagingView.listContainerView.listCellBackgroundColor = .clear
|
||
navView.addSubview(nameLabel)
|
||
nameLabel.snp.makeConstraints { make in
|
||
make.centerY.equalToSuperview()
|
||
make.left.equalToSuperview().offset(68*width)
|
||
make.right.equalToSuperview().offset(-16*width)
|
||
}
|
||
pagingView.pinSectionHeaderVerticalOffset = Int(statusBarHeight + (50*width))
|
||
}
|
||
}
|
||
//MARK: - JXPagingViewDelegate
|
||
extension MPPositive_ArtistShowViewController: JXPagingViewDelegate{
|
||
func pagingView(_ pagingView: JXPagingView, mainTableViewDidScroll scrollView: UIScrollView) {
|
||
//状态栏加导航栏高度
|
||
let allHeight = statusBarHeight + (50*width)
|
||
let maxHeight = headView.frame.height - allHeight
|
||
let currentOffset = scrollView.contentOffset
|
||
if currentOffset.y <= maxHeight {
|
||
//随着滚动变化header的透明度
|
||
let value:CGFloat = currentOffset.y/maxHeight
|
||
let topValue:CGFloat = 1-value
|
||
if value >= 0.8 {
|
||
nameLabel.alpha = 1
|
||
headView.alpha = 0
|
||
}else {
|
||
nameLabel.alpha = value
|
||
headView.alpha = topValue
|
||
}
|
||
}
|
||
}
|
||
//头部高度
|
||
func tableHeaderViewHeight(in pagingView: JXPagingView) -> Int {
|
||
return Int(headView.frame.height)
|
||
}
|
||
//头部View内容
|
||
func tableHeaderView(in pagingView: JXPagingView) -> UIView {
|
||
return headView
|
||
}
|
||
// 悬浮分页栏的高度
|
||
func heightForPinSectionHeader(in pagingView: JXPagingView) -> Int {
|
||
return Int(60 * width)
|
||
}
|
||
|
||
// 分页栏
|
||
func viewForPinSectionHeader(in pagingView: JXPagingView) -> UIView {
|
||
return segmentView
|
||
}
|
||
//分页数量
|
||
func numberOfLists(in pagingView: JXPagingView) -> Int {
|
||
return dataSource.titles.count
|
||
}
|
||
//要展现的View
|
||
func pagingView(_ pagingView: JXPagingView, initListAtIndex index: Int) -> JXPagingViewListViewDelegate {
|
||
let showView:MPPositive_ArtistShowTypeView = .init(frame: .init(x: 0, y: 0, width: screen_Width, height: screen_Height-headView.frame.height-(60 * width)), list: artist.lists[index])
|
||
showView.header = artist.header
|
||
showView.chooseItemBlock = {
|
||
[weak self] (item) in
|
||
guard let self = self else {return}
|
||
switch item.browseItem.itemType {
|
||
case .artist:
|
||
//用户查看艺术家
|
||
let artistVC = MPPositive_ArtistShowViewController(item.browseItem.browseId ?? "")
|
||
navigationController?.pushViewController(artistVC, animated: true)
|
||
case .list:
|
||
//列表专辑
|
||
let listVC = MPPositive_ListShowViewController(item.browseItem.browseId ?? "", params: "", title: item.title ?? "", subtitle: item.subtitle ?? "")
|
||
navigationController?.pushViewController(listVC, animated: true)
|
||
case .single:
|
||
MPPositive_Debouncer.shared.call {
|
||
[weak self] in
|
||
guard let self = self else {return}
|
||
//单曲/视频跳转
|
||
//触发next请求,优先获取列表全部单曲基础数据(不完善)
|
||
MP_NetWorkManager.shared.requestNextList(item.browseItem.playListId ?? "", videoId: item.browseItem.videoId ?? ""){ [weak self] listSongs in
|
||
guard let self = self else {return}
|
||
//回掉的数据并不完善,生成一个playerloadViewModel
|
||
let lodaViewModel = MPPositive_PlayerLoadViewModel(listSongs, currentVideoId: item.browseItem.videoId ?? "")
|
||
lodaViewModel.improveData(item.browseItem.videoId ?? "")
|
||
MP_PlayerManager.shared.loadPlayer = lodaViewModel
|
||
NotificationCenter.notificationKey.post(notificationName: .pup_player_vc)
|
||
}
|
||
}
|
||
case .none:
|
||
break
|
||
}
|
||
}
|
||
return showView
|
||
}
|
||
}
|