本次分析v2.1.2版本,github地址為https://github.com/SVProgressHUD/SVProgressHUD,使用方法參考github上其說明文檔的以下幾個模塊(已經寫的很簡潔、通俗易懂了,本想把這幾塊都復制下來,還是算了):Usage、Customization、Haptic Feedback、Notifications。不想閱讀英文的同學也可以參考一下http://www.lxweimin.com/p/b84a0d4b5f25的“二.類分析”部分的。
本庫采用單例模式來簡化使用,一般不提倡用戶存取對象,用戶直接使用類函數,所有的類函數中先調用單例,然后用獲取的單例進行操作===這種設計庫的策略有兩個前提:1、這個庫很多地方都要用到2、該庫獨立完成功能,不需要成為其它視圖的子視圖或者父視圖。
分析的過程中也遇到了一些沒有接觸過的新知識,值得說明的是:
? ? ? ? 1)、UIVisualEffectView,可以為背景添加毛玻璃效果;可以放大和調整UIVisualEffectView視圖下面的內容的顏色,同時讓UIVisualEffectView的contentView中的內容看起來更加生動。具體使用請參考使用UIVisualEffectView為視圖添加特殊效果和UIVisualEffectView (毛玻璃效果)這兩篇文章。
? ? ? ? ? ? ? ? ?分析源碼的過程中可能比較疑惑為什么SVProgressHUD.m要有兩個UIVisualEffectView類型的view,因為UIBlurEffect對象用于將blur(毛玻璃)效果應用于UIVisualEffectView視圖下面的內容,UIVibrancyEffect主要用于放大和調整UIVisualEffectView視圖下面的內容的顏色,同時讓UIVisualEffectView的contentView中的內容看起來更加生動。所以同時需要兩個UIVisualEffectView類型的view來調整視圖的背景和視圖的內容
? ? ? ? 2)、所有的屬性都使用了UI_APPEARANCE_SELECTOR宏修飾,可以通過UIAppearance來全局設置屬性的值。可以參考UIAppearance使用詳解
對于主體功能,主要分析了SVProgressHUD.m文件,其主要流程如下:
1、不帶圖片只顯示提示語和進度hud的顯示過程
2、帶圖片和提示語,不顯示進度hud的顯示過程
3、showStatus函數流程
剩下的自定義文件沒有怎么分析,下面的SVPIndefiniteAnimatedView、SVProgressAnimatedView、SVRadialGradientLayer的分析來自SVProgressHUD源碼解讀(2.0.3)
1、SVPIndefiniteAnimatedView 類
這個類提供了一個無線旋轉的動畫,實現方法是把一個顏色漸變的圖片旋轉,然后利用UIBezierPath/CAShapeLayer/Mask等遮住不需要的部分,最后利用CABasicAnimation設置無限旋轉動畫。其中,核心部分是利用layer的mask屬性實現遮罩功能,而mask的實現方法是顯示顯示bounds的非透明部分,實例圖如下:
2、SVProgressAnimatedView 類
這個類提供一個畫圓環的視圖,通過不斷改變layer的strokeEnd的值,實現了進度的顯示。順便提一下,storkeStart使用的默認值是0, 所以是從正上方開始的。
- (void)setStrokeEnd:(CGFloat)strokeEnd{? ? _strokeEnd =strokeEnd;_ringAnimatedLayer.strokeEnd= _strokeEnd;}
3、SVRadialGradientLayer 類
這個類繼承自CALayer,通過CGContextDrawRadialGradient來畫漸變顏色層;其中,CoreFoundation中通過create創建的需要用release釋放,否則會造成內存泄漏。