效果圖奉上
一、關于布局:
一個Button、一個label,太簡單了不寫了
<br />
二、需要用的知識點包括:使用AVAudioPlaer播放音樂、漸變層的使用、異常如何捕獲異常、Selector方法選擇器、后臺播放音樂、音樂播放時間顯示與轉換
<br />
<br />
1、異常捕獲
格式:
do{
try 后面寫上可能會拋異常的語句
}
catch{
}
<br />
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()
<br />
3、漸變層的使用
CAGradientLayer
屬性介紹
colors:顏色數組
locations:顏色起始位置數組 注意 位置和顏色要一致
startPoint:開始位置 0-1
endPoint:結束位置 0-1
type:這個我也不清楚,沒用過
說下開始位置和結束位置:如圖
<br />
使用
//設置漸變層
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!)
<br />
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... }
<br />
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)
}
<br />
6、后臺播放
在AppDelegate的applicationWillResignActive方法中寫上,記得在Plist文件中添加后臺播放
do{
//1、plist文件先加入
/*
<key>UIBackgroundModes</key>
<array>
<string>audio</string>
</array>
*/
//2、設置后臺播放模式
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
/*
AVAudioSessionCategoryAmbient
–混音播放,例如雨聲、汽車引擎等,可與其他音樂一起播放
AVAudioSessionCategorySoloAmbient
–后臺播放,其他音樂將被停止
AVAudioSessionCategoryPlayback
–獨占音樂播放
AVAudioSessionCategoryRecord
–錄制音頻
AVAudioSessionCategoryPlayAndRecord
–播放和錄制音頻
AVAudioSessionCategoryAudioProcessing
–使用硬件解碼器處理音頻,該音頻會話使用期間,不能播放或錄音
*/
//3、激活
try AVAudioSession.sharedInstance().setActive(true)
//4、允許接受事件,這里要做相應的處理
UIApplication.sharedApplication().beginReceivingRemoteControlEvents()
}catch{
}
<br />
<br />
最后如果你不想去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)
}
}