MBProgressHUD是一个非常常用的iOS库,用于显示提示文字。作者实现得也非常精简,只有两个文件MBProgressHUD.m
和MBProgressHUD.h
,再不用cocoapods的情况下,也非常容易集成到自己的项目。
兼容性处理
首先因为MBProgressHUD
支持ARC和非ARC,所以用了几个宏:
另外,为了兼容iOS老版本的API,用到了:
这样就可以:
这是一种不错的方法。比如以前我在OpenShare中遇到的 containsString的问题:
这样我们也可以用宏,在NSString(Custom)中扩展containsString,来保持API一致。
在drawRect中画UI,通过kvo更新
比如MBBarProgressView:UIView
整个UI是通过- (void)drawRect:(CGRect)rect
中的CGContextFillPath
类似方法画出来的。进度通过@property (nonatomic, assign) float progres
来设置。而在drawRect中通过progres来控制画出来的样子。如果只有一个progres参数控制,我们可以在setter中:
但是如果,我们是通过很多属性来控制的,一个个的在setter里面「hook」就不方便了。这时候我们可以用KVO:
这样hook setter方法,更方便。在MBProgressHUD.m
中MBProgressHUD : UIView
、MBRoundProgressView : UIView
、MBBarProgressView : UIView
中更新UI全是用的KVO的方法。
屏幕旋转
因为drawRect的时候已经考虑到宽度和高度了,所以屏幕旋转之后,只需要[self setNeedsDisplay]
即可。
执行block的时候显示
这个方法是非常有用的,可以直接省略hide和show的调用。而且逻辑也清晰。对于网络请求,我们也可以用这种思路,封装一下。
不得不说,把block当参数,程序设计方便很多。
MBProgressHUD使用
为了方便,MBProgressHUD提供了两类API:
- 类方法
- 实例是方法
类方法hide的时候,会找出所有MBProgressHUD,然后hide。+ (NSUInteger)hideAllHUDsForView:(UIView *)view animated:(BOOL)animated