美文网首页
Day8 - AVAudioPlayer,渐变层,异常捕获

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

作者: Codepgq | 来源:发表于2016-09-12 11:40 被阅读49次

    效果图奉上

    如图

    一、关于布局:

    一个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

    相关文章

      网友评论

          本文标题:Day8 - AVAudioPlayer,渐变层,异常捕获

          本文链接:https://www.haomeiwen.com/subject/ypjpettx.html