SVProgressHUD和MBProgressHUD是iOS开发中常用的toast弹窗。他们使用十分广泛,他们都存在明显的优缺点。他们的贝塞尔曲线动画十分难修改。 弹出框有两种: 1.模态弹出窗,它弹出时无法进行其它操作,不会自动消失,需要调用隐藏弹出窗函数才能消失(SVProgressHUD在显示其它toast弹出窗时时间到了也会消失)。 2.toast弹出框,会自动消失的提示框。 SVProgressHUD使用十分广泛,优点是: 1.采用异步显示弹出框,通知隐藏弹出框,发个通知就能隐藏弹出框; 2.具有跨页面显示功能(在B页面操作后显示弹出框,返回A页面能看到弹出框); 3.弹出框只影响弹出框的部分,点击非弹出框(会自动消失的toast弹窗)部分仍旧能点击操作; 4.能实现弹出时带震动效果。 缺点也很显然: 1.显示模态弹出框(不会自动消失的弹出框)需要时间,当一个发送一个请求时显示模态弹出框,请求结束隐藏模态弹出框。若请求响应极快只用了十几毫秒,就会出现模态弹出框没有取消,一直在存在。出现该问题的原因是SVProgressHUD是异步实现显示的,需要时间的,当显示了模态弹出窗后,在它没有真正显示出来前请求已经结束,发送了隐藏弹出窗,但是实际由于它没有显示出来,导致实际上没有隐藏弹出框,当它显示出来后就没有对应隐藏弹出框对应处理。你总不能让后台返回的慢些吧!这样不是降低用户体验吗? 2.不能滑动立即移除不想看的提示框。 SVProgressHUD实现震动效果:

- (void)setDefaultSVProgressHUD {

[SVProgressHUD setHapticsEnabled:YES];

}

MBProgressHUD优缺点和SVProgressHUD正好相反。 MBProgressHUD优点: 1.实时显示,一对一显示隐藏,不存在SVProgressHUD的由于请求过快隐藏不了问题。 缺点: 1.一般都把它加在[[UIApplication sharedApplication].delegate window]上,而[[UIApplication sharedApplication].delegate window]又依赖于具体页面。若app启动时首页没有显示出来就弹出toast弹框,app会闪退。 2.由于加在具体的[[UIApplication sharedApplication].delegate window]上,没有跨页面的显示能力。在B页面操作后显示弹出框,返回A页面不能看到弹出框。有的人使用启动一个线程显示弹出框,这样会造成内存释放问题,浪费资源。有的人采用弹出toast框后延迟一段时间再返回或进入下一个页面,这样严重降低用户体验。 3.需要找到对应的弹出窗加在的对象,然后隐藏。我以前就在使用它时遇到这个问题,被领导狠批评了一顿。在A页面发送了多个请求,其中根据后台返回的情况跳转到另一个页面,由于没有把所有情况都考虑取消模态弹出窗,导致进入B页面发送请求,然后返回A面后弹出框一直在转,无法取消,无法再次放回上一层页面,而app卡在哪里。我们不能完全依赖于程序猿的代码完备性,而应该像SVProgressHUD一样随时取消弹出框有冗余机制。 4.它的toast弹出框出现时,无法点击非弹出框下面的页面。 他们的优缺点互补,但是一个app通常只有一种类型的弹出窗,他们的动画又难以修改。SVProgressHUD优点更多,但是还存在缺点。他们都不时完美的弹出框。 5.不能滑动立即移除不想看的提示框。 完美的弹出窗应该具有他们两个者的优点,而没有他们的缺点。如跨页面弹出,实时方便显示取消,点击toast弹出框后面的上下控件能操作,能很容易修改显示的模态弹出框动画。这样的弹出框就需要自动定义window类的单例弹出框。具体见《多页面悬停控件和如何获得多UIWindow的页面UIWindow》。

查看原文