iOS实现曲线渐变

作者: RunningTeemo | 来源:发表于2017-09-05 18:10 被阅读0次

http://sxiaojian.com/2015/11/30/iOS-curve-gradient/

圆形渐变

最近产品提了一个需求,要求进度条的进度可以大于1。效果如下

效果图上卡,实际上并不卡。

在开始做之前,看了github上所有的progress相关的代码,发现并没有人实现过这样的效果。苹果apple watch应用实现了,但是不知道苹果是怎么实现的。

这个效果的难度就在于 曲线渐变 和 进度能大于1。

cocoa touch提供的api都是直线渐变。而进度可以大于1要求曲线的首和尾颜色不能想近,应该相差最大。

iOS实现一个颜色渐变的弧形进度条

这篇文章实现了一个曲线渐变,但是这个无法实现进度条大于一。

最终要想实现曲线渐变只能自己实现了。

颜色的生成

一共需要两个颜色,起始颜色和结束颜色。中间颜色的R、G、B值由progress线性生成。

CGFloat ratio =(float)i /(float)sectors;CGFloat R = beginR +(endR- beginR)* ratio;CGFloat G = beginG +(endG- beginG)* ratio;CGFloat B = beginB +(endB- beginB)* ratio;

渐变的生成

由于apple提供的api都是直线的,我就采取了微分的思想,将一个圆分为无数份,然后每一份绘制一点颜色。最终就形成了曲线渐变。

最终的实现

直接看代码吧。demo在此

rounded矩形渐变

这个动画的实现就更有难度了。

动画由两个CAReplicatorLayer组成,一个完成前半部分,一个完成后半部份,两个layer的属性完全一致,仅仅是另外一个layer旋转了180度。最终效果是这样。

一个CAReplicatorLayer的动画是这样的

由于stroke end的取值是0-1,所以无法平滑的让stroke一直保持一样的长度。为了实现效果,我采取的方法是创建一个一样的CAReplicatorLayer并旋转180度。

于是效果变成了这样

然后在这两个layer的superLayer添加mask,最终完成了要求的动画效果。

最难的是CAReplicatorLayer的创建,我创建了40个instance。

replicator.instanceCount      = 40;replicator.instanceDelay      = 0.01;replicator.instanceColor      = [UIColor colorWithRed:1 green: 0.373 blue:0 alpha:0.99].CGColor;replicator.instanceRedOffset  = 0.005;replicator.instanceGreenOffset = 0.005;replicator.instanceBlueOffset  = 0.005;replicator.instanceAlphaOffset = -0.03;replicator.instanceTransform  = CATransform3DIdentity;

里面的参数都经过大量的试错与微调才调出这个效果。

相关文章

  • iOS 沿曲线线性渐变的贝塞尔曲线

    更新:换一种思路实现。iOS 沿曲线线性渐变的贝塞尔曲线(改进版) iOS原生的渐变只支持线性的渐变,但有的时候我...

  • iOS实现曲线渐变

    http://sxiaojian.com/2015/11/30/iOS-curve-gradient/ 圆形渐变 ...

  • iOS 的颜色渐变圆弧

    iOS 的颜色渐变 实现一个圆弧进度条主要分为三步 一、画圆弧这里用的贝赛尔曲线,就是这个东西:UIBezierP...

  • 2019-10-25

    iOS 渐变色 实现渐变色的几种方式: 使用场景:背景渐变 1. 通过CAGradientLayer实现 使用场景...

  • 如何优雅地画出渐变曲线

    画贝塞尔曲线,通过四个点算出两个控制点,画出连接中间两个点的曲线 实现渐变的方法:

  • iOS实现颜色渐变

    我们经常会在UIView添加渐变的背景色。虽然找一张渐变颜色的背景图很方便,但是图片是要占用资源的,同时文件也会变...

  • iOS渐变颜色实现

    在iOS中,每一个可见的控件都有一个layer层。该层控制着控件的绘制和重绘。近期在YY交友项目中有要求使用一个渐...

  • iOS 要实现渐变的怪现象

    众所周知的原因,ios要想实现渐变的话,需要先知道渐变容器的尺寸和设置渐变layer的大小。 由于我们经常会使用到...

  • iOS 绘制颜色渐变圆环 --- 值得一看

    iOS 绘制颜色渐变圆环 本文主要介绍一种绘制颜色渐变的进度圆环. 先上效果图: 实现思路: CAShapeLay...

  • iOS 快速实现角度渐变

    写在前面: 因项目需求,需要实现类似安卓角度渐变的效果,但iOS中CGGradientRef只支持线性渐变(CGC...

网友评论

    本文标题:iOS实现曲线渐变

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