iOS提示框,为什么你应该使用 MBProgressHUD?
这是一篇带有一定笔者主观感情色彩的比较文章.文章着重对比github上最流行的两个iOS进度提示控件 MBProgressHUD 与 SVProgressHUD的各自优劣,来帮助初学者找到一个适合的iOS提示框解决方案.
无论如何,你总是需要一个提示框.
提示框,进度提示,加载中提示等等,无论怎样,你总是需要提示框来指示某个状态正在后台努力进行中.一个合适的提示框,更多的是用来增强用户体验.把最多的时间,用来做更核心的事;把这些不是非常重要的事,你应该试着使用一个成熟稳定的第三方来解决.
MBProgressHUD 还是 SVProgressHUD ?
许多时候,选择都是很重要的,但是总是要做出选择.每个人考虑的因素和角度不同,结论或许也不同.但是,你要明白,你现在是要找一个合适的方案来解决自己的关于"提示框"的需求,而不是去无意义的讨论与分析.我推荐你使用 MBProgressHUD. 如果你只是想找一个答案,看到这里就够了.下面会进行一些对比分析.有时候,罗列一些可选答案,总是让人感觉很舒服的;但是我们最终都要做出选择,表明自己的态度.就像你可以依然坚持自己的看法,我会依然深度使用 MBProgressHUD一样.下面的分析不是要证明 MBProgressHUD 或 SVProgressHUD 谁好或者不好,更多的只是为了说明,我的选择可能不是最佳的,但还是靠点谱的!
github 流行度: MBProgressHUD - SVProgressHUD = 2500
截止目前, MBProgressHUD 的关注度为 8556, SVProgressHUD 的关注度为 6003,差额在 2500左右.github上面的流行度是很能说明两个第三方的相对优劣的,这就像各个书店上图书的购买量和评论量总是和一本书的价值成正相关一样!诚然, MBProgressHUD 和 SVProgressHUD 的关注度都是非常高的了,都已经属于非常流行的 iOS 第三方了.但是,既然我要选一个深度使用,肯定是关注度更高的那个!在大多数时候,我相信"大家"的选择,对自己是可有参考价值的!
接口易用性: MBProgressHUD == SVProgressHUD
以下是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
MBProgressHUD 和 SVProgressHUD 都支持简单的进度提示和文字提示.单从各自github主页上来看, SVProgressHUD 似乎拥有更多的接口,但是事实并非如此.如果你下载过MBProgressHUD的示例就会发现,它能实现的功能要远远多于 文档示例给出的简单的 显示
与 隐藏
.为了能让大家更多的了解MBProgressHUD,列出部分方法与参数常量,具体信息可参考官方示例:
/**
* 创建一个新的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
首先,二者都是开放源代码的,如果有特殊需求,可以完全自主定制;所以这里主要讨论的是 MBProgressHUD 和 SVProgressHUD自身在不修改核心代码的前提下的接口灵活性和可扩展性.同样的但从文档来看, SVProgressHUD 表现出更多的灵活性,参见: SVProgressHUD–比MBProgressHUD更好用的 iOS进度提示组件.但是事实并非如此! MBProgressHUD 入门文档相对很少提及其灵活性,但其提供的DEMO中较完整地展示了它的强大之处.个人认为,单单允许使用自定义视图作为提供框的视图这一点,就足以让SVProgressHUD 的绝大部分特性黯然失色;这也是我最终决定选定 MBProgressHUD 并深入使用 MBProgressHUD的重要原因.初次之外, MBProgressHUD 还支持自定义部分进度条相关的属性.具体细节如下:
@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.
iOS提示框,为什么你应该使用 MBProgressHUD?的更多相关文章
- iOS:提示框(警告框)控件UIAlertView的详解
提示框(警告框)控件:UIAlertView 功能:当点击按钮或标签等时,弹出一个提示框,显示必要的提示,然后通过添加的按钮完成需要的功能. 类型:typedef NS_ENUM(NSInte ...
- Android中仿IOS提示框的实现
前言 在Android开发中,我们有时需要实现类似IOS的对话框.今天我就来总结下,如何通过自定义的开发来实现类似的功能. 自定义Dialog 我们知道Android中最常用的对话框就是Dialog及 ...
- ios提示框,自动消失
-(void)click { NSString *showMsg = @"点击我,开始提示"; int width = showMsg.length * 20; UIWindow ...
- TSMessages,非HUD风格的iOS提示框(附官方demo BUG修复方案)
优势 先看效果 个人觉得这种提示效果用在UITableView上要比HUD优雅美观,而其他情况下的提示,用HUD比较好 源码简介易懂,用起来也很方便 导入 pod导入相对很简单,主要讲怎么手动导入这个 ...
- 【转】提示框第三方库之MBProgressHUD iOS toast效果 动态提示框效果
原文网址:http://www.zhimengzhe.com/IOSkaifa/37910.html MBProgressHUD是一个开源项目,实现了很多种样式的提示框,使用上简单.方便,并且可以对显 ...
- 【转】IOS学习笔记29—提示框第三方库之MBProgressHUD
原文网址:http://blog.csdn.net/ryantang03/article/details/7877120 MBProgressHUD是一个开源项目,实现了很多种样式的提示框,使用上简单 ...
- 自定义iOS 中推送消息 提示框
看到标题你可能会觉得奇怪 推送消息提示框不是系统自己弹出来的吗? 为什么还要自己自定义呢? 因为项目需求是这样的:最近需要做 远程推送通知 和一个客服系统 包括店铺客服和官方客服两个模块 如果有新的消 ...
- iOS开发——UI基础-提示框
提示框的种类有很多,废话不多说,直接上代码 一.文本提示框 运行结果如下: 代码实现如下: @interface ViewController () // 添加方法 - (IBAction)add; ...
- IOS 加载中提示框
LoadingView.h #import <Foundation/Foundation.h> @class MBProgressHUD; @interface LoadingView : ...
随机推荐
- WSGI学习系列多种方式创建WebServer
def application(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) ...
- (转)ssh-keygen 中文手册
ssh-keygen 中文手册 原文:http://www.jinbuguo.com/openssh/ssh-keygen.html 实例:http://blog.csdn.net/yl_1314/a ...
- android 中百度地图 关于地图缩放所调用的事件
在做百度地图的时候 javascript 有个地图缩放的事件 但是在android 的API里面却没有,但是还好 官方给了一个MapStatusChangeListener,是这样介绍的 百度地图S ...
- ICSharpCode.SharpZipLi 压缩、解压文件 附源码
http://www.icsharpcode.net/opensource/sharpziplib/ 有SharpZiplib的最新版本,本文使用的版本为0.86.0.518,支持Zip, GZip, ...
- springboot从入门到精通(一)
springboot到底有什么好处?有什么优势?这个先不用看,我们只要知道它有很多优势,现在要做的事只有一件,那就是撸代码!撸完就知道有多少料! 首先,在案例中,我们会构建一个英雄列表应用.操作如下: ...
- jQuery的定时执行和延迟执行
jQuery的定时执行和延迟执行 //延迟执行 setTimeout(function(){ console.log("实战授课,100%就业"); },600); //定时执行 ...
- Python异常处理及元类
一.异常处理 异常是错误发生的信号,一旦程序出错就会产生一个异常,如果该异常没有被应用程序处理,那么该异常就会跑出来,程序的执行也随之终止,也就是说异常就是一个事件,该事件会在程序执行过程中发生,影响 ...
- jmter安装配置
一 JMeter 简介 JMeter 它是Apache组织的开放源代码项目,它是现在比较流行的功能和性能测试的工具.JMeter requires a fully compliant JVM 7 or ...
- CORS跨域请求的限制和解决
我们模拟一个跨域的请求,一个是8888,一个是8887 //server.js const http = require('http'); const fs = require('fs'); http ...
- 4. NBU文件备份与恢复,图形界面&字符界面操作
一. 图形界面文件备份与恢复 1.1 文件备份 待补充 1.2 Windows文件恢复 (1) 打开恢复客户端 (2) 检查设置 (3) 查询可恢复信息 (4) 选取恢复时间点和文件 (5) 选择恢 ...