「Swift学习笔记」使用AV Foundation框架为APP加上背景音乐并进行简单控制

用Swift语言进行iOS开发,如需加上背景音乐并进行简单地控制可以使用AV Foundation框架,而对于压缩过的Audio文件或者超过30秒的音频文件,则使用AVAudioPlayer类。

为APP加上背景音乐

?   首先,在ViewController.swift的文件顶部添加?行代码:

import AVFoundation

//引入一个新的AVFoundation框架

?   其次,在类中定义其它实例变量的代码下?再添加?行代码:

var audioPlayer: AVAudioPlayer!

//添加一个AVAudioPlayer类型的播放器变量

?   添加一个新的方法:

func playBgMusic(){

let musicPath = NSBundle.mainBundle().pathForResource("bgmusic", ofType: "mp3")

//指定音乐路径

let url = NSURL(fileURLWithPath: musicPath!)

audioPlayer = AVAudioPlayer(contentsOfURL: url, error: nil)

audioPlayer.numberOfLoops = -1

//设置音乐播放次数,-1为循环播放

maudioPlayer.volume = 1

//设置音乐音量,可用范围为0~1

audioPlayer.prepareToPlay()

audioPlayer.play()

}

有关AVAudioPlayer类的更多信息,请参见AVAudioPlayer类参考

?   在适当位置调用函数:

override func viewDidLoad() {

super.viewDidLoad()

playBgMusic()

}

//每次视图控制器载入时调用函数

override func viewWillAppear(animated: Bool) {

playBgMusic()

}

//每次视图控制器的视图出现前调用函数

viewwillappear是每次视图控制器的视图出现前执行的代码。而viewdidload是每次视图控制器载入是执行的代码。 比如说:当a视图控制器的视图第一次出现是两个都要执行,但当a被push后有pop回来时,只有viewwillappear执行。

使用音乐开关按钮对音乐播放进行控制

对AVAudioPlayer对象执行播放、暂停、或者停止操作,可以通过playing属性来检测当前是否正在播放。以下方法实现了使用UIButton对音乐进行播放/暂停控制,并更新了按钮的图片显示。

?   在类中定义按钮变量:

@IBOutlet weak var voiceButton: UIButton!

?   在viewDidLoad()为voiceButton添加动作:

voiceButton.addTarget(self, action:"voice", forControlEvents: .TouchUpInside)

?   添加voice方法:

func voice() {

if !audioPlayer.playing {

audioPlayer.play()

voiceButton.setImage(UIImage(named:"[email protected]"),forState:.Normal)

//如果背景音乐没有播放,令其开始播放并将按钮显示为播放图片

}else{

audioPlayer.stop()

voiceButton.setImage(UIImage(named:"[email protected]"), forState:.Normal)

//如果背景音乐正在播放,令其停止播放并将按钮显示为静音图片

}

}

以上操作也可直接对按钮关联方法。

AB页面反复跳转,背景音乐仅调用一次

在正常情况下,如果只对A页面进行背景音乐设置,跳转至B页面时音乐不停止可正常播放,但返回A页面时会再次播放一层音乐,此时可以先对audioPlayer是否正在播放音乐进行判断:

if !audioPlayer.playing {

audioPlayer.play()

}

//如果audioplayer没有播放,则令其开始播放

A页面跳转至B页面,背景音乐正常播放;B页面跳转至C页面,背景音乐切换

可以利用页面传值进行解决,适用于背景音乐不同的多页面向B页面进行跳转,音乐不切换,但B页面向C页面跳转需要进行音乐切换的情况。

? 事先为A、B、C页面分别引入AVFoundation框架,并在A页面添加avcAudioPlayer、B页面添加bvcAudioPlayer、C页面添加bvcAudioPlayer和cvcAudioPlayer。

? 在A、B页面viewDidLoad()为跳转按钮添加动作:

turnButton.addTarget(self, action:"turn", forControlEvents: .TouchUpInside)

? 在A页面添加turn方法 :

func turn(){

var sb = UIStoryboard(name: "Main", bundle:nil)

//使用Storyboard制作页面使用此方法进行跳转

var bvc = sb.instantiateViewControllerWithIdentifier("B") as BViewController

bvc.bvcAudioPlayer = self.avcAudioPlayer

//页面传值

self.presentViewController(bvc, animated: true, completion: nil)

//页面跳转

}

B页面跳转至C页面(cvc)方法相同。

? 在C页面对B页面bvcaudioplayer是否播放进行判断并调用自己的背景音乐。

if (bvcAudioPlayer != nil) {

bvcAudioPlayer.stop()

playBgMusic()

} else {

playBgMusic()

}

//需要提前为C页面定义playBgMusic方法,播放器为cvcAudioPlayer

时间: 2024-10-11 01:41:01

