音频文件在播放后通过了多久以及还有多久才能够播放完毕,想必是用户所关注的问题。为了解决这一问题,在不少的音乐播放器中都会有一个播放进度,如图2.32所示。本节将讲解两种查看播放进度的方法。swift
图2.32 QQ音乐ide
经过时间查看进度就是在图2.32中出现的两个时间,它有一个当前播放的时间,还有一个音频文件的总时间。经过这两个时间,用户就能够知道音频文件播放了多久,还须要多久播放完毕。spa
1.显示音频总时间.net
对于音频文件中总时间的获取可使用到AVAudioPlayer类的duration属性,其语法形式以下:orm
var duration: NSTimeInterval { get }对象
其中,该属性是一个只读属性,获取的值是一个NSTimeInterval类型(又名Double)的值,它是以秒为单位的。若是要想出现图2.32中时间的效果,就须要将该值进行转换,转换的具体步骤以下:教程
(1)获取分钟数:因为使用duration属性获取的值为以秒为单位的,不是用户所理解的时间。因为音频文件每每都是几分钟,因此就不须要小时。将秒转换为分钟,只须要将duration属性获取的值除以60就能够了。其转换格式以下:开发
AVAudioPlayer对象名.duration/60get
注意:用户所理解的时间格式以下:it
时:分:秒
(2)将分钟数转换为整型:因为duration是NSTimeInterval类型即双精度类型,而分钟数每每没有小数点,因此须要将此类型的值转换为整型,转换格式以下:
Int(分钟数)
(3)获取秒数:对于秒数的获取就直接使用音频文件的总时间减去转换为整型的分钟数,其语法形式以下:
AVAudioPlayer对象名.duration - Int(分钟数)
(4)将秒数转为为整型:和为分钟数转换类型同样,须要将获取的秒数转换为整型,转换格式以下:
Int(秒数)
【示例2-7】如下将以第一个实例为基础,获取音频文件的总时间,并显示在Duration Label标注中。具体的操做步骤以下:
(1)将主视图中的Duration Label标签控件与插座变量durationTime进行关联。
(2)打开ViewController.swift文件,编写代码,实现音频总时间的获取。代码以下:
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
moreSettingsView.hidden=true
let path=NSBundle.mainBundle().pathForResource("Liekkas", ofType: "mp3")
……
audioEffect?.pan = -1.0
let durationMinutes:Int=Int(audioEffect!.duration/60) //获取分钟数
let durationSeconds=Int(audioEffect!.duration - Double(durationMinutes * 60)) //获取秒数
durationTime.text="\(durationMinutes):\(durationSeconds)"
}
此时运行程序,会看到如图2.33所示的效果。
图2.33 主视图
2.获取iOS 9音频应用开发当前播放的时间
获取当前播放的时间,咱们在2.3.2小节中提到过须要使用到AVAudioPlayer类中的currentTime属性。
注意:此时获取的当前播放时间也是NSTimeInterval类型(又名Double)。因此也须要进行转换,类型与音频文件总时间的转换。
【示例2-8】下面将以第一个实例为基础,获取音频文件当前播放的时间,并显示在Current Time Label标注中。具体的操做步骤以下:
(1)将主视图中的Current Time Label标签控件与插座变量currentTime进行关联。
(2)打开ViewController.swift文件,声明一个时间定时器,代码以下:
var timer:NSTimer?=nil
(3)在playAudio()动做中,添加一行代码,实现定时器的建立,代码以下:
@IBAction func playAudio(sender: AnyObject) {
audioEffect?.play() //播放声音
playButton.setBackgroundImage(UIImage(named: "pauseImage.png"), forState: UIControlState.Normal)
playButton.addTarget(self, action: ("pauseAudio"), forControlEvents: UIControlEvents.TouchUpInside)
//建立定时器
timer=NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: ("updateProgress"), userInfo: nil, repeats: true)
}
(4)添加updateProgress()方法,实现当前播放时间的更新。代码以下:
func updateProgress(){
let currentTimeMinutes=Int(self.audioEffect!.currentTime/60) //获取分钟数
let currentTimeSeconds=Int(audioEffect!.currentTime - Double(currentTimeMinutes*60))//获取秒数
currentTime.text="\(currentTimeMinutes):\(currentTimeSeconds)"
}
此时运行程序,会看到如图2.34所示的效果。当轻拍播放按钮后,会看到当前时间在不停的进行更新,如图2.35所示。
图2.34 初始状态 图2.35 更新当前播放时间
注意:当用户轻拍暂停按钮后,此时的音频文件就会暂停播放,当前播放的时间中止更新,此时须要在pauseAudio()动做中添加一行代码,实现此功能,代码以下:
func pauseAudio(){
audioEffect?.stop() //暂停
playButton.setBackgroundImage(UIImage(named: "playImage.png"), forState: UIControlState.Normal)
playButton.addTarget(self, action: ("playAudio:"), forControlEvents: UIControlEvents.TouchUpInside)
timer?.invalidate() //让定时器失效
}
经过进度条查看进度可让用户更为直接的看出音频文件播放了多少,还剩余多少,在图2.32中也使用到了此方法。在iOS中有两个控件能够实现进度条的功能:一种是Progress View控件;另外一种是Slider控件。在本书中为了更为直观的看到音频文件多放了多少,还剩多少没有播放,咱们采用Slider实现进度条的功能。
【示例2-9】如下将以第一个实例为基础,实现经过进度条查看进度的功能。具体的操做步骤以下:
(1)将主视图中的Progress Slider滑块控件与插座变量progressSlider进行关联。
(2)打开ViewController.swift文件,在updateProgress()方法中添加一行代码,对Slider控件的值进行设置,代码以下:
func updateProgress(){
let currentTimeMinutes=Int(self.audioEffect!.currentTime/60)
let currentTimeSeconds=Int(Double(audioEffect!.currentTime) - Double(currentTimeMinutes*60))
currentTime.text="\(currentTimeMinutes):\(currentTimeSeconds)"
self.progressSlider.value=Float(self.audioEffect!.currentTime/self.audioEffect!.duration)
}
此时运行程序,会看到如图2.36所示的效果。当轻拍播放按钮后,会看到当前时间在不停的进行更新,如图2.37所示。
图2.36 初始状态 图2.37 更新进度
在音乐应用中,用户均可以以拖动进度条的方式指定音频文件播放的位置。此功能的实现还须要使用到currentTime属性。
【示例2-10】如下将以第一个实例为基础,实现拖动进度条实现播放的功能。具体的操做步骤以下:
@IBAction func dragPlayAudio(sender: AnyObject) {
if(audioEffect!.playing){
//设置当前播放的时间
audioEffect!.currentTime=Double(progressSlider.value) * Double(audioEffect!.duration)
}else{
let alertController = UIAlertController(title: "提示", message: "音乐没有播放,拖动无效", preferredStyle: UIAlertControllerStyle.Alert)
let action = UIAlertAction(title: "知道了", style: UIAlertActionStyle.Default){
(action: UIAlertAction!) -> Void in
self.audioEffect?.currentTime=0.0
self.progressSlider.value=0.0
}
alertController.addAction(action)
self.presentViewController(alertController, animated: true, completion: nil)
}
}
此时运行程序,在出现的模拟器界面中轻拍播放按钮,此时iOS 9音频应用开发音频文件就会播放。当开发者拖动进度条中的滑块后,音频文件就会播放滑块所在位置处的声音。
注意:拖动iOS 9音频应用开发进度条播放并须要在音频文件播放时实现,不然就会出现“音乐没有播放,拖动无效”的警告视图,如图2.38所示。
图2.38 警告视图
本文选自:iOS 9音频应用开发基础教程大学霸内部资料,转载请注明出处,尊重技术尊重IT人!