Music_Player3/relax.offline.mp3.music/MP/MPSideA/ViewControllers/Home(音乐资源列表)/MPSideA_PlayerViewController.swift
2024-09-06 18:21:15 +08:00

406 lines
15 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.

//
// PlayerViewController.swift
// MusicPlayer
//
// Created by Mr.Zhou on 2024/3/28.
//
import UIKit
///
enum MPSideA_PlayerState {
case Dark
case Light
///
var buttonBGColor:UIColor{
switch self {
case .Dark:
return .init(hex: "#FFFFFF", alpha: 0.15)
case .Light:
return .init(hex: "#F2F2F2")
}
}
///
var viewBGColor:UIColor{
switch self {
case .Dark:
return .init(hex: "#000000")
case .Light:
return .init(hex: "#FFFFFF")
}
}
///
var textColor:UIColor{
switch self {
case .Dark:
return .init(hex: "#FFFFFF")
case .Light:
return .init(hex: "#000000")
}
}
///
var thumbImage:UIImage{
switch self {
case .Dark:
return UIImage(named: "Thumb dark'logo")!
case .Light:
return UIImage(named: "Thumb light'logo")!
}
}
///
var minTrackColors:[UIColor]{
switch self {
case .Dark:
return [UIColor(hex: "#FFFFFF", alpha: 0.3), UIColor(hex: "#FFFFFF", alpha: 0.3)]
case .Light:
return [UIColor(hex: "#80F988", alpha: 0.2), UIColor(hex: "#80F988", alpha: 0.2)]
}
}
///
var effctView:UIBlurEffect{
switch self {
case .Dark:
if #available(iOS 13.0, *) {
return UIBlurEffect(style: .systemThickMaterialDark)
} else {
return UIBlurEffect(style: .dark)
}
case .Light:
return UIBlurEffect(style: .light)
}
}
}
///
@objcMembers class MPSideA_PlayerViewController: MPSideA_BaseViewController {
@IBOutlet weak var disMissBtn: UIButton!
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var effectView: UIVisualEffectView!
@IBOutlet weak var backImageView: UIImageView!
@IBOutlet weak var coverImageView: UIImageView!
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var slider: MP_PlayerSlider!{
didSet{
slider.thumbImage = state.thumbImage
slider.trackHeight = 10*width
slider.minTrackColors = state.minTrackColors
slider.minTrackLocations = [0.0,1.0]
slider.maxTrackColors = state.minTrackColors
slider.maxTrackLocations = [0.0,1.0]
slider.setNeedsDisplay()
}
}
@IBOutlet weak var volumeLabel: UILabel!
@IBOutlet weak var lampView: MPSideA_PlayerActionView!{
didSet{
lampView.darkImage = UIImage(named: "Lamp dark'logo")
lampView.lightImage = UIImage(named: "Lamp light'logo")
lampView.isDark = true
lampView.isPlaying = false
lampView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(lampActionClick(_ :))))
}
}
@IBOutlet weak var timerView: MPSideA_PlayerActionView!{
didSet{
timerView.darkImage = UIImage(named: "Timer dark'logo")
timerView.lightImage = UIImage(named: "Timer light'logo")
timerView.playingImage = UIImage(named: "Timer playing'logo")
timerView.isDark = true
timerView.isPlaying = false
timerView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(timerActionClick(_ :))))
}
}
@IBOutlet weak var timerLabel: UILabel!
@IBOutlet weak var autoView: MPSideA_PlayerActionView!{
didSet{
autoView.darkImage = UIImage(named: "Auto dark'logo")
autoView.lightImage = UIImage(named: "Auto light'logo")
autoView.playingImage = UIImage(named: "Auto playing'logo")
autoView.isDark = true
autoView.isPlaying = false
autoView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(autoActionClick(_ :))))
}
}
@IBOutlet weak var playBtn: UIButton!
@IBOutlet weak var maskView: UIImageView!
//
private var timer:CADisplayLink!
//()
private lazy var state:MPSideA_PlayerState = .Dark{
didSet{
setUpState(state)
}
}
//
private lazy var volume:Float = 0{
didSet{
//label
volumeLabel.text = String(format: "Volume%.2f", volume*100)
//slider
let value = volume
slider.value = value
}
}
//
private lazy var decibels:Float = 0.5
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = state.viewBGColor
playBtn.isSelected = MPSideA_MediaCenterManager.shared.getPlayerState() == .Playing
//
MPSideA_VolumeManager.shared.createVolume()
//
volume = MPSideA_VolumeManager.shared.getVolume()
if let music = MPSideA_MediaCenterManager.shared.getMusic() {
//
nameLabel.text = music.title
coverImageView.image = UIImage(data: music.cover)
backImageView.image = UIImage(data: music.cover)
}
lampView.backgroundColor = state.buttonBGColor
timerView.backgroundColor = state.buttonBGColor
autoView.backgroundColor = state.buttonBGColor
//
nullMusicAction = {
[weak self] in
//退
self?.navigationController?.popViewController(animated: true)
}
//
timer = CADisplayLink(target: self, selector: #selector(coverRotationalAction(_ :)))
//
timer.preferredFramesPerSecond = 20
//线
timer.add(to: RunLoop.current, forMode: .common)
timer.isPaused = true
addNotification()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
//
timer.isPaused = !(MPSideA_MediaCenterManager.shared.getPlayerState() == .Playing)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
//
MPSideA_MediaCenterManager.shared.stopMonitor()
}
deinit {
//
NotificationCenter.default.removeObserver(self)
//
MPSideA_VolumeManager.shared.destroyVolume()
//
timer = nil
}
//
private func addNotification() {
//
NotificationCenter.notificationKey.add(observer: self, selector: #selector(timesAction(_ :)), notificationName: .sideA_time_times)
NotificationCenter.notificationKey.add(observer: self, selector: #selector(volumeChangeAction(_ :)), notificationName: .sideA_volume_change)
NotificationCenter.notificationKey.add(observer: self, selector: #selector(playMusicAction(_ :)), notificationName: .sideA_play_music)
NotificationCenter.notificationKey.add(observer: self, selector: #selector(pauseMusicAction(_ :)), notificationName: .sideA_pause_music)
NotificationCenter.notificationKey.add(observer: self, selector: #selector(resumeMusicAction(_ :)), notificationName: .sideA_resume_music)
NotificationCenter.notificationKey.add(observer: self, selector: #selector(stopMusicAction(_ :)), notificationName: .sideA_stop_music)
NotificationCenter.notificationKey.add(observer: self, selector: #selector(fileMissAction(_ :)), notificationName: .sideA_null_music)
NotificationCenter.notificationKey.add(observer: self, selector: #selector(openMonitorAction(_ :)), notificationName: .sideA_open_monitor)
NotificationCenter.notificationKey.add(observer: self, selector: #selector(stopMonitorAction(_ :)), notificationName: .sideA_stop_monitor)
}
}
//MARK: -
extension MPSideA_PlayerViewController {
//退
@IBAction func disMissAction(_ sender: UIButton) {
dismiss(animated: true)
}
//
@IBAction func sliderVolumeAction(_ sender: MP_PlayerSlider) {
let value = sender.value
MPSideA_VolumeManager.shared.setVolume(value)
}
//
@objc private func lampActionClick(_ sender: MPSideA_PlayerActionView) {
if state == .Dark {
state = .Light
}else {
state = .Dark
}
}
//
@objc private func timerActionClick(_ sender: MPSideA_PlayerActionView) {
//
MPSideA_MediaCenterManager.shared.stopMonitor()
MPSideA_ModalType = .Timer
let timerVC = MPSideA_CountTimerViewController()
timerVC.transitioningDelegate = self
timerVC.modalPresentationStyle = .custom
present(timerVC, animated: true)
}
//
@objc private func autoActionClick(_ sender: MPSideA_PlayerActionView) {
guard authorize(observe: self) == true else {
print("No Microphone Access")
return
}
if autoView.isPlaying {
//
MPSideA_MediaCenterManager.shared.stopMonitor()
}else {
//
MPSideA_MediaCenterManager.shared.openMonitor(0.5)
}
}
///
@IBAction func playClick(_ sender: UIButton) {
//
MPSideA_MediaCenterManager.shared.stopMonitor()
//广
MP_AdMobManager.shared.showPlayInterstitialAdIfAvailable(completion: nil)
guard let music = MPSideA_MediaCenterManager.shared.getMusic() else {
//
print("No Data Music")
return
}
switch MPSideA_MediaCenterManager.shared.getPlayerState() {
case .Null://
MPSideA_MediaCenterManager.shared.playerStart(music, actionType: .Normal)
case .Playing://
MPSideA_MediaCenterManager.shared.playerPause()
case .Pause://
MPSideA_MediaCenterManager.shared.playerResume()
}
}
}
//MARK: -
extension MPSideA_PlayerViewController: UIViewControllerTransitioningDelegate {
//
@objc fileprivate func volumeChangeAction(_ sender:Notification) {
guard let value = sender.object as? Float else {
return
}
volume = value
}
//
private func setUpState(_ state:MPSideA_PlayerState) {
view.backgroundColor = state.viewBGColor
//
backImageView.isHidden = !(state == .Dark)
maskView.isHidden = !(state == .Dark)
titleLabel.textColor = state.textColor
//
effectView.effect = state.effctView
nameLabel.textColor = state.textColor
slider.thumbImage = state.thumbImage
slider.minTrackColors = state.minTrackColors
slider.maxTrackColors = state.minTrackColors
slider.setNeedsDisplay()
volumeLabel.textColor = state.textColor
//
disMissBtn.backgroundColor = state.buttonBGColor
lampView.backgroundColor = state.buttonBGColor
timerView.backgroundColor = state.buttonBGColor
autoView.backgroundColor = state.buttonBGColor
//
disMissBtn.isSelected = !(state == .Dark)
lampView.isDark = (state == .Dark)
timerView.isDark = (state == .Dark)
autoView.isDark = (state == .Dark)
}
//
@objc private func timesAction(_ sender:Notification) {
DispatchQueue.main.async {
[weak self] in
guard let self = self else { return }
let time = sender.object as! TimeInterval
timerView.isPlaying = true
timerLabel.isHidden = false
timerLabel.text = setTimesToMins(time)
}
}
//
@objc private func completeAction(_ sender:Notification) {
DispatchQueue.main.async {
[weak self] in
guard let self = self else { return }
timerView.isPlaying = false
timerLabel.isHidden = true
timerLabel.text = "00"
}
}
//
@objc private func playMusicAction(_ sender:Notification) {
DispatchQueue.main.async {
[weak self] in
guard let self = self else { return }
playBtn.isSelected = true
autoView.isPlaying = false
//
coverImageView.transform = .identity
timer.isPaused = false
}
}
//
@objc private func pauseMusicAction(_ sender:Notification) {
DispatchQueue.main.async {
[weak self] in
guard let self = self else { return }
playBtn.isSelected = false
timer.isPaused = true
}
}
//
@objc private func resumeMusicAction(_ sender:Notification) {
DispatchQueue.main.async {
[weak self] in
guard let self = self else { return }
playBtn.isSelected = true
timer.isPaused = false
}
}
//
@objc private func stopMusicAction(_ sender:Notification) {
DispatchQueue.main.async {
[weak self] in
guard let self = self else { return }
playBtn.isSelected = false
timerView.isPlaying = false
timerLabel.isHidden = true
timerLabel.text = "00"
timer.isPaused = true
coverImageView.transform = .identity
}
}
//
@objc private func openMonitorAction(_ sender:Notification) {
DispatchQueue.main.async {
[weak self] in
guard let self = self else { return }
autoView.isPlaying = true
}
}
//
@objc private func stopMonitorAction(_ sender:Notification) {
DispatchQueue.main.async {
[weak self] in
guard let self = self else { return }
autoView.isPlaying = false
}
}
//-
@objc private func coverRotationalAction(_ link:CADisplayLink) {
//使/
DispatchQueue.main.async {
[weak self] in
guard let self = self else { return }
let angle = CGFloat.pi / 200
coverImageView.transform = coverImageView.transform.rotated(by: angle)
}
}
func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
return MPSideA_PresentationController(presentedViewController: presented, presenting: presenting)
}
}