####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)
}}复制代码

swift基础学习(八)相关推荐

  1. swift 基础学习之属性修饰符

    1,private private 访问级别所修饰的属性或者方法只能在当前类里访问. (注意:Swift4 中,extension 里也可以访问 private 的属性.) 原文:Swift - 访问 ...

  2. Swift基础学习(二)数据类型

    在编程语言中,不同的数据信息需要不同的数据类型来存储,计算机内存中针对不同的数据类型它们所分配的内存大小是不同的,特定的值需要特定的类型来声明. Swift 数据类型 内置数据类型 整数 - Int ...

  3. swift基础学习笔记

    1.变量声明 1.1 类型标注 当你声明常量或者变量的时候可以加上类型标注(type annotation),说明常量或者变量中要存储的值的类型.如果要添加类型标注,需要在常量或者变量名后面加上一个冒 ...

  4. scala言语基础学习八

    转载于:https://www.cnblogs.com/yaohaitao/p/5627616.html

  5. Linux基础学习八:mysql主从复制原理以及详细搭建步骤

    MySQL的主从复制 MySQL的主从复制,指的是可以创建多台和主数据库完全一样的数据库环境(从数据库),对主数据库的写操作(增.删.改)会自动同步到子数据库中. 作用: 从数据库作作为冷备机,进行日 ...

  6. Swift基础入门知识学习(12)-枚举(列举)-讲给你懂

    TED演讲的8个秘诀:学习18分钟高效表达-重点笔记 Swift基础入门知识学习(11-2)-閉包-第二篇-讲给你懂 目录 枚举(列举)语法 使用 Switch 语句匹配枚举(列举)值 相关值 原始值 ...

  7. Swift基础语法学习笔记(1)

    Swift基础语法的学习 1.HashMap 2.for-in循环控制 3.??聚合运算 4.SwiftUI的一些小技巧 5.init初始化器 6.@propertyWrapper属性包装器 音乐评分 ...

  8. 第八课 k8s网络基础学习-VxLAN基础

    第八课 k8s网络基础学习-VxLAN基础 tags: k8s网络 eNSP wireshark VxLAN 文章目录 第八课 k8s网络基础学习-VxLAN基础 第一节 VxLAN 1.1 VxLA ...

  9. Swift基础入门知识学习(7)-字典-讲给你懂

    Swift基础入门知识学习(6)-数组(阵列)-讲给你懂 目录 声明字典 创建一个空字典 存取与修改字典 使用for-in遍历字典中的所有值 字典转换为数组 Swift字典(dictionary) 用 ...

最新文章

  1. 蓝桥杯:安慰奶牛(最小生成树)
  2. 捉虫记 单步跟踪 条件断点 变量查看实践
  3. 插值法:拉格朗日插值、牛顿插值
  4. 实例:加载图片并添加文本水印
  5. spring@Transactional注解
  6. 如何计算列表项的出现?
  7. python自学行吗-上万程序员总结:自学Python,掌握到什么程度就可以找工作了?...
  8. python周末_python周末作业—刘宏升
  9. 使用openssl模拟CA和CA证书的签发
  10. 从哪查找当前程序所有可用的环境变量?
  11. 讨论一下c++中由外部os向主线程中传入参数的问题
  12. huhamhire-hosts
  13. navicat中如何查看mysql日志_如何查看 Navicat Premium 日志文件
  14. shell卸载 simatic_西门子软件在WIN7操作系统中安装步骤和须知
  15. WebService(一):工作原理
  16. 专转本c语言刷题app,南京晓庄学院五年一贯制专转本c语言模拟考试2
  17. 浅谈二十年后电气工程前途
  18. Level/levelup-1-简介
  19. 鸿蒙系统nas,NAS从入门到入坑:我发现了FreeNAS、My Cloud 、群晖的套路
  20. 总有人问 IT 行业有发展前景吗?那就用我的经历来告诉你

热门文章

  1. 关闭浏览器 清空session_跨境网络小知识之Session
  2. 魔力宝贝 服务器状态,魔力宝贝服务端standenemy的参数
  3. rocksdb原理_教你玩转MyRocks/RocksDB—STATISTICS与后台线程篇
  4. app调html页面,app界面管理(风格色调).html
  5. 训练指南——数学专题一的总结
  6. C++学习笔记(三)
  7. Qt使用invokeMethod反射机制实现进程间的通信
  8. python 各个模块的简单介绍 转载
  9. c++的vector容器
  10. mac 下使用wireshark监听网络上的数据