MBProgressHUD 源码解析

来源:互联网 发布:csmar数据库怎么用 编辑:程序博客网 时间:2024/06/06 09:57

MBProgressHUD 一个整体的流程图


有哪些类,主要作用是什么。

MBProgressHUD 继承自UIView,框架主功能类,负责UI渲染、逻辑处理。

MBRoundProgressView 继承自UIView, 定义了一个圆形的进度条。(一个进度展示UI的实现)

MBBarProgressView 继承自UIView, 定义了一个条形的进度条。(一个进度展示UI的实现)


一些重要的方法说明。

MBProgressHUD 类:

- (void)layoutSubviews : 计算HUD 的 size 信息,计算子控件布局(包括 detailsLabel,label )

- (void)drawRect:(CGRect)rect : 根据 HUD 的size信息 将HUD绘制出来

MBRoundProgressView 类:

- (void)drawRect:(CGRect)rect : 绘制一个圆形进度条背景,绘制”进度“的展示。


一些功能的实现解析

1、任务处理的实时进度展示是如何实现的?

在MBProgressHUD中有 indicator 和 progress属性,indicator 属性是 MBProgressHUD 的指示器对象,可能是圆形、条形、自定义等等,默认是 UIActivityIndicatorView。在设置MBProgressHUD实例的progress属性时,会使用indicator对象去设置progress(此时会判断 indicator 是否可以调用)代码如下:

if ([indicator respondsToSelector:@selector(setProgress:)]) {[(id)indicator setValue:@(progress) forKey:@"progress"];}
以 indicator 是MBRoundProgressView的实例为例,MBRoundProgressView 也有一个progress属性( indicator 能够响应setProgress:方法),并且监听该属性的变化 , 

监听到progress变化后,则会调用 drawRect: 方法,drawRect: 中根据progress对”进度“进行视图绘制。如果要自定义一个进度展示UI,则只需要自定义类提供一个progress属性,并且根据progress属性的变化实时刷新UI展现即可。

一些设计上的个人理解与看法

1、MBProgressHUD 将初始化、UI与数据的绑定,UI布局,UI绘制良好的区分了开来。MBProgressHUD中有许多属性,其中对部分属性添加了监听(KVO),当某些属性的变化会涉及UI变动时,则调用 UI布局、UI绘制方法,某些属性的变动只是涉及数据变化时则只调用 UI与数据绑定 方法,充分解耦各个模块,逻辑更清晰。

2、MBBarProgressView 的实例对象view是覆盖整个 superView的 (- (id)initWithView:(UIView *)view 中的这个view就是superView) , 其中HUD的部分是通过Quartz2D接口绘制出来的,个人认为这样的好处一方面是提高性能,另一方面是减少业务无关子控件,降低复杂度(如果HUD也用UIKit 接口实现的话,势必会增加该控件的层级结构,从而在布局上更加复杂),同时使用Quartz2D 接口也能使绘制出来的UI更加精细。缺点是如果有复杂的UI需求的话,Quartz2D接口实现起来将会异常复杂,而该控件在一个合理的复杂度范围内,合理使用Quartz2D 接口是再好不过的了。


以上是个人对 MBProgressHUD 的一些理解,仅当抛砖引玉,如有其他看法请不吝回复,大家共探讨,如有出错之处请不吝指出。

0 0