iOS提示框之 MBProgressHUD 与 SVProgressHUD


提示框,进度提示,加载中提示等等,无论怎样,你总是需要提示框来指示某个状态正在后台努力进行中.一个合适的提示框,更多的是用来增强用户体验.把最多的时间,用来做更核心的事;把这些不是非常重要的事,你应该试着使用一个成熟稳定的第三方来解决.

MBProgressHUD还是 SVProgressHUD ?

许多时候,选择都是很重要的,但是总是要做出选择.每个人考虑的因素和角度不同,结论或许也不同.但是,你要明白,你现在是要找一个合适的方案来解决自己的关于"提示框"的需求,而不是去无意义的讨论与分析.我推荐你使用 MBProgressHUD. 如果你只是想找一个方案,看到这里就够了.下面会进行一些对比分析.有时候,罗列一些可选方案,总是让人感觉很舒服的;但是我们最终都要做出选择,表明自己的态度.就像你可以依然坚持自己的看法,我会依然深度使用 MBProgressHUD一样.下面的分析不是要证明 MBProgressHUD 或 SVProgressHUD 谁好或者不好,更多的只是为了说明,我的选择可能不是最佳的,但还是靠点谱的!

github流行度: MBProgressHUD - SVProgressHUD = 2500

截止目前, MBProgressHUD 的关注度为 8556, SVProgressHUD 的关注度为 6003,差额在 2500左右.github上面的流行度是很能说明两个第三方的相对优劣的,这就像各个书店上图书的购买量和评论量总是和一本书的价值成正相关一样!诚然, MBProgressHUD 和 SVProgressHUD 的关注度都是非常高的了,都已经属于非常流行的 iOS 第三方了.但是,既然我要选一个深度使用,肯定是关注度更高的那个!在大多数时候,我相信"大家"的选择,对自己是可有参考价值的!

接口易用性: MBProgressHUD ==SVProgressHUD

以下是MBProgressHUD 和 SVProgressHUD 各自项目的github主页上,各自的基本用法示例:

[MBProgressHUDshowHUDAddedTo: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.viewanimated: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 HUDis 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)methodonTarget:(id)target withObject:(id)object animated:(BOOL)animated;

 

#ifNS_BLOCKS_AVAILABLE

 

/**

 * 当在后台队列中执行block时,显示HUD;并在block执行完毕后,隐藏HUD.

 *

 * @seeshowAnimated:whileExecutingBlock:onQueue:completionBlock:

 */

- (void)showAnimated:(BOOL)animatedwhileExecutingBlock:(dispatch_block_t)block;

 

/**

 * 当在后台队列中执行block时,显示HUD;并在block执行完毕后,隐藏HUD.

 *

 * @seeshowAnimated:whileExecutingBlock:onQueue:completionBlock:

 */

-(void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)blockcompletionBlock:(MBProgressHUDCompletionBlock)completion;

 

/**

 * 当在后台队列中执行block时,显示HUD;并在block执行完毕后,隐藏HUD.

 *

 * @seeshowAnimated:whileExecutingBlock:onQueue:completionBlock:

 */

-(void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)blockonQueue:(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)blockonQueue:(dispatch_queue_t)queue

         completionBlock:(MBProgressHUDCompletionBlock)completion;

接口灵活性和可扩展性: MBProgressHUD >SVProgressHUD

首先,二者都是开放源代码的,如果有特殊需求,可以完全自主定制;所以这里主要讨论的是 MBProgressHUD 和 SVProgressHUD自身在不修改核心代码的前提下的接口灵活性和可扩展性.同样的但从文档来看, SVProgressHUD 表现出更多的灵活性,参见:SVProgressHUD–MBProgressHUD更好用的 iOS进度提示组件. 但是事实并非如此! MBProgressHUD 入门文档相对很少提及其灵活性,但其提供的DEMO中较完整地展示了它的强大之处.个人认为,单单允许使用自定义视图作为提供框的视图这一点,就足以让 SVProgressHUD 的绝大部分特性黯然失色;这也是我最终决定选定 MBProgressHUD 并深入使用 MBProgressHUD的重要原因.初次之外, MBProgressHUD 还支持自定义部分进度条相关的属性.具体细节如下:

