Music_Player3/MusicPlayer/MP/MPPositive/ViewControllers/Home(首页,各项列表页,艺术家页)/MPPositive_ArtistShowViewController.swift
2024-05-31 17:05:17 +08:00

272 lines
11 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// MPPositive_ArtistShowViewController.swift
// MusicPlayer
//
// Created by Mr.Zhou on 2024/5/15.
//
import UIKit
class MPPositive_ArtistShowViewController: MPPositive_BaseViewController, UIViewControllerTransitioningDelegate {
///
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{
DispatchQueue.main.async {
[weak self] in
guard let self = self else {return}
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()
configure()
removeErrorView()
MP_HUD.hideNow()
}
}
}
}
var browseid:String = ""
var iscollection:Bool = false
///
/// - Parameter browseId: Id
init(_ browseId:String) {
super.init(nibName: nil, bundle: nil)
browseid = browseId
MP_HUD.loading()
//
MP_NetWorkManager.shared.requestArtist(browseId) { [weak self] result in
guard let self = self else {return}
artist = result
}
}
required init?(coder: NSCoder) {
super.init(coder: coder)
}
override func viewDidLoad() {
super.viewDidLoad()
setPopBtn()
setTitle("")
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()
MP_NetWorkManager.shared.requestArtist(self.browseid) { [weak self] result in
guard let self = self else {return}
artist = result
}
}
}
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.artistId ?? "")
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
}
}
showView.moreBlock = {
[weak self] (itemView) in
guard let self = self else {return}
MPPositive_Debouncer.shared.call {
MP_NetWorkManager.shared.requestNextList("", videoId: itemView.browseItem.videoId ?? ""){ [weak self] listSongs in
guard let first = listSongs.first else {return}
let group = DispatchGroup()
group.enter()
improveDataforLycirsAndRelated(first) {[weak self] (result) in
first.lyricsID = result.0
first.relatedID = result.1
group.leave()
}
group.enter()
//
improveDataforResouceAndCover(first) {[weak self] resourceUrls, coverUrls in
first.resourceUrls = resourceUrls.0
first.itags = resourceUrls.1
first.mimeTypes = resourceUrls.2
first.coverUrls = coverUrls
group.leave()
}
group.notify(queue: .main, execute: {
[weak self] in
MPPositive_ModalType = .MoreOperations
let moreVC = MPPositive_MoreSongOperationsViewController(first)
moreVC.transitioningDelegate = self
moreVC.modalPresentationStyle = .custom
self?.present(moreVC, animated: true)
})
}
}
}
return showView
}
func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
return MPPositive_PresentationController(presentedViewController: presented, presenting: presenting)
}
}