发布时间:2026-09-28 18:27:52 浏览次数:1
“iOS音乐播放器实现代码完整版”是一篇关于在iOS平台上实现音乐播放器的完整教程,以下是该攻略的详细讲解:
本文将详细介绍在iOS平台开发一个完整的音乐播放器所需的代码实现步骤。我们将会使用Apple提供的AVFoundation框架来完成音频的播放、暂停、停止、快进、快退、调整音量等基本操作,并且在界面上展示当前音频的播放进度、歌曲信息、专辑封面等信息。
在开始之前,我们需要准备以下工作:
另外,我们还需要在项目中引入AVFoundation框架,并在代码中导入相关的头文件。
本教程将基于MVC架构来实现音乐播放器。具体实现步骤如下:
我们使用一个名为MusicModel的模型类来存储音频的相关信息,如歌曲名、歌手、专辑名、歌曲路径等。该类的部分代码如下:
class MusicModel { var musicTitle: String // 歌曲名 var musicArtist: String // 歌手名 var musicAlbum: String // 专辑名 var musicPath: String // 歌曲文件路径 init(title: String, artist: String, album: String, path: String) { self.musicTitle = title self.musicArtist = artist self.musicAlbum = album self.musicPath = path }}我们使用一个名为MusicPlayerViewController的控制器来控制音乐的播放、暂停、停止、快进、快退、调整音量等操作。该控制器的部分代码如下:
class MusicPlayerViewController: UIViewController { // 模型层 var musicModel: MusicModel? // AVPlayer实例 private var player: AVPlayer? override func viewDidLoad() { super.viewDidLoad() // 初始化AVPlayer实例 if let path = musicModel?.musicPath { let url = URL(fileURLWithPath: path) player = AVPlayer(url: url) } } func play() { player?.play() } func pause() { player?.pause() } func stop() { player?.pause() player?.seek(to: CMTime.zero) } func fastForward() { let currentTime = player?.currentTime() let timeToAdd = CMTime(value: 15, timescale: 1) player?.seek(to: currentTime! + timeToAdd) } func rewind() { let currentTime = player?.currentTime() let timeToSubtract = CMTime(value: 15, timescale: 1) player?.seek(to: currentTime! - timeToSubtract) } func volume(_ value: Float) { player?.volume = value }}我们使用一个名为MusicPlayViewController的控制器来展示音乐的播放状态、歌曲封面、歌曲信息等,并且通过调用MusicPlayerViewController中的方法来实现音乐的播放、暂停、停止、快进、快退、调整音量等操作。该控制器的部分代码如下:
class MusicPlayViewController: UIViewController { // 模型层 var musicModel: MusicModel? // 控制器层 let musicPlayerVC = MusicPlayerViewController() // 歌曲封面ImageView let musicCoverImageView: UIImageView = { let imageView = UIImageView() imageView.translatesAutoresizingMaskIntoConstraints = false imageView.image = UIImage(named: "default") imageView.contentMode = .scaleAspectFit imageView.clipsToBounds = true return imageView }() // 歌曲信息UILabel let musicInfoLabel: UILabel = { let label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false label.font = UIFont.systemFont(ofSize: 17) label.textColor = .black label.numberOfLines = 0 label.textAlignment = .center return label }() override func viewDidLoad() { super.viewDidLoad() // 设置背景色 view.backgroundColor = .white // 添加子视图 view.addSubview(musicCoverImageView) view.addSubview(musicInfoLabel) // 添加约束 musicCoverImageView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true musicCoverImageView.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: -100).isActive = true musicCoverImageView.widthAnchor.constraint(equalToConstant: 250).isActive = true musicCoverImageView.heightAnchor.constraint(equalToConstant: 250).isActive = true musicInfoLabel.topAnchor.constraint(equalTo: musicCoverImageView.bottomAnchor, constant: 20).isActive = true musicInfoLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20).isActive = true musicInfoLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20).isActive = true // 更新UI界面 updateUI() } // 更新UI界面 func updateUI() { if let model = musicModel { musicCoverImageView.image = UIImage(named: model.musicAlbum) musicInfoLabel.text = "\(model.musicTitle)\n\(model.musicArtist)\n\(model.musicAlbum)" // 设置播放器的模型层 musicPlayerVC.musicModel = model } } // 播放按钮的动作 @IBAction func playButtonAction(_ sender: UIButton) { musicPlayerVC.play() } // 暂停按钮的动作 @IBAction func pauseButtonAction(_ sender: UIButton) { musicPlayerVC.pause() } // 停止按钮的动作 @IBAction func stopButtonAction(_ sender: UIButton) { musicPlayerVC.stop() } // 快进按钮的动作 @IBAction func fastForwardButtonAction(_ sender: UIButton) { musicPlayerVC.fastForward() } // 快退按钮的动作 @IBAction func rewindButtonAction(_ sender: UIButton) { musicPlayerVC.rewind() } // 音量调节的动作 @IBAction func volumeSliderAction(_ sender: UISlider) { musicPlayerVC.volume(sender.value) }}我们使用一个名为MusicPlayView的视图来展示音乐播放器的界面,并通过调用MusicPlayViewController中的方法来实现音乐的播放、暂停、停止、快进、快退、调整音量等操作。该视图的部分代码如下:
class MusicPlayView: UIView { // 模型层 var musicModel: MusicModel? // 控制器层 var musicPlayVC: MusicPlayViewController? // 播放按钮 let playButton: UIButton = { let button = UIButton() button.translatesAutoresizingMaskIntoConstraints = false button.setTitle("播放", for: .normal) button.setTitleColor(.black, for: .normal) button.addTarget(self, action: #selector(playButtonAction), for: .touchUpInside) return button }() // 暂停按钮 let pauseButton: UIButton = { let button = UIButton() button.translatesAutoresizingMaskIntoConstraints = false button.setTitle("暂停", for: .normal) button.setTitleColor(.black, for: .normal) button.addTarget(self, action: #selector(pauseButtonAction), for: .touchUpInside) return button }() // 停止按钮 let stopButton: UIButton = { let button = UIButton() button.translatesAutoresizingMaskIntoConstraints = false button.setTitle("停止", for: .normal) button.setTitleColor(.black, for: .normal) button.addTarget(self, action: #selector(stopButtonAction), for: .touchUpInside) return button }() // 快进按钮 let fastForwardButton: UIButton = { let button = UIButton() button.translatesAutoresizingMaskIntoConstraints = false button.setTitle("快进", for: .normal) button.setTitleColor(.black, for: .normal) button.addTarget(self, action: #selector(fastForwardButtonAction), for: .touchUpInside) return button }() // 快退按钮 let rewindButton: UIButton = { let button = UIButton() button.translatesAutoresizingMaskIntoConstraints = false button.setTitle("快退", for: .normal) button.setTitleColor(.black, for: .normal) button.addTarget(self, action: #selector(rewindButtonAction), for: .touchUpInside) return button }() // 音量调节滑块 let volumeSlider: UISlider = { let slider = UISlider() slider.translatesAutoresizingMaskIntoConstraints = false slider.minimumValue = 0 slider.maximumValue = 1 slider.addTarget(self, action: #selector(volumeSliderAction), for: .valueChanged) return slider }() override init(frame: CGRect) { super.init(frame: frame) // 添加子视图 addSubview(playButton) addSubview(pauseButton) addSubview(stopButton) addSubview(fastForwardButton) addSubview(rewindButton) addSubview(volumeSlider) // 添加约束 playButton.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true playButton.topAnchor.constraint(equalTo: topAnchor, constant: 20).isActive = true pauseButton.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 20).isActive = true pauseButton.topAnchor.constraint(equalTo: playButton.bottomAnchor, constant: 20).isActive = true stopButton.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -20).isActive = true stopButton.topAnchor.constraint(equalTo: playButton.bottomAnchor, constant: 20).isActive = true fastForwardButton.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true fastForwardButton.topAnchor.constraint(equalTo: pauseButton.bottomAnchor, constant: 20).isActive = true rewindButton.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true rewindButton.topAnchor.constraint(equalTo: fastForwardButton.bottomAnchor, constant: 20).isActive = true volumeSlider.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 20).isActive = true volumeSlider.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -20).isActive = true volumeSlider.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -20).isActive = true } // 更新UI界面 func updateUI() { if let model = musicModel { // 设置控制器层的模型层 musicPlayVC?.musicModel = model } } // 播放按钮的动作 @IBAction func playButtonAction(_ sender: UIButton) { musicPlayVC?.playButtonAction(sender) } // 暂停按钮的动作 @IBAction func pauseButtonAction(_ sender: UIButton) { musicPlayVC?.pauseButtonAction(sender) } // 停止按钮的动作 @IBAction func stopButtonAction(_ sender: UIButton) { musicPlayVC?.stopButtonAction(sender) } // 快进按钮的动作 @IBAction func fastForwardButtonAction(_ sender: UIButton) { musicPlayVC?.fastForwardButtonAction(sender) } // 快退按钮的动作 @IBAction func rewindButtonAction(_ sender: UIButton) { musicPlayVC?.rewindButtonAction(sender) } // 音量调节的动作 @IBAction func volumeSliderAction(_ sender: UISlider) { musicPlayVC?.volumeSliderAction(sender) }}我们在主视图控制器中创建一个名为MusicPlayView的实例,并将它添加到视图控制器的视图中。同时,我们还需要为该视图添加约束以使其能够正常显示。
在viewDidLoad方法中创建一个名为musicPlayView的实例,并将其添加到视图控制器的视图中:
class ViewController: UIViewController { let musicPlayView = MusicPlayView() override func viewDidLoad() { super.viewDidLoad() // 添加子视图 view.addSubview(musicPlayView) // 添加约束 musicPlayView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true musicPlayView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true musicPlayView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true musicPlayView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true // 加载示例音乐 loadSampleMusic() } // 加载示例音乐 func loadSampleMusic() { let path = Bundle.main.path(forResource: "sample", ofType: "mp3")! let musicModel = MusicModel(title: "The Sound of Silence", artist: "Simon & Garfunkel", album: "The Graduate", path: path) // 设置视图层的模型层 musicPlayView.musicModel = musicModel // 设置控制器层的模型层 musicPlayView.musicPlayVC?.musicModel = musicModel // 更新UI界面 musicPlayView.updateUI() }}在故事板中拖拽一个名为MusicPlayView的视图,并将其与一个名为MusicPlayViewController的视图控制器关联。在MusicPlayViewController.swift文件中,添加以下代码:
class MusicPlayViewController: UIViewController { @IBOutlet weak var musicPlayView: MusicPlayView! var musicModel: MusicModel? override func viewDidLoad() { super.viewDidLoad() // 更新UI界面 musicPlayView.updateUI() } // 视图出现时加载音乐 override func viewWillAppear(_ animated: Bool) { guard let model = musicModel else { return } // 设置视图层的模型层 musicPlayView.musicModel = model // 设置控制器层的模型层 musicPlayView.musicPlayVC?.musicModel = model } @IBAction func playButtonAction(_ sender: UIButton) { musicPlayView.musicPlayVC?.play() } @IBAction func pauseButtonAction(_ sender: UIButton) { musicPlayView.musicPlayVC?.pause() } @IBAction func stopButtonAction(_ sender: UIButton) { musicPlayView.musicPlayVC?.stop() } @IBAction func fastForwardButtonAction(_ sender: UIButton) { musicPlayView.musicPlayVC?.fastForward() } @IBAction func rewindButtonAction(_ sender: UIButton) { musicPlayView.musicPlayVC?.rewind() } @IBAction func volumeSliderAction(_ sender: UISlider) { musicPlayView.musicPlayVC?.volume(sender.value) }}在故事板中将MusicPlayView中的每一个按钮与MusicPlayViewController.swift文件中的相应方法进行关联即可。