项目有个需求需要UIButton上的背景色是渐变动画的效果,如下。

实现原理

CAGradientLayer 用于实现渐变效果,CABasicAnimation用于对Layer做动画

源码:https://github.com/LSnumber1/...

思路

看gif图我们发现动画是从右到左,颜色一直渐变向左滑动的,把效果拆解下,可以分为两部分:

实现颜色的阶梯变化

对实现的阶梯颜色做动画

颜色阶级渐变

初始化一个CAGradientLayer,他的frame的宽高和UIButton的一致。

var caGradientLayer = CAGradientLayer()

caGradientLayer?.frame = CGRect(x: 0, y: 0, width: 200, height: 50)

CAGradientLayer涉及到一个坐标,该坐标体系以左上角为圆点(0,0),右下角为终点(1,1)

CAGradientLayer的startPoint是绘制阶级颜色的起始点,对应的endPoint为绘制阶级颜色的终点

caGradientLayer?.startPoint = CGPoint(x: 0, y: 0)

caGradientLayer?.endPoint = CGPoint(x: 1, y: 0)

定义个颜色坐标组,用于为绘制提供颜色,colors是所有变色的颜色组,另外定义一个变量colors2,用于按钮上一次只对两个颜色做渐变

let colors = [

UIColor.init(red: 162/255, green: 94/255, blue: 255/255, alpha: 1).cgColor,

UIColor.init(red: 108/255, green: 153/255, blue: 255/255, alpha: 1).cgColor,

UIColor.init(red: 105/255, green: 201/255, blue: 255/255, alpha: 1).cgColor,

UIColor.init(red: 102/255, green: 235/255, blue: 221/255, alpha: 1).cgColor,

UIColor.init(red: 103/255, green: 249/255, blue: 145/255, alpha: 1).cgColor,

UIColor.init(red: 228/255, green: 250/255, blue: 139/255, alpha: 1).cgColor,

UIColor.init(red: 255/255, green: 198/255, blue: 88/255, alpha: 1).cgColor,

UIColor.init(red: 255/255, green: 120/255, blue: 102/255, alpha: 1).cgColor,

UIColor.init(red: 162/255, green: 94/255, blue: 255/255, alpha: 1).cgColor

]

let colors2 = [colors[0],colors[1]]

caGradientLayer?.colors = colors2

把caGradientLayer放在UIButton上的layer层

colorButton.layer.addSublayer(caGradientLayer!)

至此,已经对UIButton做了颜色渐变

对实现的阶梯颜色做动画

动画我们用CABasicAnimation,对layer层做动画。

定义一个progress用于记录颜色的下标,startColors记录动画开始时的颜色组,endColors记录动画结束时的颜色组。

var colorArray = caGradientLayer?.colors

if endColors != nil {

startColors = endColors

}

每次启动动画时,我们先把colorArray移除掉第一个颜色,然后在colors中选择下标为progress+2的颜色,把该颜色追加到colorArray中。

colorArray?.removeFirst()

colorArray?.append(colors[Int(progress) + 2])

endColors = colorArray

比如有A、B、C、D、E这几种颜色,颜色渐变是按照AB、BC、CD、DE这个顺序执行,这样保障了颜色顺畅的向左移动

创建动画如下

let animation = CABasicAnimation(keyPath: "colors")

animation.fromValue = startColors

animation.toValue = endColors

animation.duration = 1

animation.fillMode = kCAFillModeForwards

animation.isRemovedOnCompletion = false

animation.delegate = self

caGradientLayer?.add(animation, forKey: "animateGradient")

通过fillMode设置为kCAFillModeForwards、 isRemovedOnCompletion设置为false,保证了一个动画结束后,不再恢复到原状态,颜色组之间的切换会比较顺畅。

最后一步是监听动画的结束,当动画结束时,我们应该立马改变caGradientLayer中的颜色值,以及progress,并启动新的动画

func animationDidStop(_ anim: CAAnimation, finished flag: Bool) {

caGradientLayer?.colors = endColors

gradientAnimation()

progress += 1.0

if Int(progress + 2) >= colors.count {

progress = 0

}

}

以上实现动画循环播放是在动画停止时,开启新的动画,还有一种方式是利用Timer做,定时的去刷新颜色,也是一种实现方式。

