swift 音乐播放器项目-《lxy的杰伦情歌》开发实战演练

2024-08-21 13:08

本文主要是介绍swift 音乐播放器项目-《lxy的杰伦情歌》开发实战演练,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近准备将项目转化为OC与swift混合开发,试着写一个swift音乐播放器的demo,体会到了swift相对OC的优势所在,废话不多说,先上效果图:
这里写图片描述
ps:身为杰伦的铁粉,demo的主题必须跟杰伦有关,哈哈!而且自我感觉我有转型UI的天赋,有木有?

一、导入OC文件
创建好swift项目之后,导入OC工具类文件,Xcode会自动生成桥接文件
这里写图片描述

打开这个文件,在开头导入OC工具类的头文件,就可以调用OC工具类了

//
//  Use this file to import your target's public headers that you would like to expose to Swift.
//
#import "UIView+Frame.h"

二、界面绘制
这里方便起见,没有考虑性能问题,只是简单的demo,所以直接创建十个音乐按钮,加上一个播放按钮和一个暂停按钮。十个乐曲按钮放在一个UIScrollView上面。而且播放的音乐是本地音乐,首先在viewDidLoad前创建全局变量,代码如下:

    var btnIndex = 0let arrMusicName = ["蒲公英的约定","窃爱","退后","告白气球","阳光宅男","甜甜的","彩虹","心雨","哪里都是你","说好的幸福呢"]let btnPlay:UIButton = UIButton(type:.System)let btnPause:UIButton = UIButton(type:.System)override func viewDidLoad() {

界面绘制代码如下:

let SCREEN_W = UIScreen.mainScreen().bounds.size.widthlet SCREEN_H = UIScreen.mainScreen().bounds.size.heightlet ivBack:UIImageView = UIImageView(frame:CGRect(x:0, y:20, width:SCREEN_W, height:SCREEN_H))ivBack.image = UIImage(named:"aa.jpg")self.view.addSubview(ivBack)let lbTitle:UILabel = UILabel(frame:CGRect(x:0, y:20, width:SCREEN_W, height:44))lbTitle.text = "LXY的杰伦情歌"lbTitle.textColor = UIColor.whiteColor()lbTitle.textAlignment = NSTextAlignment.CenterlbTitle.backgroundColor = UIColor.blackColor()lbTitle.alpha = 0.2self.view.addSubview(lbTitle)let scv:UIScrollView = UIScrollView(frame:CGRect(x:0, y:64, width:SCREEN_W, height:SCREEN_H - 74 - 44))scv.backgroundColor = UIColor.clearColor()self.view.addSubview(scv)var boom:Int = 0for st in arrMusicName {print(st)if let index = arrMusicName.indexOf(st) {let btn:UIButton = UIButton(type:.System)btn.backgroundColor = UIColor.whiteColor()btn.alpha = 0.5btn.setTitle(st, forState: UIControlState.Normal)btn.setTitleColor(UIColor.blackColor(), forState: UIControlState.Normal)btn.titleLabel?.font = UIFont.systemFontOfSize(16)btn.layer.masksToBounds = truebtn.layer.shadowOffset = CGSizeMake(0, 10)btn.layer.shadowColor = UIColor.grayColor().CGColorbtn.layer.shadowOpacity = 1btn.layer.shadowRadius = 10btn.layer.cornerRadius = 6btn.tag = index//传递触摸对象(即点击的按钮),需要在定义action参数时,方法名称后面带上冒号btn.addTarget(self, action:#selector(play(_:)), forControlEvents:.TouchUpInside)if index%2 == 0 {btn.frame = CGRectMake(SCREEN_W/9,  20 + (SCREEN_W/3 + SCREEN_W/9)*CGFloat(index/2),SCREEN_W/3,SCREEN_W/3)}else {btn.frame = CGRectMake(5*SCREEN_W/9,  20 + (SCREEN_W/3 + SCREEN_W/9)*CGFloat(index/2),SCREEN_W/3,SCREEN_W/3)}scv.addSubview(btn)boom = Int(btn.bottom)}}scv.contentSize = CGSizeMake(SCREEN_W,CGFloat(boom + 20))btnPlay.frame = CGRectMake(0, scv.bottom, SCREEN_W/2 - 10, 44)btnPlay.backgroundColor = UIColor.whiteColor()btnPlay.alpha = 0.5btnPlay.setTitle("播放", forState: UIControlState.Normal)btnPlay.setTitleColor(UIColor.blueColor(), forState: UIControlState.Normal)btnPlay.titleLabel?.font = UIFont.systemFontOfSize(16)btnPlay.addTarget(self, action:#selector(MPMediaPlayback.play), forControlEvents:.TouchUpInside)btnPlay.hidden = trueself.view.addSubview(btnPlay)btnPause.frame = CGRectMake(10 + SCREEN_W/2, scv.bottom, SCREEN_W/2 - 10, 44)btnPause.backgroundColor = UIColor.whiteColor()btnPause.alpha = 0.5btnPause.setTitle("暂停", forState: UIControlState.Normal)btnPause.setTitleColor(UIColor.blueColor(), forState: UIControlState.Normal)btnPause.titleLabel?.font = UIFont.systemFontOfSize(16)btnPause.addTarget(self, action:#selector(MPMediaPlayback.pause), forControlEvents:.TouchUpInside)btnPause.hidden = trueself.view.addSubview(btnPause)}func play(btn: UIButton){btnIndex = btn.taglet music = arrMusicName[btn.tag]let path = NSBundle.mainBundle().pathForResource(music, ofType: "mp3")let pathURL=NSURL(fileURLWithPath: path!)do {audioPlayer = try AVAudioPlayer(contentsOfURL: pathURL)} catch {audioPlayer = nil}audioPlayer?.prepareToPlay()audioPlayer.play()btnPause.hidden = falsebtnPlay.hidden = false

三、音乐播放器创建

class AudioManager: NSObject, AVAudioPlayerDelegate {static let sharedManager = AudioManager()  // singletonvar audioPlayer: AVAudioPlayer!
}

然后在曲剧变量里实例化播放器

var audioPlayer = AudioManager.sharedManager.audioPlayer

四、按钮事件绑定

1、音乐按钮播放音乐事件

 func playWitnIndex(index: Int){let music = arrMusicName[index]let path = NSBundle.mainBundle().pathForResource(music, ofType: "mp3")let pathURL=NSURL(fileURLWithPath: path!)do {audioPlayer = try AVAudioPlayer(contentsOfURL: pathURL)} catch {audioPlayer = nil}audioPlayer?.prepareToPlay()audioPlayer.play()btnPause.hidden = falsebtnPlay.hidden = false}

这个方法吧button带过来,通过button的tag值判断所点击的按钮

2、播放按钮的点击事件

func play(){audioPlayer.play()}

3、暂停按钮的点击事件

 func pause(){audioPlayer.pause()}

到这里,音乐播放器的基本功能就已经实现了,点击就会有音乐播放了,并且播放暂停功能都已经实现

五、音乐后台播放的实现

要实现后台音乐播放功能,还学要对音乐播放器设置一下

在viewDidLoad方法中添加一下代码:

UIApplication.sharedApplication().beginReceivingRemoteControlEvents()do {try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord)try AVAudioSession.sharedInstance().setActive(true)} catch {}

只添加这个还不够,需要对工程进行设置
在info.plist添加Required background modes,具体如图:
这里写图片描述

这样,音乐播放器就实现了后台播放功能

六、音乐播放器锁屏音乐播放设置

添加setLockView方法,代码如下:

func setLockView(){MPNowPlayingInfoCenter.defaultCenter().nowPlayingInfo = [// 歌曲名称MPMediaItemPropertyTitle:arrMusicName[btnIndex],// 演唱者MPMediaItemPropertyArtist:"周杰伦",// 锁屏图片MPMediaItemPropertyArtwork:MPMediaItemArtwork(image: UIImage(named: "aa.jpg")!),//MPNowPlayingInfoPropertyPlaybackRate:1.0,// 总时长            MPMediaItemPropertyPlaybackDuration:audioPlayer.duration,// 当前时间        MPNowPlayingInfoPropertyElapsedPlaybackTime:audioPlayer.currentTime]}

在viewDidLoad方法中调用这个方法:

  self.setLockView()

这样就实现了锁屏界面了按钮设置

这里写图片描述

锁屏按钮点击事件实现需要重写remoteControlReceivedWithEvent方法,代码如下:

override func remoteControlReceivedWithEvent(event: UIEvent?) {switch event!.subtype {case .RemoteControlPlay:  // play按钮audioPlayer.play()case .RemoteControlPause:  // pause按钮audioPlayer.pause()case .RemoteControlNextTrack:  // next// ▶▶self.btnIndex = self.btnIndex + 1self.playWitnIndex(self.btnIndex)self.setLockView()breakcase .RemoteControlPreviousTrack:  // previous// ◀◀if self.btnIndex>0 {self.btnIndex = self.btnIndex - 1self.playWitnIndex(self.btnIndex)self.setLockView()}breakdefault:break}}

七、外放问题的解决

此时,虽然功能都实现了,但是会发现音乐播放声音特别小,因为AVAudioPlayer默认是听筒播放,而不是扬声器播放
这里需要在播放器设置里添加如下设置代码

 let session = AVAudioSession.sharedInstance()try session.setCategory(AVAudioSessionCategoryPlayAndRecord, withOptions: AVAudioSessionCategoryOptions.DefaultToSpeaker)

其他设置如图所示:

这里写图片描述
到这里,这个swift版的lxy杰伦情歌APP就大功告成了,文章最后附上项目源码(由于音乐文件太大,只保留前两首歌曲),希望大家喜欢:

项目源码下载地址

这篇关于swift 音乐播放器项目-《lxy的杰伦情歌》开发实战演练的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1093250

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定