本次分析v2.1.2版本,github地址为https://github.com/SVProgressHUD/SVProgressHUD,使用方法参考github上其说明文档的以下几个模块(已经写的很简洁、通俗易懂了,本想把这几块都复制下来,还是算了):Usage、Customization、Haptic Feedback、Notifications。不想阅读英文的同学也可以参考一下http://www.jianshu.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释放,否则会造成内存泄漏。