前言:
首先展示一下這個iOS小示例的彩色進度條動畫效果:
閱讀本文先說說好處:對於基礎不好的讀者,可以直接閱讀文末尾的"如何使用彩虹動畫進度條"章節,然后將我封裝好的這個功能模塊類用到你的工程項目中即可。
這個效果的示例是老外Nick Jensen在2013年寫的一個作品:使用CAGradientLayer的動畫進度條View。 本人閱讀了老外的源碼之后,覺得老外這個進度條的效果很不錯,但是覺得他寫的代碼有待改進。
小貼士:讀者可以直接將老外的源碼下載下來,跑一下,然后對比本人寫的博文重構的思路過程,進行學習。另外要提出一點的是,老外這個源碼畢竟產出比較早,所以用的是MRC,代碼中多出用到了retain和release手動內存管理,但是本人的源碼是基於ARC的,所以就不涉及用到手動內存管理的代碼了。
注意:本篇博文需要有一定的iOS開發基礎,主要需要熟悉並能掌握關於CAGradientLayer(顏色漸變層)、CAShapeLayer(形狀層)、核心動畫基礎以及layer、layer.mask等知識,否則讀者看此文會有很多不理解的地方。至少可能看老外的源碼都會有很多不懂的地方。關於CAGradientLayer(顏色漸變層)、CAShapeLayer(形狀層)可以閱讀本人博客中前幾篇博文筆記。
正文大綱:
- UI效果實現的結構分析
- 如何使用彩虹進度條
- 不得不提的改進的亮點😏👻
正文:
UI效果實現的結構分析:
- 1、先添加一個Rect(0,0,[UIScreen mainScreen].bounds.size.width,2)的矩形CAGradientLayer對象。
- 2、在這個CAGradientLayer對象上,用核心動畫實現彩虹條無限循環輪播移動過程。
- 3、為這個CAGradientLayer添加遮罩層,這個遮罩層好比再添加一個同等寬高坐標的矩形,遮住了gradientLayer對象
- 4、然后將這個遮罩層的寬度提供一個接口供外部調用,通過改變這個遮罩層的寬度來顯示不被遮住部分的彩虹條
代碼實現思路(和Nick Jensen的差不多,但是后面有所改進):
1、重寫類方法layerClass,將UIView默認的CALayer對象類型換CAGradientLayer

2、在初始化方法中

3、因為需要輪播循環彩虹條動畫,所以當然需要一個輔助的數組元素轉換的算法方法

4、然后通過核心動畫,來實現彩虹條輪播動畫

5、最后重寫對外公開的兩個接口的屬性

如何使用彩虹動畫進度條
1、首先到本人github上UIView下載第5個UIView實現好的小功能RainBowProgress。
2、然后將該功能項目中的RainbowProgress的整個文件目錄拖進你的項目中:
3、然后下面直接展示使用示例,接口不多,難度不大:
不得不提的改進的亮點
- Nick Jensen實現進度條遮罩層的方式:
- 1、外部調用接口,根據外部數據不斷的更改progress進度值
- 2、在progress的set方法內部調用了[self setNeedsLayout];
- 3、[self setNeedsLayout]會在內部重新調用layoutSubviews方法
- 4、而layoutSubviews的重寫方法中根據progress值更改遮罩層的長度
- 5、從而觸發了CALayer的隱式動畫,實現了進度條展示進度的效果
注意:Nick Jensen的遮罩層用的是CALayer創建的對象
- 本人實現進度條的遮罩層的方式
- 1、外部調用接口,根據外部數據不斷的更改progress進度值
- 2、在progress的set方法內部調用了self.shapeMaskLayer.strokeEnd = _progressValue;
- 3、這樣就直接更改了遮罩層(CAShapeLayer)的終點值,更改了遮罩層的長度
- 4、從而觸發了CAShapeLayer的隱式動畫,實現了進度條展示進度的效果
注意:本人的遮罩層用的是CAShapeLayer創建的對象
所以相對而言,本人的代碼也簡單一些。哈哈,其實也沒什么。能實現不出bug就好。
轉載需注明出處:http://www.cnblogs.com/goodboy-heyang/p/5186730.html 尊重勞動成果。