@interfaceMBProgressHUD : 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) floatmargin;

 

/**

 * 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的可点击区域.

 * @seehttps://github.com/jdg/MBProgressHUD/pull/200

 */

@property (atomic,assign, readonly) CGSize size;

 

/**

 * 是否强制设置HUD为正方形,默认NO.

 */

@property (assign,getter = isSquare) BOOL square;

 

@end

 

@protocolMBProgressHUDDelegate <NSObject>

 

@optional

 

/**

 * HUD完全从屏幕中隐藏时调用此方法.

 */

-(void)hudWasHidden:(MBProgressHUD *)hud;

 

@end

 

/**

 * 一个饼状图样式的进图指示视图.

 */

@interfaceMBRoundProgressView : 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

 

/**

 * 一个水平进度条视图.

 */

@interfaceMBBarProgressView : 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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
今天LemonKit给大家带来的是 柠檬泡泡控件 !!!!(给个英文名:LKBubble) 相信大家做iOS开发肯定都用户SVProgressHUD 或者 MBProgressHUD,但是觉没觉得很死板呢,可定制性不算是太高,而且动画略丑(个人觉得非常丑)。所以一气之下,自己胡乱写了一个,大家可以看看哦(上面有效果图),要是喜欢的朋友可以去Github给个星星~!!!这是个纯国产的透明指示层~ 本身LKBubble只是一个提示框,根据设置的LKBubbleInfo弹出框的样式来显示对应的效果,为了方便大家,我在工程里面直接写了三个自带的三个样式提示框,带有对号的成功提示,带有叉的错误提示,仿google的等待进度提示框,大家可以看一下代码,很容易就可以自定义一个带有动画效果的绚丽的提示框,也可以基于我提供的三个提示框LKBubbleInfo来快速的针对自己项目来修改主题风格哦! 可以自定义如下提示框: 1. 自定义单图的泡泡控件 2. 自定义多图帧动画的泡泡控件 3. 可以自己通过绘图绘制动画的泡泡控件(自带的三种提示框就是通过这种方式绘制的) 4. 只有标题的泡泡控件 5. 可以通过配置任意修改泡泡显示位置(屏幕上中下三个位置,当然还可以通过配置偏移量方式修改到任意位置!) 6. 图上标题下,图左标题右,要啥样就能变成啥样,随你的APP风格变化! 7. 所有的颜色均可配置,你项目什么风格,整体就什么风格! 8. 你自定义好的LKBubbleInfo,团队人无需其他复杂操作,即可调用你写的泡泡控件风格! 调用我直接封装的提示框非常方便,比如在UIViewController中可以直接调用下面代码弹出成功提示框: [self showRightWithTitle: @"添加成功" autoCloseTime: 2]; 没错,就一行代码,就可以啦! 更多的方便的功能大家可以自己摸索哦! 还是老样子,附件中只提供核心代码,还是建议大家去Github下载最新的代码,因为这个工程会越来越吸引人哦!!! 另外还得磨叽一遍:LemonKit的所有代码都会推出三个版本:iOS-OC , iOS-Swift , Android 马上就会推出Android的对应版本,后续可以去安卓巴士中找到安卓对应的版本哦!! 当然也可以直接去Github上下载~ 别忘啦,帮我点一下star!! 多谢 另外新建了个QQ群,大家要是使用过程中不懂得或者技术有问题可以加这个群来聊一聊,当然技术问题也可以哦! 欢迎大家加入: LemonKit QQ群:370157608 Github项目地址: Android版本:https://github.com/1em0nsOft/LemonKit4Android iOS OC版本:https://github.com/1em0nsOft/LemonKit4iOS iOS Swift版本:https://github.com/1em0nsOft/LemonKit4iOS-Swift

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值