Day8 - AVAudioPlayer,漸變層,異常捕獲

效果圖奉上

如圖

一、關于布局:

一個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)
    }
}


Demo - AudioPlayer

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容