美文网首页
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,渐变层,异常捕获

    效果图奉上 一、关于布局: 一个Button、一个label,太简单了不写了 二、需要用的知识点包括:使用AVAu...

  • 全局异常处理优先级

    如果controller层被注解@RestControllerAdvice,进行了异常捕获,那么全局异常捕获将不生效。

  • 异常捕获和分析

    主要内容 闪退捕获 日志分析 闪退捕获 内核级异常:Mach异常->Unit信号(Mach层捕获到异常通过发送信号...

  • thinkphp5.0 全局异常捕获处理

    一、异常捕获和处理 模拟 model层出现了异常,在controller层捕获异常,并给前端返回json格式异常信...

  • Python面向对象2

    异常 捕获异常image.png根据错误类型捕获异常image.png 未知错误捕获image.png 捕获异常完...

  • 工作总结-002

    异常捕获service捕获业务异常,自定义BaseException;interface捕获业务异常,以及其他异常...

  • C++学习第20课,异常

    1 异常 一句话概括:捕获异常 1.1 谁捕获异常?捕获谁? A捕获B A() { try{ B(); } ...

  • Python 面向对象 - 08 异常

    目录一、概念二、捕获异常2.1 简单的捕获异常语法2.2 错误类型捕获2.3 异常捕获完整语法三、异常的传递四、抛...

  • springboot 异常捕获和处理

    springboot 异常捕获和处理 异常捕获处理

  • iOS 异常捕获处理机制(初级篇)

    一、异常处理简介 二、异常捕获案例 使用@try catch捕获异常 例1是最简单的一种写法: 捕获异常之嵌套捕获...

网友评论

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

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