「Swift学习笔记」使用AV Foundation框架为APP加上背景音乐并进行简单控制的相关文章

「C#学习笔记」三点定位算法

自己写的,可能还有很多不足,看着哪里不对的求提出,我改~ 先上代码,然后解释我的想法 1 namespace ThreePointOrientation 2 { 3 class Program 4 { 5 struct Point 6 { 7 public int x; 8 public int y; 9 } 10 static Point ThreePointOrientation(Point A, Point B, Point C, int lenAZ, int lenBZ, int len

Swift学习笔记(4)--字符串及基本使用

String是例如"hello, world","海贼王" 这样的有序的Character(字符)类型的值的集合,通过String类型来表示. Swift 的String类型与 Foundation NSString类进行了无缝桥接.如果您利用 Cocoa 或 Cocoa Touch 中的 Foundation 框架进行工作.所有NSString API 都可以调用您创建的任意String类型的值.除此之外,还可以使用本章介绍的String特性.您也可以在任意要求传

Swift学习笔记(12)--数组和字典的复制

Swift中,数组Array和字典Dictionary是用结构来实现的,但是数组与字典和其它结构在进行赋值或者作为参数传递给函数的时候有一些不同. 并且数组和字典的这些操作,又与Foundation中的NSArray和NSDictionary不同,它们是用类来实现的. 注意:下面的小节将会介绍数组,字典,字符串等的复制操作.这些复制操作看起来都已经发生,但是Swift只会在确实需要复制的时候才会完整复制,从而达到最优的性能. 字典的赋值和复制操作 每次将一个字典Dictionary类型赋值给一个

SWIFT学习笔记05

1.Swift 无需写break,所以不会发生这种贯穿(fallthrough)的情况.2.//用不到变量名,可用"_"替换 for _ in 1...power { answer *= base } 3.case 可以匹配更多的类型模式,包括区间匹配(range matching),元组(tuple)和特定类型的描述. 可以这样用case case 1...3: naturalCount = "a few" 4.如果存在多个匹配,那么只会执行第一个被匹配到的 ca

SWIFT学习笔记02

1.//下面的这些浮点字面量都等于十进制的12.1875: let decimalDouble = 12.1875 let exponentDouble = 1.21875e1 let hexadecimalDouble = 0xC.3p0//==12+3*(1/16) 2.//类型别名,用typealias关键字来定义类型别名 typealias AudioSample = UInt16 var maxAmplitudeFound = AudioSample.min 3.//元组 let ht

swift学习笔记(三)关于拷贝和引用

在swift提供的基本数据类型中,包括Int ,Float,Double,String,Enumeration,Structure,Dictionary都属于值拷贝类型. 闭包和函数同属引用类型 捕获则为拷贝.捕获即定义这些常量和变量的原作用域已不存在,闭包仍然可以在闭包函数体内引用和修改这些值 class属于引用类型. Array的情况稍微复杂一些,下面主要对集合类型进行分析: 一.关于Dictionary:无论何时将一个字典实例赋给一个常量,或者传递给一个函数方法时,在赋值或调用发生时,都会

Swift学习笔记十二:下标脚本(subscript)

下标脚本就是对一个东西通过索引,快速取值的一种语法,例如数组的a[0].这就是一个下标脚本.通过索引0来快速取值.在Swift中,我们可以对类(Class).结构体(structure)和枚举(enumeration)中自己定义下标脚本的语法 一.常规定义 class Student{ var scores:Int[] = Array(count:5,repeatedValue:0) subscript(index:Int) -> Int{ get{ return scores[index];

Swift学习笔记四:数组和字典

最近一个月都在专心做unity3d的斗地主游戏,从早到晚,最后总算是搞出来了,其中的心酸只有自己知道.最近才有功夫闲下来,还是学习学习之前的老本行--asp.net,现在用.net做项目流行MVC,而不是之前的三层,既然技术在更新,只能不断学习,以适应新的技术潮流! 创建MVC工程 1.打开Visual studio2012,新建MVC4工程 2.选择工程属性,创建MVC工程 3.生成工程的目录 App_Start:启动文件的配置信息,包括很重要的RouteConfig路由注册信息 Conten

Swift学习笔记(二)参数类型

关于参数类型,在以前的编程过程中,很多时间都忽视了形参与实参的区别.通过这两天的学习,算是捡回了漏掉的知识. 在swift中,参数有形参和实参之分,形参即只能在函数内部调用的参数,默认是不能修改的,如果想要修改就需要在参数前添加var声明. 但这样的声明过后,仍旧不会改变实参的值,这样就要用到inout了,传递给inout的参数类型必须是var类型的,不能是let类型或者字面类型,(字面类型是在swift中常提的一个术语,个人认为就是赋值语句,也不能修改)而且在传递过程中,要用传值符号"&