iOS 读MBProgressHUD(1.0.0版)的源码(一)
2017-04-02 本文已影响658人
逍遥晨旭
MBProgressHUD的源码
MBProgressHUD是一个非常受欢迎的第三方库,其用法简单,代码朴实易懂,涉及的知识点广而不深奥,是非常适合初学者阅读的一份源码。本篇内容只是介绍MBProgressHUD的相关属性、方法,以便灵活使用MBProgressHUD。
一、MBProgressHUD.h文件属性解析
1)、MBProgressHUD最大偏移量:MBProgressMaxOffset
// HUD的最大偏移量。设置offset时可用到
extern CGFloat const MBProgressMaxOffset;
2)、模式:MBProgressHUDMode
typedef NS_ENUM(NSInteger, MBProgressHUDMode) {
// 默认模式:显示菊花,菊花不停地,但没有进度
MBProgressHUDModeIndeterminate,
// 圆形饼图来作为进度视图
MBProgressHUDModeDeterminate,
// 水平进度条
MBProgressHUDModeDeterminateHorizontalBar,
// 圆环作为进度条
MBProgressHUDModeAnnularDeterminate,
// 自定义视图,提示图
MBProgressHUDModeCustomView,
// 只显示文字
MBProgressHUDModeText
};
3)、动画形式:MBProgressHUDAnimation
typedef NS_ENUM(NSInteger, MBProgressHUDAnimation) {
// 默认效果:透明度变化的动画
MBProgressHUDAnimationFade,
// 相当于MBProgressHUDAnimationZoomIn
MBProgressHUDAnimationZoom,
// 放大消失的效果
MBProgressHUDAnimationZoomOut,
// 缩小消失的效果
MBProgressHUDAnimationZoomIn
};
4)、背景颜色:MBProgressHUDBackgroundStyle
typedef NS_ENUM(NSInteger, MBProgressHUDBackgroundStyle) {
// 默认背景颜色:透明的
MBProgressHUDBackgroundStyleSolidColor,
// MBProgressHUD的背景颜色,若没有设置就是透明色,否则就是设置的颜色。
MBProgressHUDBackgroundStyleBlur
};
5)、MBProgressHUD显示完成的回调
typedef void (^MBProgressHUDCompletionBlock)();
6)、两个宏:NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END
define NS_ASSUME_NONNULL_BEGIN _Pragma("clang assume_nonnull begin")
define NS_ASSUME_NONNULL_END _Pragma("clang assume_nonnull end")
一、在这两个宏之间的代码,所有简单指针都被假定设为非空(nonnull),因此我们只需要去指定那些可为空的(nullable)的指针,这样不用麻烦的去将每个属性或方法都去指定nonnull和nullable,减轻了开发的工作量。
二、为了安全起见,苹果还制定了几条规则:
1.typedef定义的类型的nullability(typeof(COREVIDEO_DECLARE_NULLABILITY))特性通常依赖于上下文,即使是在Nonnull组成的这两个宏定义区域设置中,也不能假定它为nonnull。
2.复杂的指针类型(如id *)必须显示去指定是nonnull还是nullable。例如,指定一个指向nullable对象的nonnull指针,可以使用”__nullable id * __nonnull”。
3.我们经常使用的NSError **通常是被假定为一个指向可为空的nullable NSError对象的nullable指针。
7)、MBProgressHUD的类方法和对象方法
/**
* @return:返回一个HUD,与类方法hideHUDForView:animated:对应
* @param:view HUD要显示的view
* @param:animated 是否要动画
*/
+ (instancetype)showHUDAddedTo:(UIView *)view animated:(BOOL)animated;
/**
* @return 返回YES,发现一个HUD并将它移出。否则,什么也不做。
* @param:view 显示HUD的view
* @param:animated 是否要动画
*/
+ (BOOL)hideHUDForView:(UIView *)view animated:(BOOL)animated;
/**
* @return:返回一个HUD,遍历view的子控件,返回最上面的那个HUD
* @param:view 被遍历的view
*/
+ (nullable MBProgressHUD *)HUDForView:(UIView *)view;
/**
* @param:view传入的视图对象仅仅做为定义MBProgressHUD视图frame属性的参照
*/
- (instancetype)initWithView:(UIView *)view;
// 是否动画显示HUD
- (void)showAnimated:(BOOL)animated;
// 是否动画隐藏HUD
- (void)hideAnimated:(BOOL)animated;
// 延迟几秒隐藏HUD,与上面不同的是:若只是提示用户直接用这个方法就比较好
- (void)hideAnimated:(BOOL)animated afterDelay:(NSTimeInterval)delay;
8)、MBProgressHUD的属性
//代理
@property (weak, nonatomic) id<MBProgressHUDDelegate> delegate;
// HUD隐藏后的回调
@property (copy, nullable) MBProgressHUDCompletionBlock completionBlock;
/*
* 作用:防止HUD显示非常短的任务。如果任务非常短就完成了,HUD一闪而过,多不友好。
* 这时设置这个graceTime就可以防止HUD显示非常短(就不显示了)。也就是说
* 如果graceTime时间没有走 完而任务完成了,这时就不显示HUD。graceTime默认值为0.
*/
@property (assign, nonatomic) NSTimeInterval graceTime;
/**
* 最短显示时间,避免HUD刚显示就隐藏的情况,与graceTime有点像,都是避免HUD显示非常短
*/
@property (assign, nonatomic) NSTimeInterval minShowTime;
// HUD隐藏的时候,是否从Super上移出。默认是NO。
@property (assign, nonatomic) BOOL removeFromSuperViewOnHide;
// HUD的形式,mode值是上面模式的值
@property (assign, nonatomic) MBProgressHUDMode mode;
// 设置HUD的子控件的颜色,label和进度模式都是contentColor
@property (strong, nonatomic, nullable) UIColor *contentColor UI_APPEARANCE_SELECTOR;
// HUD显示与隐藏的动画形式
@property (assign, nonatomic) MBProgressHUDAnimation animationType UI_APPEARANCE_SELECTOR;
// HUD默认是显示在super控件的中央,offset就是HUD相对于super控件中央的偏移量
@property (assign, nonatomic) CGPoint offset UI_APPEARANCE_SELECTOR;
// margin是HUD的子控件到HUD的边距(最小边距),默认是20.f。
@property (assign, nonatomic) CGFloat margin UI_APPEARANCE_SELECTOR;
// 背景框的大小。默认值为CGSizeZero,
@property (assign, nonatomic) CGSize minSize UI_APPEARANCE_SELECTOR;
// 是否强制背景框宽高相等
@property (assign, nonatomic, getter = isSquare) BOOL square UI_APPEARANCE_SELECTOR;
// 这个属性没用过,也没试出来。
@property (assign, nonatomic, getter=areDefaultMotionEffectsEnabled) BOOL defaultMotionEffectsEnabled UI_APPEARANCE_SELECTOR;
// 进度条的进度(从0.0到1.0变化)
@property (assign, nonatomic) float progress;
// 任务进度管理对象
@property (strong, nonatomic, nullable) NSProgress *progressObject;
// MBBackgroundView的对象只可读
@property (strong, nonatomic, readonly) MBBackgroundView *bezelView;
// MBBackgroundView的对象只可读
@property (strong, nonatomic, readonly) MBBackgroundView *backgroundView;
//MBProgressHUDModeCustomView模式下实现自定义view
@property (strong, nonatomic, nullable) UIView *customView;
// 短消息提示label,自动调整大小,只可读。
@property (strong, nonatomic, readonly) UILabel *label;
// 与上面的简短提示来说,这次提示就比较详细了,也是只可读
@property (strong, nonatomic, readonly) UILabel *detailsLabel;
//单个任务是,耗时比较长时,可以设置一个取消按钮,取消此次任务。
@property (strong, nonatomic, readonly) UIButton *button;
9)、MBProgressHUD的代理MBProgressHUDDelegate
只有一个用于HUD隐藏时的回调方法:跟属性中completionBlock属性的block回调一样。
- (void)hudWasHidden:(MBProgressHUD *)hud;
二、MBBackgroundView背景视图
//HUD的背景样式(透明或HUD的背景颜色)
@property (nonatomic) MBProgressHUDBackgroundStyle style;
//设置HUD的背景颜色
@property (nonatomic, strong) UIColor *color;