Day8 - AVAudioPlayer,渐变层,异常捕获

效果图奉上

如图

一、关于布局:

一个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:这个我也不清楚,没用过
说下开始位置和结束位置:如图

Day8 - AVAudioPlayer,渐变层,异常捕获_第1张图片
开始点和结束点



使用

//设置渐变层
            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

你可能感兴趣的:(Day8 - AVAudioPlayer,渐变层,异常捕获)