效果图奉上
一、关于布局:
一个Button、一个label,太简单了不写了
二、需要用的知识点包括:使用AVAudioPlaer播放音乐、渐变层的使用、异常如何捕获异常、Selector方法选择器、后台播放音乐、音乐播放时间显示与转换
1、异常捕获
格式:
do{
try 后面写上可能会抛异常的语句
}
catch{
}
2、使用AVAudioPlayer播放音乐
先导入 import AVFoundation
do {
//得到路径
let path : String? = NSBundle.mainBundle().pathForResource("Ecstasy.mp3", ofType: nil)
//加载路径
player = try AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: path!))
//循环次数
// player!.numberOfLoops = 100
//播放
player.play()
3、渐变层的使用
CAGradientLayer
属性介绍
colors:颜色数组
locations:颜色起始位置数组 注意 位置和颜色要一致
startPoint:开始位置 0-1
endPoint:结束位置 0-1
type:这个我也不清楚,没用过
说下开始位置和结束位置:如图
使用
//设置渐变层
gradientLayer = CAGradientLayer()
//graditent color
gradientLayer!.frame = view.bounds
let color1 = UIColor(white: 0.5, alpha: 0.2).CGColor as CGColorRef
let color2 = UIColor(red: 1.0, green: 0, blue: 0, alpha: 0.4).CGColor as CGColorRef
let color3 = UIColor(red: 0, green: 1, blue: 0, alpha: 0.3).CGColor as CGColorRef
let color4 = UIColor(red: 0, green: 0, blue: 1, alpha: 0.3).CGColor as CGColorRef
let color5 = UIColor(white: 0.4, alpha: 0.2).CGColor as CGColorRef
gradientLayer!.colors = [color1, color2, color3, color4, color5]
gradientLayer!.locations = [0.10, 0.30, 0.50, 0.70, 0.90]
gradientLayer!.startPoint = CGPointMake(0, 0)
gradientLayer!.endPoint = CGPointMake(1, 1)
self.view.layer.addSublayer(gradientLayer!)
4、动态修改背景颜色(Selector)
创建定时器
timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: #selector(ViewController.setBackgroundLayer), userInfo: nil, repeats: true)
timer?.fireDate = NSDate.distantPast()
这里如果使用
私有方法:
那么在Timer中的Selector中应该写:#selector(ViewController.setBackgroundLayer) 并且在private中前面加上 @objc
timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: #selector(ViewController.setBackgroundLayer), userInfo: nil, repeats: true)
@objc private func setBackgroundLayer(){ ...code... }
共有方法:
timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: #selector(ViewController.setBackgroundLayer), userInfo: nil, repeats: true)
func setBackgroundLayer(){ ... code... }
5、时间转换
需要用到的属性:
- player?.currentTime
- player?.duration 这里主要要 / 10
通过一个私有方法设置
private func resultTime(currentTime : NSTimeInterval , duration : NSTimeInterval) -> String{
return String.init(format: "%02.0f:%02.0f", currentTime / 60.0 ,currentTime % 60.0) + "/" + String.init(format: "%02.0f:%02.0f", duration / 60.0 ,duration % 60.0)
}
6、后台播放
在AppDelegate的applicationWillResignActive方法中写上,记得在Plist文件中添加后台播放
do{
//1、plist文件先加入
/*
UIBackgroundModes
audio
*/
//2、设置后台播放模式
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
/*
AVAudioSessionCategoryAmbient
–混音播放,例如雨声、汽车引擎等,可与其他音乐一起播放
AVAudioSessionCategorySoloAmbient
–后台播放,其他音乐将被停止
AVAudioSessionCategoryPlayback
–独占音乐播放
AVAudioSessionCategoryRecord
–录制音频
AVAudioSessionCategoryPlayAndRecord
–播放和录制音频
AVAudioSessionCategoryAudioProcessing
–使用硬件解码器处理音频,该音频会话使用期间,不能播放或录音
*/
//3、激活
try AVAudioSession.sharedInstance().setActive(true)
//4、允许接受事件,这里要做相应的处理
UIApplication.sharedApplication().beginReceivingRemoteControlEvents()
}catch{
}
最后如果你不想去Git下载Demo,下面的是ViewController的所有代码
//
// ViewController.swift
// AudioPlayer
//
// Created by ios on 16/9/12.
// Copyright © 2016年 ios. All rights reserved.
//
import UIKit
import AVFoundation
class ViewController: UIViewController {
@IBOutlet weak var timeLabel: UILabel!
private var player :AVAudioPlayer?
private var timer : NSTimer?
private var time : NSTimeInterval? = 1
private var gradientLayer : CAGradientLayer?
override func viewDidLoad() {
super.viewDidLoad()
do {
//得到路径
let path : String? = NSBundle.mainBundle().pathForResource("Ecstasy.mp3", ofType: nil)
//加载路径
player = try AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: path!))
//循环次数
// player!.numberOfLoops = 100
self.view.backgroundColor = UIColor.blueColor()
//设置渐变层
gradientLayer = CAGradientLayer()
//graditent color
gradientLayer!.frame = view.bounds
let color1 = UIColor(white: 0.5, alpha: 0.2).CGColor as CGColorRef
let color2 = UIColor(red: 1.0, green: 0, blue: 0, alpha: 0.4).CGColor as CGColorRef
let color3 = UIColor(red: 0, green: 1, blue: 0, alpha: 0.3).CGColor as CGColorRef
let color4 = UIColor(red: 0, green: 0, blue: 1, alpha: 0.3).CGColor as CGColorRef
let color5 = UIColor(white: 0.4, alpha: 0.2).CGColor as CGColorRef
gradientLayer!.colors = [color1, color2, color3, color4, color5]
gradientLayer!.locations = [0.10, 0.30, 0.50, 0.70, 0.90]
gradientLayer!.startPoint = CGPointMake(0, 0)
gradientLayer!.endPoint = CGPointMake(1, 1)
self.view.layer.addSublayer(gradientLayer!)
}
catch{//捕获异常
//输出异常
print(error)
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func playMusic(sender: UIButton) {
sender.selected = !sender.selected
if sender.selected {
//判断准备好播放了没
if player?.prepareToPlay() == true {
//准备好了,就播放
player?.play()
//使用定时器动态改变gradientLayer渐变层
timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: #selector(ViewController.setBackgroundLayer), userInfo: nil, repeats: true)
timer?.fireDate = NSDate.distantPast()
}
}
else{
player?.pause()
timer?.fireDate = NSDate.distantFuture()
}
}
/*这里如果使用
私有方法:
那么在Timer中的Selector中应该写:#selector(ViewController.setBackgroundLayer) 并且在private中前面加上 @objc
timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: #selector(ViewController.setBackgroundLayer), userInfo: nil, repeats: true)
@objc private func setBackgroundLayer(){ ...code... }
共有方法:
timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: #selector(ViewController.setBackgroundLayer), userInfo: nil, repeats: true)
func setBackgroundLayer(){ ... code... }
*/
func setBackgroundLayer(){
let redValue = CGFloat(drand48())
let blueValue = CGFloat(drand48())
let greenValue = CGFloat(drand48())
self.view.backgroundColor = UIColor(red: redValue, green: greenValue, blue: blueValue, alpha: 1.0)
//更新时间
time = time! + 0.1
if time > 1.0 {
//更新label
timeLabel.text = resultTime((player?.currentTime)!, duration: (Double((player?.duration)! / 10.0)))
//重置time
time = 0
}
}
private func resultTime(currentTime : NSTimeInterval , duration : NSTimeInterval) -> String{
return String.init(format: "%02.0f:%02.0f", currentTime / 60.0 ,currentTime % 60.0) + "/" + String.init(format: "%02.0f:%02.0f", duration / 60.0 ,duration % 60.0)
}
}
Demo - AudioPlayer