SVProgressHUD源码学习

看完后对SVProgressHUD改进的想法

替换成MBProgressHUD

替换后的好处

首先在界面消失时 SVProgressHUD 需要调用dismiss的巨大缺陷 并不存在。

在view中加入的单个MBProgressHUD可以通过HUDForView方法找到其引用。有多个HUD的复杂情况,也可以通过增加属性的方式来进行获取其引用。


如果替换,会遇到的问题

最复杂的情况是:网络请求框架使用的SVProgressHUD。

存在问题:

拿不到self.view

会有多个网络请求同时进行

在一个界面发起的请求,退出那个界面时要让HUD消失

解决方案:

每一个需要HUD的网络请求都要对应一个View。

只需要在网络请求时把对应的View传进去。这样的话,只需要修改网络请求框架。网络请求开始时,在对应的View中添加HUD。网络请求结束时,隐藏对应View中的那个HUD。这样就不会存在后两个问题。


具体修改方案



以下是做出判断的具体过程



SVProgressHUD 轻量易用。使用以下简单清晰的API,便完成了整个项目的等待提示。

[SVProgressHUD setBackgroundColor:[UIColor colorWithRed:0 green:0 blue:0 alpha:0.5]];

[SVProgressHUD setForegroundColor:[UIColor whiteColor]];

[SVProgressHUD show];

[SVProgressHUD showWithStatus:@" "];

[SVProgressHUD showSuccessWithStatus:@" "];

[SVProgressHUD showErrorWithStatus:@" "];

[SVProgressHUD showWithMaskType:SVProgressHUDMaskTypeClear];

[SVProgressHUD dismiss];


使用后存在的问题

[SVProgressHUD dismiss] 在项目中满天飞。而且dismiss和show不存在绑定关系,导致等待框莫名消失。

SVProgressHUD使用的是单例模式。整个项目里只能同时存在一个等待框。当多个界面、多个提示需要等待框时,前一个等待框必然会消失。


阅读源码的期望

为每一个 show分配一个 key。dismiss能够根据key来取消

摆脱单例模式,把等待框和View绑定在一起。多个View可以拥有多个等待框。

自定义等待框动画


阅读源码时想了解的

等待框被加到了哪里,window?

屏幕遮罩是怎么做的?

动画效果是怎么做的?

还有什么没用到的高级功能?


阅读源码中。。。

获取顶层Window
加入到 指定容器或者最上层Window

界面层次结构

ContainView/frontWindow ->controlView -> self -> backgroundView and hudView 

设置遮罩效果
像条蛇一样的转圈动画,该动画存在于一个自定义View中。可重写
每一次show,activityCount会加1。dismiss操作会使activityCount = 0|只在这里使用了。感觉做的不够好,pop后没有上一个等待框的属性来恢复上一次的状态

改不动的感觉,了解一下MBProgressHUD先


各种样式都很美观,看起来很不错


//初始化方法

MBProgressHUD *hud = [MBProgressHUD HUDForView:self.navigationController.view];

MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES];

MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view.window animated:YES];

//各种属性可以根据需要加

hud.label.text = @"";

hud.detailsLabel.text = @"";

hud.contentColor = [UIColor colorWithRed:0.f green:0.6f blue:0.7f alpha:1.f];

hud.backgroundView.style = MBProgressHUDBackgroundStyleSolidColor;

hud.backgroundView.color = [UIColor colorWithWhite:0.f alpha:0.1f];


//还有各种模式可以选择

//很好的一点是一个hud可以在不同模式之间各种切换显示

//这样可以解决网络请求时,先是等待框再变成提示框的问题

hud.mode = MBProgressHUDModeDeterminate;

NSProgress *progressObject = [NSProgress progressWithTotalUnitCount:100];

hud.progressObject = progressObject;

[hud.button setTitle:@""  forState:UIControlStateNormal];

[hud.button addTarget:progressObject action:@selector(cancel) forControlEvents:UIControlEventTouchUpInside];


hud.mode = MBProgressHUDModeAnnularDeterminate;


hud.mode = MBProgressHUDModeCustomView;

UIImage *image = [[UIImage imageNamed:@"Checkmark"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

hud.customView = [[UIImageView alloc] initWithImage:image];

hud.square = YES;


hud.mode = MBProgressHUDModeText;

hud.label.text = @"";

hud.offset = CGPointMake(0.f, MBProgressMaxOffset);


hud.mode = MBProgressHUDModeDeterminate;

[hud.button setTitle:@"" forState:UIControlStateNormal];

[hud.button addTarget:self action:@selector(cancelWork:) forControlEvents:UIControlEventTouchUpInside];


//隐藏

[hud hideAnimated:YES];

[hud hideAnimated:YES afterDelay:3.f];

体验感想:

易用性不逊色于SVProgressHUD。多的一步操作是 需要自己管理hud属性,但在不造成混乱所带来的好处面前,多的这一步不算什么。

可选模式涵盖了各种想得到想不到的需求,而且提供了自定义View,扩展不需要修改源代码。


阅读源代码前想知道的

MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES];

MBProgressHUD *hud = [MBProgressHUD HUDForView:self.navigationController.view];

两段代码同时使用,得到的第二个hud是指向第一个hud吗?


在window加多个hud会怎么样?


阅读MBProgressHUD源代码中。。。

hud.userInteractionEnabled = NO 可以使底部界面能响应


隐藏的是 view里最顶上的HUD


获取view里最顶上的hud。并不是重新初始化一个


获取最顶层hud的方法

代码写的很规范,层次结构简单清晰。



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,376评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,126评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,966评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,432评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,519评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,792评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,933评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,701评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,143评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,488评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,626评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,292评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,896评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,324评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,494评论 2 348

推荐阅读更多精彩内容

  • 源码来源:gitHub源码 转载于: CocoaChina 来源:南峰子的技术博客 版本:0.9.1 MBPr...
    李小六_阅读 6,425评论 2 5
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,059评论 4 62
  • 原文链接: 深入理解Java的接口和抽象类 - 海 子 - 博客园 对于面向对象编程来说,抽象是它的一大特征之一。...
    kristine阅读 631评论 0 8
  • 松灰笼暖袖先知,银叶香飘篆一丝。 顶伴梅花平出网,展环竹节卧生枝。 不愁冻玉棋难捻,且喜元霜笔易持。 纵使诗家寒到...
    楚淑慧阅读 2,947评论 0 5
  • 大三了,感觉大学生活变了,要考虑的渐渐变得太多。学习繁重的课业以及考虑自己以后到底是考研还是就业。就像睡了一觉起...
    爱笑的眼睛1阅读 643评论 0 0