近期准备将项目转化为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。所以直接创建十个音乐button。加上一个播放button和一个暂停button。十个乐曲button放在一个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//传递触摸对象(即点击的button),须要在定义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 = true self.view.addSubview(btnPlay) btnPause.frame = CGRectMake(10 + SCREEN_W/2, scv.bottom, SCREEN_W/2 - 10, 44) btnPause.backgroundColor = UIColor.whiteColor() btnPause.alpha = 0.5 btnPause.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 = true self.view.addSubview(btnPause) } func play(btn: UIButton){ btnIndex = btn.tag let 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 = false btnPlay.hidden = false

三、音乐播放器创建

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

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

var audioPlayer = AudioManager.sharedManager.audioPlayer

四、button事件绑定

1、音乐button播放音乐事件

 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值推断所点击的button

2、播放button的点击事件

func play(){audioPlayer.play()}

3、暂停button的点击事件

 func pause(){audioPlayer.pause()}

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

五、音乐后台播放的实现

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

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

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

仅仅加入这个还不够,须要对project进行设置
在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()

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

锁屏button点击事件实现须要重写remoteControlReceivedWithEvent方法,代码例如以下:

override func remoteControlReceivedWithEvent(event: UIEvent?) {switch event!.subtype {case .RemoteControlPlay:  // playbuttonaudioPlayer.play()case .RemoteControlPause:  // pausebuttonaudioPlayer.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就大功告成了,文章最后附上项目源代码(由于音乐文件太大,仅仅保留前两首歌曲),希望大家喜欢:

项目源代码下载地址

转载于:https://www.cnblogs.com/clnchanpin/p/7305809.html

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

  1. 完整打造一个多功能音乐播放器项目(初步设想跟酷狗类似)

    本人目前准备利用闲暇时间打造一个完整的音乐播放器项目,主要用于学习及分享!原创不易,转载请注明出处. 这是一个什么样的音乐播放器呢?整体的架构跟酷狗差不多吧,我的方式呢,是一个个组件一个个模块先做好, ...

  2. mplayer音乐软件_MPlayer音乐播放器项目讲解

    MPlayer音乐播放器项目讲解 一.简要介绍MPlyer音乐播放器 MPlayer是一款开源多媒体播放器,以GNU通用公共许可证发布.此款软件可在各主流操作系统使用,例如Linux和其他类Unix系 ...

  3. 音乐播放器项目-歌曲播放

    音乐播放器项目-歌曲播放 当单击歌名(包括歌手下的音乐列表)时,应该跳转并携带歌曲的songid值到歌曲播放页面,以便播放对应的歌曲.创建歌曲播放页面MusicPlay.vue,并且进行路由配置,代码 ...

  4. 《华为音乐播放器项目》——1.项目简介与环境搭建

    华为音乐播放器项目 项目简介:做出一个华为音乐播放器项目,涉及技术有JS.SVG.SCSS 最终效果预览:点击查看 目的:自己JS基础太差了,需要熟悉JS,CSS 具体环境搭建过程 一.首先肯定是创建 ...

  5. Vue实现仿音乐播放器项目总述以及阶段目录

    Github地址 https://github.com/badaoliumang/vuemusicplayer Vue实现仿音乐播放器各阶段代码 https://download.csdn.net/d ...

  6. Swift版音乐播放器(简化版),swift音乐播放器

    这几天闲着也是闲着,学习一下Swift的,于是到开源社区Download了个OC版的音乐播放器,练练手,在这里发扬开源精神, 希望对大家有帮助! 这个DEMO里,使用到了 AudioPlayer(对音 ...

  7. 针对音乐播放器项目进行的测试

    音乐播放器系统测试 1,需求分析 功能实现:主要针对以下功能 登录并查看自己的音乐列表 从本地上传音乐 删除某个音乐 删除选中的音乐 在全部歌单里查询音乐(支持模糊查询) 添加音乐到喜欢列表且可进行移 ...

  8. 微信小程序仿网易音乐播放器项目

    一.项目展示 主页: 播放页: 搜索页: 排行榜页: 小控件: 二.项目结构 三.项目功能点 后端接口,使用node写的,使用了网易云音乐API: 封装的api文件 //env是基础地址js文件 im ...

  9. 妙味课堂H5音乐播放器项目实战 ajax实战教程

    课程介绍: 本次课程涉及的知识点包括移动端H5.CSS3.JS.滑屏.HTTP协议.AJAX.跨域.前后端交互.PHP.mySql.jQuery--配合这些知识点,讲师写了一个H5播放器demo,用来 ...

最新文章

  1. 基于 RT-Thread智能车控制算法开发-河南科技大学ROCKET
  2. NSStirng、NSArray、以及枚举(Method小集合)
  3. vsc写vue生成基本代码快捷键_基于vue2.X的webpack基本配置,教你手动撸一个webpack4的配置...
  4. 由SpringMVC中RequetContextListener说起
  5. 版权文字:Power by DedeCms 如何去除?
  6. 1.2_linearbinary_search_顺序(线性)查找二分(折半)查找
  7. 03、C语言——顺序结构
  8. PostgreSQL | 学习笔记语句汇总
  9. 破B操作系统:(1)显示桌面图标
  10. Honeywell1900霍尼韦尔 扫描二维码 QT 客户端显示数据
  11. HDOJ 1025 DP
  12. 【jzoj2173】【DFS】无根树
  13. 学生HTML个人网页作业作品:基于HTML实现教育培训机构网站模板毕业源码(8页)
  14. 关于CS模式和P2P模式分发文件速度的思考
  15. SolidWork 制作KUKAKR6R700机器人URDF模型
  16. 都说程序员木讷,但这位不同,反手就是一串代码把姑娘撩到幸福地流泪
  17. 星际传说中的IPFS原理
  18. Amlogic A311D2 八核 Arm 处理器支持高达 16GB RAM
  19. arcoshx怎么用计算机算,双曲函数
  20. 自定义launcher预置widget无法跳入app,显示无法添加微件问题

热门文章

  1. 坐班族如何对抗颈椎病
  2. Error while executing: npm ERR! D:\Program Files\Git\cmd\git.EXE ls-remote -h -t git://github.com/ad
  3. 2017二级c语言考试大纲,2017年计算机等级考试二级C语言程序设计考试大纲
  4. 数据收集-appium的使用
  5. 解決 manjaro KDE版本无法切换中文输入法
  6. 这些Vue小技巧,可能让你少加班!
  7. 数据结构实验:内部排序算法的性能分析
  8. HTML正式学习--前奏
  9. BoW - Bag of Words - 词袋模型
  10. 配置功能: WiFi无线网络配置代理