####1.主要用到的知识点
- CAGradientLayer 处理渐变色
- AVAudioPlayer 音频播放
- Timer 定时器
- CABasicAnimation 动画
#####2.效果图
####3.代码
import UIKit
import AVFoundationclass ViewController: UIViewController, AVAudioPlayerDelegate {var gradientLayer: CAGradientLayer!
var playBtn: UIButton = UIButton()
var player: AVAudioPlayer?
var flag: Bool = true
var timer: Timer!override func viewDidLoad() {
super.viewDidLoad()
setupUI()}// 初始化界面及其他
func setupUI() {
createGradientLayer()
let path = Bundle.main.path(forResource: "Ecstasy", ofType: "mp3")
let musicUrl = URL(fileURLWithPath: path!)try? player = AVAudioPlayer(contentsOf: musicUrl)
player?.delegate = self
playBtn = UIButton(type: .custom)
playBtn.addTarget(self, action: #selector(playMusic), for: .touchUpInside)playBtn.frame.origin = CGPoint(x: self.view.frame.width/2.0 - 77, y: self.view.frame.height/2.0 - 77)
playBtn.frame.size = CGSize(width: 144, height: 144)
playBtn.setBackgroundImage(UIImage(named:"music play"), for: .normal)
view.addSubview(playBtn)
}// 播放/暂停
func playMusic() {if player != nil {
if flag {
player?.play()
timer = Timer.scheduledTimer(timeInterval: 0.25, target: self, selector: #selector(changeBgColor), userInfo: nil, repeats: true)
if self.playBtn.layer.speed == 0 {
start()
}else{
addRotationAnim()
}
flag = false
}else{
player?.pause()
timer.invalidate()
pauseAnimation()
flag = true
}
}
}// 音频播放完成的时候调用
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
self.player?.stop()
self.timer.invalidate()
pauseAnimation()
self.flag = true
}// 添加动画
func addRotationAnim() {
// 1.创建动画
let rotationAnim = CABasicAnimation(keyPath: "transform.rotation.z")
// 2.设置动画的属性
rotationAnim.fromValue = 0
rotationAnim.toValue = Double.pi * 2
rotationAnim.repeatCount = MAXFLOAT
rotationAnim.duration = 5
// 这个属性很重要 如果不设置当页面运行到后台再次进入该页面的时候 动画会停止
rotationAnim.isRemovedOnCompletion = falserotationAnim.fillMode = kCAFillModeForwards;
// 3.将动画添加到layer中
self.playBtn.layer.add(rotationAnim, forKey: nil)
}// 暂停动画
func pauseAnimation() {
let pauseTime = self.playBtn.layer.convertTime(CACurrentMediaTime(), from: nil)
self.playBtn.layer.timeOffset = pauseTimeself.playBtn.layer.speed = 0
}// 开始动画
func start() {
let pauseTime = self.playBtn.layer.timeOffsetlet begin = CACurrentMediaTime() - pauseTime
self.playBtn.layer.timeOffset = 0
self.playBtn.layer.beginTime = begin
self.playBtn.layer.speed = 1
}// 渐变色
func createGradientLayer() {
gradientLayer = CAGradientLayer()gradientLayer.frame = view.bounds
let color1 = UIColor(white: 0.5, alpha: 0.2).cgColor as CGColor
let color2 = UIColor(red: 1.0, green: 0, blue: 0, alpha: 0.4).cgColor as CGColor
let color3 = UIColor(red: 0, green: 1, blue: 0, alpha: 0.3).cgColor as CGColor
let color4 = UIColor(red: 0, green: 0, blue: 1, alpha: 0.3).cgColor as CGColor
let color5 = UIColor(white: 0.4, alpha: 0.2).cgColor as CGColorgradientLayer.colors = [color1, color2, color3, color4, color5]
gradientLayer.locations = [0.10, 0.30, 0.50, 0.70, 0.90]
gradientLayer.startPoint = CGPoint(x: 0, y: 0)
gradientLayer.endPoint = CGPoint(x: 1, y: 1)
self.view.layer.addSublayer(gradientLayer)
}// 背景色改变
func changeBgColor() {
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)
}}复制代码