iOS之小功能模塊--彩虹動畫進度條學習和自主封裝改進


前言:

首先展示一下這個iOS小示例的彩色進度條動畫效果:

彩色動畫進度條

閱讀本文先說說好處:對於基礎不好的讀者,可以直接閱讀文末尾的"如何使用彩虹動畫進度條"章節,然后將我封裝好的這個功能模塊類用到你的工程項目中即可。

這個效果的示例是老外Nick Jensen在2013年寫的一個作品:使用CAGradientLayer的動畫進度條View。 本人閱讀了老外的源碼之后,覺得老外這個進度條的效果很不錯,但是覺得他寫的代碼有待改進。

小貼士:讀者可以直接將老外的源碼下載下來,跑一下,然后對比本人寫的博文重構的思路過程,進行學習。另外要提出一點的是,老外這個源碼畢竟產出比較早,所以用的是MRC,代碼中多出用到了retain和release手動內存管理,但是本人的源碼是基於ARC的,所以就不涉及用到手動內存管理的代碼了。

注意:本篇博文需要有一定的iOS開發基礎,主要需要熟悉並能掌握關於CAGradientLayer(顏色漸變層)、CAShapeLayer(形狀層)、核心動畫基礎以及layer、layer.mask等知識,否則讀者看此文會有很多不理解的地方。至少可能看老外的源碼都會有很多不懂的地方。關於CAGradientLayer(顏色漸變層)、CAShapeLayer(形狀層)可以閱讀本人博客中前幾篇博文筆記。

 

正文大綱:

  1. UI效果實現的結構分析
  2. 如何使用彩虹進度條
  3. 不得不提的改進的亮點😏👻

 

正文:

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 尊重勞動成果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM