近期准备将项目转化为OC与swift混合开发。试着写一个swift音乐播放器的demo,体会到了swift相对OC的优势所在。废话不多说。先上效果图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjkwMzg5OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="这里写图片描写叙述" title="">

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

界面绘制代码例如以下:

let SCREEN_W = UIScreen.mainScreen().bounds.size.width
let SCREEN_H = UIScreen.mainScreen().bounds.size.height let 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.Center
lbTitle.backgroundColor = UIColor.blackColor()
lbTitle.alpha = 0.2
self.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 = 0
for st in arrMusicName { print(st)
if let index = arrMusicName.indexOf(st) { let btn:UIButton = UIButton(type:.System) btn.backgroundColor = UIColor.whiteColor()
btn.alpha = 0.5
btn.setTitle(st, forState: UIControlState.Normal)
btn.setTitleColor(UIColor.blackColor(), forState: UIControlState.Normal)
btn.titleLabel?.font = UIFont.systemFontOfSize(16)
btn.layer.masksToBounds = true
btn.layer.shadowOffset = CGSizeMake(0, 10)
btn.layer.shadowColor = UIColor.grayColor().CGColor
btn.layer.shadowOpacity = 1
btn.layer.shadowRadius = 10
btn.layer.cornerRadius = 6
btn.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.5
btnPlay.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() // singleton
var 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 = false btnPlay.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,详细如图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjkwMzg5OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="这里写图片描写叙述" title="">

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

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

加入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设置

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjkwMzg5OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="这里写图片描写叙述" title="">

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

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

七、外放问题的解决

此时。尽管功能都实现了,可是会发现音乐播放声音特别小,由于AVAudioPlayer默认是听筒播放,而不是扬声器播放

这里须要在播放器设置里加入例如以下设置代码

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

其它设置如图所看到的:



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

项目源代码下载地址

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

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

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

  2. Android(java)学习笔记234: 服务(service)之音乐播放器

    1.我们播放音乐,希望在后台长期运行,不希望因为内存不足等等原因,从而导致被gc回收,音乐播放终止,所以我们这里使用服务Service创建一个音乐播放器. 2.创建一个音乐播放器项目(使用服务) (1 ...

  3. Android基于发展Service音乐播放器

    这是一个基于Service组件的音乐播放器,程序的音乐将会由后台的Service组件负责播放,当后台的播放状态改变时,程序将会通过发送广播通知前台Activity更新界面:当用户单击前台Activit ...

  4. Android(java)学习笔记177: 服务(service)之音乐播放器

    1.我们播放音乐,希望在后台长期运行,不希望因为内存不足等等原因,从而导致被gc回收,音乐播放终止,所以我们这里使用服务Service创建一个音乐播放器. 2.创建一个音乐播放器项目(使用服务) (1 ...

  5. 躁!DJ 风格 Java 桌面音乐播放器

    本文适合有 Java 基础知识的人群,跟着本文可学习和运行 Java 版桌面 DJ 音乐播放器. 本文作者:HelloGitHub-秦人 HelloGitHub 推出的<讲解开源项目>系列 ...

  6. Swift - 制作一个在线流媒体音乐播放器(使用StreamingKit库)

    在之前的文章中,我介绍了如何使用 AVPlayer 制作一个简单的音乐播放器(点击查看1.点击查看2).虽然这个播放器也可以播放网络音频,但其实际上是将音频文件下载到本地后再播放的. 本文演示如何使用 ...

  7. Swift 3 :基于 AVAudioPlayer 的简单音乐播放器

    2017.05.22 17:46* 字数 1585 阅读 5095评论 0喜欢 8赞赏 2 https://www.jianshu.com/p/4d5c257428a1 学习ios以来差不多接近两个月 ...

  8. Andriod小项目——在线音乐播放器

    转载自: http://blog.csdn.net/sunkes/article/details/51189189 Andriod小项目——在线音乐播放器 Android在线音乐播放器 从大一开始就已 ...

  9. Swift版音乐播放器(简化版)

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

随机推荐

  1. .zip格式和zip伪加密

    ZIP文件的组成: 压缩源文件数据区+压缩源文件目录区+压缩源文件目录结束标志 压缩源文件数据区 50 4B 03 04:这是头文件标记(0x04034b50) 14 00:解压文件所需 pkware ...

  2. 【Java学习】调用ByteBuffer.getInt()方法得到808464432

    调用ByteBuffer.getInt()方法遇到的奇怪错误 最近在参加阿里的中间件比赛,中间用到了RocketMQ的思想,并且主要集中在使用NIO来读写文件.其中遇到了一个很蛋疼的问题,想了半天想不 ...

  3. cf 633B A trivial problem

    Mr. Santa asks all the great programmers of the world to solve a trivial problem. He gives them an i ...

  4. android jni c C++ 实现下载

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha android jni c C++ 实现下载

  5. android 网络

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha android - async - http 安卓 异步 超文本传输协议 xUtil a ...

  6. bzoj 3573: [Hnoi2014]米特运输

    3573: [Hnoi2014]米特运输 Description 米特是D星球上一种非常神秘的物质,蕴含着巨大的能量.在以米特为主要能源的D星上,这种米特能源的运输和储存一直是一个大问题.    D星 ...

  7. 【Python笔记】十分钟搞定pandas

    本文是对pandas官方网站上<10 Minutes to pandas>的一个简单的翻译,原文在这里.这篇文章是对pandas的一个简单的介绍,详细的介绍请参考:Cookbook .习惯 ...

  8. 对于GTPv2协议头部的解析

    参考3GPP TS 29.060 GTP的头部是可变的,GTP-C(control)和GTP-U(user)共同使用一个头部. GTP Header头部: -Version 用来标识GTP协议的版本, ...

  9. hihoCoder - 1082 - 然而沼跃鱼早就看穿了一切 (字符串处理!!)

    #1082 : 然而沼跃鱼早就看穿了一切 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描写叙述 fjxmlhx每天都在被沼跃鱼刷屏,因此他急切的找到了你希望你写一个程序屏蔽全 ...

  10. sqlserver获取指定数据库的描述

    SELECT 字段名= convert(varchar(100), a.name), 表名= convert(varchar(50), d.name ), 类型= CONVERT(varchar(50 ...