button渐变色 ios_UIButton 背景色渐变动画相关推荐

  1. 谈谈一些有趣的CSS题目(十三)-- 巧妙地制作背景色渐变动画!

    谈谈一些有趣的CSS题目(十三)-- 巧妙地制作背景色渐变动画! 原文:谈谈一些有趣的CSS题目(十三)-- 巧妙地制作背景色渐变动画! 开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到 ...

  2. android 实现View的背景色渐变动画

    在安卓里面,动画的背景色渐变(比如又红色变为蓝色)是依靠属性动画来完成的,属性动画大部分情况下是来实现View的运动动画的,因为View的背景也是View的属性之一,所以属性动画自然也就可以让view ...

  3. HTML中button怎么填充GIF,css3给按钮添加背景渐变动画

    css3给按钮添加背景渐变动画 button { color:#FFF; font-size:16px; outline:none; width:300px; height:48px; backgro ...

  4. iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...

    2019独角兽企业重金招聘Python工程师标准>>> iOS精选源码 iOS高仿微信完整项目源码 Khala: Swift 编写的iOS/macOS 路由框架 微信左滑删除效果的实 ...

  5. css字体倾斜角度_css如何实现渐变效果?css背景色渐变与文字渐变效果的实现(代码实例)...

    在前端网页开发的时候,往往会用到一些渐变色的效果,这样可以使得前端页面更加美观.那么这些渐变效果是如何用css代码实现出来的?本章就给大家带来css如何实现渐变效果?css背景色渐变与文字渐变效果的实 ...

  6. html5 渐变动画效果图,html5+css3城市场景动画_觉唯设计

    最近一直在研究HTML5的动画表现,特别是在移动设备上的呈现.在上一篇文章<盛开的CSS3梦幻荷花>中提到如何用css3制作丰富动画效果的两个思路,当然除此之外,结合使用javascrip ...

  7. iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码

    iOS精选源码 iOS高仿微信完整项目源码 Khala: Swift 编写的iOS/macOS 路由框架 微信左滑删除效果的实现与TableViewCell的常用样式介绍 实现阴影圆角并存,渐变色背景 ...

  8. CSS 实现卡片边框渐变动画

    1.实现效果 2.实现步骤 父容器添加背景渐变色 <div class="card"></div> .card {background: linear-gr ...

  9. Unity自定义UI组件(七)渐变工具、渐变色图片、渐变遮罩

    欢迎阅读Unity自定义UI组件(七)渐变工具.渐变色图片.渐变遮罩 前言 在Unity中UGUI只为我们提供了最为基础的Image和RawImage两种可展示图片的组件,但是这两种组件要展示一些特殊 ...

最新文章

  1. 全文搜索引擎Elasticsearch,这篇文章给讲透了
  2. oracle模块损坏,Oracle中模拟及修复数据块损坏
  3. 烽火交换机s5800配置说明_如何通过单臂路由实现VLAN间通信?(配置篇)
  4. react 组件名称重复_设计可重复使用的React组件
  5. ABAP,Java, nodejs和go语言的web server编程 1
  6. Deep Learning of Binary Hash Codes for Fast Image Retrieval(2015)
  7. @程序员,盘一盘炼成高效能开发者的 14 个习惯!
  8. springboot13 页面国际化(i18n)
  9. iOS开发之适配http请求
  10. 学写网页 #05# CSS Mastery 笔记 1~3
  11. 华为办公协作与远程视频会议软件Link Now停止运营 请及时备份数据
  12. C#简单实现九宫数独算法:穷举+回溯
  13. 高等数学(第七版)同济大学 习题7-7 个人解答
  14. Stay hungry. Stay foolish.
  15. numeric scale mysql_MySQL基础教程1 — 数据类型之数值类型 - numeric
  16. java重绘jbutton_用Java着色JButton
  17. Autodesk CFD2021发布啦
  18. 第028讲:文件:因为懂你,所以永恒 | 学习记录(小甲鱼零基础入门学习Python)
  19. 使用cmd命令关机或重启电脑
  20. 设计要解决什么问题?

热门文章

  1. 农业物联网智能灌溉的功能特点
  2. 我是小小志愿者——国际志愿者日线上宣传活动
  3. CALayer创建图层(转)
  4. Java集合与泛型学习笔记
  5. CSS 文字下划线间距
  6. MAC下downie下载网页视频报错“转换错误”解决方案
  7. 【C语言每日一练——第1练:字母大小写转换】
  8. 看得见的算法蒙特卡洛问题——使用蒙特卡洛算法求PI值
  9. 安卓Bmob后端云的使用(增删改查、上传图片、推送服务等)
  10. DOTA2攻速计算公式研究