// // MPPositive_PlayerViewController.swift // MusicPlayer // // Created by Mr.Zhou on 2024/4/29. // import UIKit import Kingfisher ///b面播放器内容 class MPPositive_PlayerViewController: MPPositive_BaseViewController, UIViewControllerTransitioningDelegate { //播放器展示状态 enum PlayerShowType:Int { ///展示封面 case showCover = 0 ///展示歌词 case showLyric = 1 } //当前上方展示View展示内容(默认展示封面) private var topShowType:PlayerShowType = .showCover{ didSet{ setSwitchAnimation(topShowType) } } //MARK: - 导航View中的内容 //左侧向下的按钮 private lazy var leftPopBtn:UIButton = { let btn = UIButton() btn.backgroundColor = .init(hex: "#FFFFFF", alpha: 0.15) //添加白色边框 btn.layer.borderColor = UIColor(hex: "#FFFFFF", alpha: 0.3).cgColor btn.layer.borderWidth = 1*width btn.layer.cornerRadius = 21*width btn.layer.masksToBounds = true //设置图片 btn.setImage(UIImage(named: "Player_Pop'logo"), for: .normal) btn.addTarget(self, action: #selector(disMissClick(_ :)), for: .touchUpInside) return btn }() //中间单选按钮组View(SONG|LYRICS) private lazy var switchActionView:UIView = createSwitchActionView() //生成SONG按钮(默认选中) private lazy var songBtn:UIButton = createStatueBtn("SONG", color: .init(hex: "#FFFFFF", alpha: 0.85), tag: 0) //生成LYRICS按钮 private lazy var lyricsBtn:UIButton = createStatueBtn("LYRICS", color: .init(hex: "#FFFFFF", alpha: 0.45), tag: 1) //右侧关联按钮 private lazy var relatedBtn:UIButton = { let btn = UIButton() btn.setBackgroundImage(UIImage(named: "Player_Related'logo"), for: .normal) btn.addTarget(self, action: #selector(relatedContentClick(_ :)), for: .touchUpInside) return btn }() //MARK: - 背景视图 //背景封面图 private lazy var backImageView:UIImageView = { let imageView:UIImageView = .init() imageView.image = placeholderImage imageView.contentMode = .scaleAspectFill return imageView }() //背景模糊图层 private lazy var backBlurView:UIVisualEffectView = { // 创建一个模糊效果 let blurEffect = UIBlurEffect(style: .dark) // 创建一个可交互的毛玻璃视图 let blurEffectView = UIVisualEffectView(effect: blurEffect) blurEffectView.alpha = 1 blurEffectView.isUserInteractionEnabled = false blurEffectView.contentView.addSubview(blurContentView) blurContentView.snp.makeConstraints { make in make.left.top.right.bottom.equalToSuperview() } return blurEffectView }() //模糊涂层间隔View private lazy var blurContentView:UIView = { let contentView = UIView() contentView.backgroundColor = .clear return contentView }() ///断网提醒View private lazy var maskNotReachableView:UIView = { let maskView = UIView(frame: .init(x: 0, y: 0, width: 300*width, height: 35*width)) maskView.backgroundColor = .init(hex: "#000000", alpha: 0.6) maskView.layer.masksToBounds = true maskView.layer.cornerRadius = 21*width //放置一个label let noticeLabel:UILabel = createLabel("Bad connection~", font: .systemFont(ofSize: 13*width, weight: .regular), textColor: .white, textAlignment: .center, lines: 0) maskView.addSubview(noticeLabel) noticeLabel.snp.makeConstraints { make in make.centerY.equalToSuperview() make.centerX.equalToSuperview().multipliedBy(1.2) } //放置一个icon let iconImageView:UIImageView = .init(image: .init(named: "Player_NoNet'log")) maskView.addSubview(iconImageView) iconImageView.snp.makeConstraints { make in make.centerY.equalToSuperview() make.right.equalTo(noticeLabel.snp.left).offset(-10*width) make.width.equalTo(24*width) make.height.equalTo(24*width) } return maskView }() //MARK: - 底部按钮事件内容 //播放状态按钮 private lazy var playBtn:UIButton = { let btn:UIButton = .init() btn.setBackgroundImage(UIImage(named: "Player_Pause'logo"), for: .normal) btn.setBackgroundImage(UIImage(named: "Player_Player'logo"), for: .selected) btn.addTarget(self, action: #selector(playClick(_ :)), for: .touchUpInside) //默认无法交互(以免用户交互导致网络请求混乱) btn.isUserInteractionEnabled = true return btn }() //歌单列表按钮 private lazy var listBtn:UIButton = { let btn:UIButton = .init() btn.setBackgroundImage(UIImage(named: "Player_List'logo"), for: .normal) btn.addTarget(self, action: #selector(listClick(_ :)), for: .touchUpInside) return btn }() //播放类型按钮(按顺序播放,随机播放,单曲循环) private lazy var typeBtn:UIButton = { let btn = UIButton() btn.setBackgroundImage(UIImage(named: "Player_Normal'logo"), for: .normal) btn.addTarget(self, action: #selector(typeClick(_ :)), for: .touchUpInside) return btn }() //下一首按钮 private lazy var nextBtn:UIButton = { let btn = UIButton() btn.setBackgroundImage(UIImage(named: "Player_Next'logo"), for: .normal) btn.addTarget(self, action: #selector(nextClick(_ :)), for: .touchUpInside) return btn }() //上一首 private lazy var perviousBtn:UIButton = { let btn = UIButton() btn.setBackgroundImage(UIImage(named: "Player_Pervious'logo"), for: .normal) btn.addTarget(self, action: #selector(previousClick(_ :)), for: .touchUpInside) return btn }() //活动加载器 private lazy var activityIndicator:UIActivityIndicatorView = { let activityIndicator:UIActivityIndicatorView = .init(frame: .init(x: 0, y: 0, width: 66*width, height: 66*width)) activityIndicator.style = .gray activityIndicator.backgroundColor = .white activityIndicator.layer.masksToBounds = true activityIndicator.layer.cornerRadius = 33*width activityIndicator.color = .black return activityIndicator }() //下载引导层 private lazy var leadMaskView:UIView = { let maskView = UIView(frame: .init(x: 0, y: 0, width: screen_Width, height: screen_Height)) maskView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(maskMissClick(_ :)))) maskView.isUserInteractionEnabled = true maskView.backgroundColor = .init(hex: "#000000", alpha: 0.6) return maskView }() //下载提示层 private lazy var leadNoticeView:UIView = { let noticeView:UIView = .init(frame: .init(x: 0, y: 0, width: 120*width, height: 43*width)) noticeView.backgroundColor = .clear //添加一个提示弹窗 let noticeImageView = UIImageView(image: .init(named: "Click_Download'logo")) noticeView.addSubview(noticeImageView) noticeImageView.snp.makeConstraints { make in make.left.top.right.bottom.equalToSuperview() } return noticeView }() //封面View(封面,标题,副标题,收藏,下载,进度条View) private lazy var coverView:MPPositive_PlayerCoverView = .init(frame: .init(x: 0, y: 0, width: screen_Width, height: 480*width)) //歌词View private lazy var lyricsView:MPPositive_PlayerLyricView = .init(frame: .init(x: 0, y: 0, width: screen_Width, height: 480*width)) var recommendBlock:(() -> Void)? var searchBlock:((String) -> Void)? override func viewDidLoad() { super.viewDidLoad() //隐藏导航栏label setTitle("") configure() //打开时检索播放器状态,好调整内容 MP_PlayerManager.shared.runActionBlock = { [weak self] (currentTime, duration) in guard let self = self else { return } DispatchQueue.main.async { //展示当前时间 self.coverView.durationLabel.text = setTimesToMinSeconds(currentTime) //展示剩余时间 let remain:TimeInterval = duration - currentTime self.coverView.maxTimesLabel.text = setTimesToMinSeconds(remain) //调整进度条内容 let value = currentTime/duration self.coverView.sliderView.value = Float(value) } } //当缓存变化时 MP_PlayerManager.shared.cacheValueBlock = { [weak self] (value, duration) in guard let self = self else { return } DispatchQueue.main.async { if value < duration { //进度缓存中 let float = value/duration self.coverView.progressView.setProgress(Float(float), animated: false) }else { //进度缓存满了 self.coverView.progressView.setProgress(1, animated: false) } } } switchPlayBtnStatu(MP_PlayerManager.shared.getPlayState()) coverView.cancelBlock = { [weak self] in guard let self = self else {return} //点击取消下载 let alertController = UIAlertController(title: "Cancel Song Download Task".localizableString(), message: "Are you sure you want to cancel the download task of this song?".localizableString(), preferredStyle: .alert) let cancel = UIAlertAction(title: "Cancel".localizableString(), style: .cancel) alertController.addAction(cancel) let sure = UIAlertAction(title: "Confirm".localizableString(), style: .destructive) {(action) in guard let videoId = MP_PlayerManager.shared.loadPlayer?.currentVideo?.song?.videoId else {return} //确定取消 MP_DownloadManager.shared.cancelDownloadTask(videoId) { videoId in MP_HUD.text("Cancel".localizableString(), delay: 1.0, completion: nil) self.uploadUI() MP_PlayerManager.shared.loadPlayer?.currentVideo?.reloadCollectionAndDownLoad() } } alertController.addAction(sure) present(alertController, animated: true) } coverView.deleteBlock = { [weak self] in guard let self = self else {return} //点击删除下载 let alertController = UIAlertController(title: "Delete This Song".localizableString(), message: "Are you sure you want to delete the offline resources of this song?".localizableString(), preferredStyle: .alert) let cancel = UIAlertAction(title: "Cancel".localizableString(), style: .cancel) alertController.addAction(cancel) let sure = UIAlertAction(title: "Confirm".localizableString(), style: .destructive) {(action) in guard let videoId = MP_PlayerManager.shared.loadPlayer?.currentVideo?.song?.videoId else {return} //确定删除 MP_DownloadManager.shared.deleteFileDocuments(videoId) { videoId in MP_HUD.progress("Loading...".localizableString(), delay: 0.5) { MP_HUD.text("Removed".localizableString(), delay: 1.0, completion: nil) self.uploadUI() MP_PlayerManager.shared.loadPlayer?.currentVideo?.reloadCollectionAndDownLoad() } } } alertController.addAction(sure) present(alertController, animated: true) } coverView.searchBlock = { [weak self] (text) in guard let self = self else {return} dismiss(animated: true) { if let block = self.searchBlock { block(text) } } } } deinit { NotificationCenter.default.removeObserver(self) } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) //添加监听 NotificationCenter.notificationKey.add(observer: self, selector: #selector(playerReloadAction(_ :)), notificationName: .positive_player_reload) NotificationCenter.notificationKey.add(observer: self, selector: #selector(statusSwitchAction(_:)), notificationName: .switch_player_status) NotificationCenter.notificationKey.add(observer: self, selector: #selector(playerTypeSwitchAction(_:)), notificationName: .player_type_switch) NotificationCenter.notificationKey.add(observer: self, selector: #selector(deleteListAction(_:)), notificationName: .player_delete_list) //添加监听 NotificationCenter.notificationKey.add(observer: self, selector: #selector(netWorkNotReachableAction(_:)), notificationName: .net_switch_notReachable) NotificationCenter.notificationKey.add(observer: self, selector: #selector(netWorkReachableAction(_:)), notificationName: .net_switch_reachable) // switchPlayBtnStatu(MP_PlayerManager.shared.getPlayState()) //判断播放器是否装填数据 if MP_PlayerManager.shared.loadPlayer?.currentVideo != nil { uploadUI() } if MP_PlayerManager.shared.videoLayer.player != MP_PlayerManager.shared.player { MP_PlayerManager.shared.videoLayer.player = MP_PlayerManager.shared.player } } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) NotificationCenter.default.removeObserver(self) MP_PlayerManager.shared.videoLayer.player = nil // print("视频Layer移除") // MP_PlayerManager.shared.videoLayer.removeFromSuperlayer() } override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() if leadMaskView.superview != nil { setMaskLayer() } } //视图配置 private func configure() { //导航View内容配置 navView.addSubview(leftPopBtn) leftPopBtn.snp.makeConstraints { make in make.width.height.equalTo(42*width) make.left.equalToSuperview().offset(16*width) make.centerY.equalToSuperview() } navView.addSubview(relatedBtn) relatedBtn.snp.makeConstraints { make in make.width.height.equalTo(24*width) make.right.equalToSuperview().offset(-16*width) make.centerY.equalToSuperview() } navView.addSubview(switchActionView) switchActionView.snp.makeConstraints { make in make.height.equalToSuperview() make.width.equalToSuperview().multipliedBy(0.45) make.center.equalToSuperview() } //背景内容配置 view.addSubview(backImageView) backImageView.snp.makeConstraints { make in make.left.right.top.bottom.equalToSuperview() } view.addSubview(backBlurView) backBlurView.snp.makeConstraints { make in make.left.right.top.bottom.equalToSuperview() } let bottomImageView:UIImageView = .init(image: .init(named: "Player_Bottom'mask")) bottomImageView.contentMode = .scaleAspectFill bottomImageView.isUserInteractionEnabled = false view.addSubview(bottomImageView) bottomImageView.snp.makeConstraints { make in make.left.right.bottom.equalToSuperview() make.height.equalTo(286*width) } //底部容器配置 let bottomView = createBottomView() view.addSubview(bottomView) bottomView.snp.makeConstraints { make in make.left.right.bottom.equalToSuperview() make.height.equalTo(200*width) } //配置封面和歌词 view.addSubview(lyricsView) lyricsView.snp.makeConstraints { make in make.top.equalTo(navView.snp.bottom) make.left.right.equalToSuperview() make.height.equalTo(480*width) } lyricsView.isHidden = true view.addSubview(coverView) coverView.snp.makeConstraints { make in make.top.equalTo(navView.snp.bottom) make.left.right.equalToSuperview() make.height.equalTo(480*width) } coverView.isHidden = false if MP_PlayerManager.shared.videoLayer.superlayer == nil { print("将视频Layer添加") coverView.videoView.layer.addSublayer(MP_PlayerManager.shared.videoLayer) MP_PlayerManager.shared.videoLayer.frame = .init(x: 0, y: 0, width: screen_Width, height: 360*width ) } view.addSubview(maskNotReachableView) maskNotReachableView.snp.makeConstraints { make in make.centerX.equalToSuperview() make.top.equalTo(navView.snp.bottom) make.width.equalTo(176*width) make.height.equalTo(42*width) } maskNotReachableView.isHidden = (MP_NetWorkManager.shared.netWorkStatu == .reachable) guard UserDefaults.standard.bool(forKey: "isFristPlayer") != true else { return } UserDefaults.standard.set(true, forKey: "isFristPlayer") view.addSubview(leadMaskView) } //生成一个单选按钮组View private func createSwitchActionView() -> UIView { let actionView:UIView = UIView() actionView.backgroundColor = .clear actionView.addSubview(songBtn) songBtn.snp.makeConstraints { make in make.centerY.equalToSuperview() make.centerX.equalToSuperview().multipliedBy(0.5) } actionView.addSubview(lyricsBtn) lyricsBtn.snp.makeConstraints { make in make.centerY.equalToSuperview() make.centerX.equalToSuperview().multipliedBy(1.5) } //生成间隔线View let lineView:UIView = .init() lineView.backgroundColor = .init(hex: "#FFFFFF", alpha: 0.45) actionView.addSubview(lineView) lineView.snp.makeConstraints { make in make.center.equalToSuperview() make.width.equalTo(1*width) make.height.equalTo(14*width) } //生成按钮 return actionView } //生成页面状态按钮 private func createStatueBtn(_ text:String = "text", color:UIColor, tag:Int) -> UIButton { let btn = UIButton() btn.setTitle(text, for: .normal) btn.setTitleColor(color, for: .normal) btn.titleLabel?.font = .systemFont(ofSize: 15, weight: .regular) btn.tag = tag btn.addTarget(self, action: #selector(switchActionClick(_ :)), for: .touchUpInside) return btn } //生成一个底部容器View private func createBottomView() -> UIView { let bottomView:UIView = .init() bottomView.backgroundColor = .clear bottomView.addSubview(playBtn) playBtn.snp.makeConstraints { make in make.width.height.equalTo(66*width) make.centerX.equalToSuperview() make.centerY.equalToSuperview().multipliedBy(1.1) } bottomView.addSubview(activityIndicator) activityIndicator.snp.makeConstraints { make in make.center.equalTo(playBtn) make.width.height.equalTo(playBtn) } let state = MP_PlayerManager.shared.getPlayState() switch state { case .Null: activityIndicator.isHidden = false activityIndicator.startAnimating() default: activityIndicator.isHidden = false activityIndicator.stopAnimating() } bottomView.addSubview(listBtn) listBtn.snp.makeConstraints { make in make.right.equalToSuperview().offset(-20*width) make.centerY.equalTo(playBtn) make.width.height.equalTo(24*width) } bottomView.addSubview(typeBtn) typeBtn.snp.makeConstraints { make in make.left.equalToSuperview().offset(20*width) make.centerY.equalTo(playBtn) make.width.height.equalTo(24*width) } bottomView.addSubview(nextBtn) nextBtn.snp.makeConstraints { make in make.width.height.equalTo(30*width) make.centerY.equalTo(playBtn.snp.centerY) make.right.equalToSuperview().offset(-98*width) } bottomView.addSubview(perviousBtn) perviousBtn.snp.makeConstraints { make in make.width.height.equalTo(30*width) make.centerY.equalTo(playBtn.snp.centerY) make.left.equalToSuperview().offset(98*width) } return bottomView } //设置阴影层 private func setMaskLayer() { // 创建一个遮罩层 let maskLayer = CAShapeLayer() // 创建全屏路径 let path = UIBezierPath(rect: leadMaskView.bounds) // 获取下载按钮的 frame,并计算出要突出显示的圆形区域 let buttonFrame = self.coverView.downloadButton.convert(self.coverView.downloadButton.bounds, to: leadMaskView) let circlePath = UIBezierPath(ovalIn: buttonFrame.insetBy(dx: -15, dy: -15)) // 圆形区域比按钮稍大 // 将圆形路径添加到全屏路径中(注意使用 `.byReversingPath()` 反转路径,这样圆圈内是透明的) path.append(circlePath.reversing()) // 将路径赋值给遮罩层 maskLayer.path = path.cgPath // 将遮罩层应用到遮罩视图上 leadMaskView.layer.mask = maskLayer view.addSubview(leadNoticeView) leadNoticeView.snp.makeConstraints { make in make.right.equalTo(self.coverView.downloadButton.snp.centerX).offset(43.5*width) make.centerY.equalTo(self.coverView.downloadButton.snp.centerY).offset(-60*width) make.width.equalTo(180*width) make.height.equalTo(64.5*width) } } //MARK: - 页面渲染 private func uploadUI() { DispatchQueue.main.async { [weak self] in guard let self = self, let currentVideo = MP_PlayerManager.shared.loadPlayer?.currentVideo else {return} print("\(currentVideo.title ?? "")刷新了页面") //填充数据 backImageView.kf.setImage(with: currentVideo.coverUrl, placeholder: placeholderImage) coverView.coverImageView.kf.setImage(with: currentVideo.coverUrl, placeholder: placeholderImage) coverView.titleLabel.text = currentVideo.title coverView.subtitleLabel.text = currentVideo.subtitle lyricsView.titleLabel.text = currentVideo.title lyricsView.subtitleLabel.text = currentVideo.subtitle lyricsView.lyricsLabel.text = (currentVideo.lyrics ?? "").isEmpty == true ? "No Lyrics":currentVideo.lyrics MPPositive_DownloadItemModel.fetch(predicate: .init(format: "videoId == %@", currentVideo.song.videoId ?? "")) { [weak self] results in self?.coverView.downloadButton.state = results.count != 0 ? .downloaded:.startDownload } coverView.collectionSongBtn.isSelected = currentVideo.isCollection ?? false coverView.setProgress(currentVideo.song?.videoId ?? "") switchPlayTypeBtnIcon(typeBtn) if let item = currentVideo.resourcePlayerItem { MP_PlayerManager.shared.isCoverVideo(playerItem: item) { [weak self] bool in DispatchQueue.main.async { self?.blurContentView.backgroundColor = bool ? .clear:.black self?.coverView.coverImageView.isHidden = !bool self?.coverView.videoView.isHidden = bool } } } // activityIndicator.isHidden = true // activityIndicator.stopAnimating() } } //网络不可用时触发 @objc private func netWorkNotReachableAction(_ sender:Notification) { DispatchQueue.main.async { [weak self] in guard let self = self else {return} maskNotReachableView.isHidden = false } } //网络可用时触发 @objc private func netWorkReachableAction(_ sender:Notification) { DispatchQueue.main.async { [weak self] in guard let self = self else {return} maskNotReachableView.isHidden = true } } //MARK: - 通知 //播放器音乐刷新 @objc private func playerReloadAction(_ sender:Notification) { //渲染页面 DispatchQueue.main.async { [weak self] in guard let self = self else {return} uploadUI() //回正进度条 coverView.sliderView.value = 0 //调整时间值 coverView.durationLabel.text = setTimesToMinSeconds(0) //调整最大时间值 coverView.maxTimesLabel.text = setTimesToMinSeconds(0) //开始播放 MP_PlayerManager.shared.play { [weak self] in guard let self = self else { return } //允许playBtn按钮交互 playBtn.isUserInteractionEnabled = true } } } //切换播放器状态时 @objc private func statusSwitchAction(_ sender:Notification) { guard let object = sender.object else {return} DispatchQueue.main.async { [weak self] in guard let self = self else {return} let state:MP_PlayerStateType = sender.object as! MP_PlayerStateType DispatchQueue.main.async { [weak self] in self?.switchPlayBtnStatu(state) } } } private func switchPlayBtnStatu(_ state:MP_PlayerStateType) { switch state { case .Playing: playBtn.isSelected = true activityIndicator.isHidden = true activityIndicator.stopAnimating() case .Pause: playBtn.isSelected = false activityIndicator.isHidden = true activityIndicator.stopAnimating() default: playBtn.isSelected = false activityIndicator.isHidden = false activityIndicator.startAnimating() } } //切换播放器播放方式 @objc private func playerTypeSwitchAction(_ sender:Notification) { DispatchQueue.main.async { [weak self] in guard let self = self else {return} switchPlayTypeBtnIcon(typeBtn) } } //用户清空了歌单列表 @objc private func deleteListAction(_ sender:Notification) { DispatchQueue.main.async { [weak self] in guard let self = self else {return} dismiss(animated: true) } } //MARK: - 点击事件 //向下dismiss @objc private func disMissClick(_ sender:UIButton) { dismiss(animated: true) } //引导遮罩层事件 @objc private func maskMissClick(_ sender:UITapGestureRecognizer) { view.endEditing(true) sender.view?.removeFromSuperview() leadNoticeView.removeFromSuperview() } //切换页面显示内容(单曲封面|歌词)按钮组 @objc private func switchActionClick(_ sender:UIButton) { guard MP_NetWorkManager.shared.netWorkStatu == .reachable else { MP_HUD.text("Bad connection~".localizableString(), delay: 2.0, completion: nil) return } topShowType = .init(rawValue: sender.tag)! } //切换动画 private func setSwitchAnimation(_ sender: PlayerShowType) { //切换时,禁止segmentedView交互 switchActionView.isUserInteractionEnabled = false switch sender { case .showCover://展示封面 UIView.animate(withDuration: 0.4) { [weak self] in guard let self = self else {return} //展示封面 coverView.alpha = 1.0 coverView.isHidden = false //lyricView隐藏 lyricsView.alpha = 0.1 songBtn.setTitleColor(.init(hex: "#FFFFFF", alpha: 0.85), for: .normal) lyricsBtn.setTitleColor(.init(hex: "#FFFFFF", alpha: 0.45), for: .normal) } completion: { [weak self] (_) in guard let self = self else {return} //平移结束后,隐藏lyricListView lyricsView.isHidden = true //完成状况允许交互 switchActionView.isUserInteractionEnabled = true } case .showLyric://展示歌词 UIView.animate(withDuration: 0.4) { [weak self] in guard let self = self else {return} //展示歌词 lyricsView.alpha = 1.0 lyricsView.isHidden = false //coverView向左平移一个屏幕尺度 coverView.alpha = 0.1 songBtn.setTitleColor(.init(hex: "#FFFFFF", alpha: 0.45), for: .normal) lyricsBtn.setTitleColor(.init(hex: "#FFFFFF", alpha: 0.85), for: .normal) } completion: { [weak self] (_) in guard let self = self else {return} //平移结束后,隐藏coverView coverView.isHidden = true //完成状况允许交互 switchActionView.isUserInteractionEnabled = true } } } //弹出关联内容 @objc private func relatedContentClick(_ sender:UIButton) { guard MP_NetWorkManager.shared.netWorkStatu == .reachable else { MP_HUD.text("Bad connection~".localizableString(), delay: 2.0, completion: nil) return } guard MP_PlayerManager.shared.loadPlayer?.currentVideo?.song.relatedID != nil else {return} //先dismiss if recommendBlock != nil { recommendBlock!() } dismiss(animated: true) } //播放/暂停/继续 @objc private func playClick(_ sender:UIButton) { guard let _ = MP_PlayerManager.shared.loadPlayer else { return } //在当前音乐填充好之前,禁止触发点击 switch MP_PlayerManager.shared.getPlayState() { case .Null: //启动播放 MP_PlayerManager.shared.play { [weak self] in guard let self = self else { return } //回正进度条 coverView.sliderView.value = 0 } case .Playing: //播放中,进入暂停 MP_PlayerManager.shared.pause { [weak self] in } case .Pause: //暂停中,进入继续 MP_PlayerManager.shared.resume { [weak self] in } } } //展示列表 @objc private func listClick(_ sender:UIButton) { guard let _ = MP_PlayerManager.shared.loadPlayer else {return} MPPositive_Debouncer.shared.call { [weak self] in guard let self = self else {return} MPPositive_ModalType = .PlayerList let listVC = MPPositive_PlayerListShowViewController() listVC.searchBlock = { [weak self] (text) in self?.dismiss(animated: true) { if let block = self?.searchBlock { block(text) } } } listVC.transitioningDelegate = self listVC.modalPresentationStyle = .custom present(listVC, animated: true) } } func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? { return MPPositive_PresentationController(presentedViewController: presented, presenting: presenting) } //切换播放器状态(按顺序/随机/单曲) @objc private func typeClick(_ sender:UIButton) { MPPositive_Debouncer.shared.call { [weak self] in guard let self = self else {return} //对播放器播放方式截形切换 var value = MP_PlayerManager.shared.getPlayType().rawValue value += 1 if value > 2 { value = 0 } MP_PlayerManager.shared.setPlayType(.init(rawValue: value)!) } } //下一首 @objc private func nextClick(_ sender:UIButton) { guard let _ = MP_PlayerManager.shared.loadPlayer?.currentVideo else { return } //切歌广告 if MP_NetWorkManager.shared.netWorkStatu == .reachable { MP_ADSimpleManager.shared.showPlayInterstitialAdIfAvailable(nil) } MPPositive_Debouncer.shared.call { [weak self] in guard let self = self else {return} coverView.sliderView.value = 0 MP_PlayerManager.shared.nextEvent() } } //上一首 @objc private func previousClick(_ sender:UIButton) { guard let _ = MP_PlayerManager.shared.loadPlayer?.currentVideo else { return } //切歌广告 if MP_NetWorkManager.shared.netWorkStatu == .reachable { MP_ADSimpleManager.shared.showPlayInterstitialAdIfAvailable(nil) } MPPositive_Debouncer.shared.call { [weak self] in guard let self = self else {return} coverView.sliderView.value = 0 MP_PlayerManager.shared.previousEvent() } } }