这是一篇带有必定笔者主观感情色彩的比较文章.文章着重对比github上最流行的两个iOS进度提示控件 MBProgressHUD 与 SVProgressHUD的各自优劣,来帮助初学者找到一个适合的iOS提示框解决方案.ios
提示框,进度提示,加载中提示等等,不管怎样,你老是须要提示框来指示某个状态正在后台努力进行中.一个合适的提示框,更多的是用来加强用户体验.把最多的时间,用来作更核心的事;把这些不是很是重要的事,你应该试着使用一个成熟稳定的第三方来解决.git
许多时候,选择都是很重要的,可是老是要作出选择.每一个人考虑的因素和角度不一样,结论或许也不一样.可是,你要明白,你如今是要找一个合适的方案来解决本身的关于"提示框"的需求,而不是去无心义的讨论与分析.我推荐你使用 MBProgressHUD. 若是你只是想找一个答案,看到这里就够了.下面会进行一些对比分析.有时候,罗列一些可选答案,老是让人感受很舒服的;可是咱们最终都要作出选择,代表本身的态度.就像你能够依然坚持本身的见解,我会依然深度使用 MBProgressHUD同样.下面的分析不是要证实 MBProgressHUD 或 SVProgressHUD 谁好或者很差,更多的只是为了说明,个人选择可能不是最佳的,但仍是靠点谱的!github
截止目前, MBProgressHUD 的关注度为 8556, SVProgressHUD 的关注度为 6003,差额在 2500左右.github上面的流行度是很能说明两个第三方的相对优劣的,这就像各个书店上图书的购买量和评论量老是和一本书的价值成正相关同样!诚然, MBProgressHUD 和 SVProgressHUD 的关注度都是很是高的了,都已经属于很是流行的 iOS 第三方了.可是,既然我要选一个深度使用,确定是关注度更高的那个!在大多数时候,我相信"你们"的选择,对本身是可有参考价值的!objective-c
如下是MBProgressHUD 和 SVProgressHUD 各自项目的github主页上,各自的基本用法示例:数组
[MBProgressHUD showHUDAddedTo:self.view animated:YES]; dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ // Do something... dispatch_async(dispatch_get_main_queue(), ^{ [MBProgressHUD hideHUDForView:self.view animated:YES]; }); });
[SVProgressHUD show]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // time-consuming task dispatch_async(dispatch_get_main_queue(), ^{ [SVProgressHUD dismiss]; }); });
在大多数场景中,你几乎只会用到显示
与隐藏
这两个最基本的方法,因此说,尽管 SVProgressHUD 自称更加易用,可是我仍是认为这真的看不出什么优点.安全
MBProgressHUD 和 SVProgressHUD 都支持简单的进度提示和文字提示.单从各自github主页上来看, SVProgressHUD 彷佛拥有更多的接口,可是事实并不是如此.若是你下载过MBProgressHUD的示例就会发现,它能实现的功能要远远多于 文档示例给出的简单的 显示
与 隐藏
.为了能让你们更多的了解MBProgressHUD,列出部分方法与参数常量,具体信息可参考官方示例:app
/** * 建立一个新的HUD,并把它添加并显示到提供的视图上.与之相对应的方法是 hideHUDForView:animated:. * * @note 这个方法会设置HUD的属性`removeFromSuperViewOnHide`为YES.HUD会在隐藏时自动从父视图上移除. * * @param view 将HUD添加到此视图上. * @param animated YES,显示时使用当前的动画类型显示;NO,直接显示不使用动画效果. * @return 新建立的HUD. * * @see hideHUDForView:animated: * @see animationType */ + (MB_INSTANCETYPE)showHUDAddedTo:(UIView *)view animated:(BOOL)animated; /** * 找到并隐藏子视图最顶层的HUD.与之对应的方法是 showHUDAddedTo:animated:. * * @note 这个方法会设置HUD的属性`removeFromSuperViewOnHide`为YES.HUD会在隐藏时自动从父视图上移除. * * @param view 用来在其子视图中查找HUD的视图. * @param animated YES,隐藏时使用当前的动画类型显示;NO,直接隐藏不使用动画效果. * @return YES,若是某个HUD被找到并被移除;不然返回NO. * * @see showHUDAddedTo:animated: * @see animationType */ + (BOOL)hideHUDForView:(UIView *)view animated:(BOOL)animated; /** * 找到子视图中全部的HUD,并隐藏. * * @note 这个方法会设置HUD的属性`removeFromSuperViewOnHide`为YES.HUD会在隐藏时自动从父视图上移除. * * @param view 用来在其子视图中查找HUD的视图. * @param animated YES,隐藏时使用当前的动画类型显示;NO,直接隐藏不使用动画效果. * @return 找到并移除的HUD的数量. * * @see hideHUDForView:animated: * @see animationType */ + (NSUInteger)hideAllHUDsForView:(UIView *)view animated:(BOOL)animated; /** * 找到并返回子视图最顶层的HUD. * * @param view 用来在其子视图中查找HUD的视图. * @return 子视图最顶层的HUD. */ + (MB_INSTANCETYPE)HUDForView:(UIView *)view; /** * 找到并返回子视图中全部的HUD. * * @param view 用来在其子视图中查找HUD的视图. * @return 全部找到的HUD视图(存储 MBProgressHUD 对象的数组). */ + (NSArray *)allHUDsForView:(UIView *)view; /** * 使用屏幕尺寸建立HUD的便利初始化方法. * * @param window 提供边框值以初始化HUD的窗口.应该和HUD将来的父视图相同(好比,建立 HUD 后,将HUD添加到此窗口上). */ - (id)initWithWindow:(UIWindow *)window; /** * 使用指定视图的边框尺寸建立HUD的便利初始化方法. * * @param view 提供边框值以初始化HUD的视图.应该和HUD将来的父视图相同(好比,建立 HUD 后,将HUD添加到此视图上). */ - (id)initWithView:(UIView *)view; /** * 显示HUD.你须要确保调用此方法时,主线程未被其余任务阻塞,以便于更新视图.当你已经在新的线程中开始(好比,使用NSOperation或者NSURLRequest的异步请求等)执行某个任务后,再执行此方法. * * @param animated YES,显示时使用当前的动画类型显示;NO,直接显示不使用动画效果. * * @see animationType */ - (void)show:(BOOL)animated; /** * 隐藏HUD.这个仍然会去尝试调用代理的hudWasHidden:方法.此方法是 show: 的配对方法.当你的任务完成时,再使用它. * * @param animated YES,隐藏时使用当前的动画类型显示;NO,直接隐藏不使用动画效果. * * @see animationType */ - (void)hide:(BOOL)animated; /** * 延时隐藏HUD.这个仍然会去尝试调用代理的hudWasHidden:方法.此方法是 show: 的配对方法.当你的任务完成时,再使用它. * * * @param animated YES,隐藏时使用当前的动画类型显示;NO,直接隐藏不使用动画效果. * @param delay Delay in seconds until the HUD is hidden. * * @see animationType */ - (void)hide:(BOOL)animated afterDelay:(NSTimeInterval)delay; /** * 当在新线程执行某个后台任务时,显示HUD;任务完成时,自动隐藏HUD. * * 这个方法会处理自动释放池的相关技术细节,因此你能够安全使用它. * * @param method HUD显示期间,被执行的方法.这个方法会在一个新的线程中执行. * @param target HUD显示期间,被调用的方法归属的实例对象. * @param object 用来传递给方法的可选对象. * @param animated YES,HUD使用当前的 animationType 动画类型来显示或隐藏;不然,显示或隐藏时不使用动画效果. * animations while (dis)appearing. */ - (void)showWhileExecuting:(SEL)method onTarget:(id)target withObject:(id)object animated:(BOOL)animated; #if NS_BLOCKS_AVAILABLE /** * 当在后台队列中执行block时,显示HUD;并在block执行完毕后,隐藏HUD. * * @see showAnimated:whileExecutingBlock:onQueue:completionBlock: */ - (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block; /** * 当在后台队列中执行block时,显示HUD;并在block执行完毕后,隐藏HUD. * * @see showAnimated:whileExecutingBlock:onQueue:completionBlock: */ - (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block completionBlock:(MBProgressHUDCompletionBlock)completion; /** * 当在后台队列中执行block时,显示HUD;并在block执行完毕后,隐藏HUD. * * @see showAnimated:whileExecutingBlock:onQueue:completionBlock: */ - (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block onQueue:(dispatch_queue_t)queue; /** * 当在一个指定的队列中执行block时,显示HUD;block执行完毕后在主线程执行completion block;而后隐藏HUD. * * @param animated YES,HUD使用当前的 animationType 动画类型来显示或隐藏;不然,显示或隐藏时不使用动画效果. * @param block HUD显示期间执行的block. * @param queue block在此队列中执行. * @param completion 完成时执行的block. * * @see completionBlock */ - (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block onQueue:(dispatch_queue_t)queue completionBlock:(MBProgressHUDCompletionBlock)completion;
首先,两者都是开放源代码的,若是有特殊需求,能够彻底自主定制;因此这里主要讨论的是 MBProgressHUD 和 SVProgressHUD自身在不修改核心代码的前提下的接口灵活性和可扩展性.一样的但从文档来看, SVProgressHUD 表现出更多的灵活性,参见: SVProgressHUD–比MBProgressHUD更好用的 iOS进度提示组件.可是事实并不是如此! MBProgressHUD 入门文档相对不多说起其灵活性,但其提供的DEMO中较完整地展现了它的强大之处.我的认为,单单容许使用自定义视图做为提供框的视图这一点,就足以让SVProgressHUD 的绝大部分特性黯然失色;这也是我最终决定选定 MBProgressHUD 并深刻使用 MBProgressHUD的重要缘由.初次以外, MBProgressHUD 还支持自定义部分进度条相关的属性.具体细节以下:ssh
@interface MBProgressHUD : UIView /** * HUD彻底隐藏后执行的block. */ @property (copy) MBProgressHUDCompletionBlock completionBlock; /** * MBProgressHUD 操做模式. 默认是 MBProgressHUDModeIndeterminate. * * @see MBProgressHUDMode */ @property (assign) MBProgressHUDMode mode; /** * HUD显示和隐藏时使用的动画类型. * * @see MBProgressHUDAnimation */ @property (assign) MBProgressHUDAnimation animationType; /** * HUD处于MBProgressHUDModeCustomView模式时,显示此自定义视图(好比一个 UIImageView). * 最好设置自定义视图宽高为 37x37(这是HUD内建指示器的边框值). */ @property (MB_STRONG) UIView *customView; /** * HUD代理对象. * * @see MBProgressHUDDelegate */ @property (MB_WEAK) id<MBProgressHUDDelegate> delegate; /** *状态指示器下可选显示的短消息.HUD会自动调整文字的尺寸. 若是文字过长,后面会用"..."代替. */ @property (copy) NSString *labelText; /** * 可选显示在labelText的细节文字信息.支持多行显示. */ @property (copy) NSString *detailsLabelText; /** * HUD的不透明度.默认是0.8. */ @property (assign) float opacity; /** * HUD的颜色.默认黑色.设置此值后, opacity属性的值将再也不使用,由于颜色也能够设置透明度. */ @property (MB_STRONG) UIColor *color; /** * HUD相对于父视图中心点的水平偏移量. */ @property (assign) float xOffset; /** * HUD相对于父视图中心点的垂直偏移量. */ @property (assign) float yOffset; /** * HUD边缘与HUD的元素之间(好比标签,指示器,自定义视图等)的空白距离. * 默认 20.0 */ @property (assign) float margin; /** * HUD圆角半径,默认10.0. */ @property (assign) float cornerRadius; /** * 是否给父视图添加一个放射线样式的遮罩层.默认NO. */ @property (assign) BOOL dimBackground; /* * 用于指定某个方法执行一段时间以后再显示HUD,以秒记.若是方法在这段时间以前就执行完成,就再也不显示HUD. * 这主要是为了优化耗时可能极短的任务的体验. * 默认值为 0. * 这个属性仅在能够任务的状态能够知晓时,才有做用. * @see taskInProgress */ @property (assign) float graceTime; /** * HUD显示的最小时间(以秒记.) * 这能够避免HUD刚一显示当即又隐藏所带来的很差的用户体验. * 默认是 0. */ @property (assign) float minShowTime; /** * 指示被执行的操做是否还在执行. graceTime 属性依赖于这个属性. * 若是你没有设置graceTime(和设置为0.0不一样),这个属性没有任何做用. * 当使用showWhileExecuting:onTarget:withObject:animated:时,这个值会被自动设置. * 当直接使用show:或hide:等方法显示或隐藏HUD时,你应该手动设置taskInProgress 属性的值,以保证 graceTime 能正确发挥做用. */ @property (assign) BOOL taskInProgress; /** * HUD隐藏时,是否从父视图中移除. * 默认 NO. */ @property (assign) BOOL removeFromSuperViewOnHide; /** * 用于主标签的字体值. */ @property (MB_STRONG) UIFont* labelFont; /** * 主标签颜色值. */ @property (MB_STRONG) UIColor* labelColor; /** * 详情标签字体值. */ @property (MB_STRONG) UIFont* detailsLabelFont; /** * 详情标签颜色. */ @property (MB_STRONG) UIColor* detailsLabelColor; /** * 指示器颜色.默认 [UIColor whiteColor] */ @property (MB_STRONG) UIColor *activityIndicatorColor; /** * 进度指示器的颜色,可选 0.0 ~ 1.0,默认0.0. */ @property (assign) float progress; /** * HUD面板的最小尺寸.默认 CGSizeZero. */ @property (assign) CGSize minSize; /** * HUD面板的实际尺存,只读. * 你可使用它来限制HUD的可点击区域. * @see https://github.com/jdg/MBProgressHUD/pull/200 */ @property (atomic, assign, readonly) CGSize size; /** * 是否强制设置HUD为正方形,默认NO. */ @property (assign, getter = isSquare) BOOL square; @end @protocol MBProgressHUDDelegate <NSObject> @optional /** * HUD彻底从屏幕中隐藏时调用此方法. */ - (void)hudWasHidden:(MBProgressHUD *)hud; @end /** * 一个饼状图样式的进图指示视图. */ @interface MBRoundProgressView : UIView /** * 进度 (0.0 to 1.0) */ @property (nonatomic, assign) float progress; /** * 进度指示器颜色.默认 [UIColor whiteColor]. */ @property (nonatomic, MB_STRONG) UIColor *progressTintColor; /** * 进度指示的背景部分的颜色. * 默认白色半透(透明度0.1) */ @property (nonatomic, MB_STRONG) UIColor *backgroundTintColor; /* * 显示模式.NO,圆形;YES,环形.默认圆形. */ @property (nonatomic, assign, getter = isAnnular) BOOL annular; @end /** * 一个水平进度条视图. */ @interface MBBarProgressView : UIView /** * 进度 (0.0 to 1.0) */ @property (nonatomic, assign) float progress; /** * 进度条边框线的颜色. * 默认白色 [UIColor whiteColor]. */ @property (nonatomic, MB_STRONG) UIColor *lineColor; /** * 进度条背景色. * 默认是 [UIColor clearColor]; */ @property (nonatomic, MB_STRONG) UIColor *progressRemainingColor; /** * 进度的颜色. * 默认 [UIColor whiteColor]. */ @property (nonatomic, MB_STRONG) UIColor *progressColor; @end
总而言之, 无论你开发什么应用,你老是须要一个MBProgressHUD,而我真的推荐你使用 MBProgressHUD.官方文档对MBProgressHUD的具体功能提的过于精简,但愿能借助这篇文章,能让你们一块儿更全面的认识 MBProgressHUD.异步