提要:
“全能”实现方法,即真正用于实现功能的方法。这一封装方式在MBProgressHUD.m中屡见不鲜。如“全能”初始化方法initWithFrame:
|
|
在以上代码中,可以看出,外部API使用的初始化最终都是通过调用initWithFrame方法完成的。该方法的主要功能如下:
- 提供了主要属性的初始赋值;
- 对用于显示信息的的UILabel对象进行初始化,真正的布局在layoutSubView中进行处理;
- 根据mode属性,对不同类型的indicator视图对象进行初始化;
- 通过KVO,将用于更新UI的相关属性进行统一配置;
- 使用通知,监听系统屏幕转向消息,配置视图转向重绘方法。
类似的封装方式,在本类中还体现在:
- 如线程block的任务配置api中,showAnimated:whileExecutingBlock:onQueue:completionBlock:方法作为真正的实现方法,其余均为本方法的不同调用版本。
- 显示和隐藏HUD方法,分别通过showUsingAnimation:和hideUsingAnimation:方法进行真正的功能实现。
这种封装方式的好处是使实现代码集中,便于管理,且不易出错。
2. “延后显示”和“最少显示时间”
- MBProgressHUD中,存在graceTime这一属性,其意义为“延迟一定的时间显示HUD”。即当任务运行时间过短的情况下,防止“闪烁”情况发生(HUD刚刚显示就隐藏)。此值需要我们手动设置,默认为0。
|
|
- 代码中还存在minShowTime这一属性,即“最小显示时长”。用于在HUD隐藏时,当少于指定显示时长时延迟消失时机,防止“闪烁”情况发生:
|
|
3. 使用KVO更新UI
对于MBProgressHUD中过于繁杂的各种配置属性(如mode、progress、各种文字及样式颜色等),设置后都需要进行UI更新。为了进行统一管理,且降低代码复杂程度,源码中使用了KVO的方式进行处理:
|
|
通过updateUIForKeypath:方法,统一对所有UI相关修改进行属性设置,并在最后统一绘制并刷新布局,完成UI更新。
移除KVO监听时,使用同样的方式:
|
|
4. 使用通知方式处理自身视图的朝向变化
在设备朝向发生改变时,通过监听系统通知事件(UIApplicationDidChangeStatusBarOrientationNotification),重绘自身,以适应视图转向:
|
|
5. 总结
- 高效统一的UI更新:由于源码中将视图组件(如UILabel和)的布局配置封装于layoutSubView:方法中;将HUD的背景图及progress进度条绘制置于drawRect:方法中,故可以在任意时机通过调用setNeedsLayout以及setNeedsDisplay统一更新UI。再通过KVO、通知等方式统一进行绑定,实现了高效率的UI更新及代码规范的封装方式。
- 对于“全能”实现方法的二次封装:只将真正的实现代码封装在指定方法中,并提供详细的配置参数。其他相关API只是对改方法进行不同配置上的二次封装,使代码机制,易于管理,减少了出错概率。
- 灵活使用KVO等方式进行变量的自动设置:KVO可以在运行期间自动完成对应变量的更新,这对于大量对象的频繁修改尤其有效,也是集中管理代码的良好方式。