用了MBProgressHUD这么久,不知道大家是否跟我一样,总有碰到问题的时候,今天就来总结一下本人在使用MBProgressHUD过程中碰到的三大问题。
首先要知道的是MBProgressHUD继承自UIView,HUD其实是加在UIWindow之上显示的,至于加在哪个Window就要看回你的项目了(是的,有的时候应用不止一个Window)。
1、解决HUD在显示的时候无法与界面交互
联想:看到UIView,并且需要交互,不知道你的第一反应是不是想到UIView的这个属性:userInteractionEnabled。
分析:HUD在显示的时候无法与界面交互,就是因为在最上面的这一层(Window层上的HUD这个View层),响应了交互事件。
原因:UIView 的userInteractionEnabled属性,默认值为YES。(The default value of this property is YES.)
解决方法:
hud.userInteractionEnabled = NO;
2、改变HUD的显示位置
既然要改变HUD的显示位置,通常来说,就是改变其y坐标值。
HUD给我们提供了这么个setOffest属性方法(旧版使用的是yOffset属性)。
[hud setOffset:CGPointMake(0, ScreenHeight/2-80)]; //For bottom location.
3、解决键盘遮挡HUD显示
根据前文提到的,应用在弹出键盘的时候多了一个UIRemoteKeyboardWindow。我们可以通过代码来获取应用当前显示的Window都有哪些。
NSArray *windows = [UIApplication sharedApplication].windows;
可以看到,我这边的Window有下面这些:
既然要把HUD显示在键盘之上,那我们找到键盘Window,并把应用当前Window赋为键盘Window。
代码如下:
for (id windowView in windows) {
NSString *viewName = NSStringFromClass([windowView class]);
if ([@"UIRemoteKeyboardWindow" isEqualToString:viewName]) {
keyWindow = windowView;
break;
}
}
最后把HUD加进去即可。
MBProgressHUD *HUD = [MBProgressHUD showHUDAddedTo:keyWindow animated:YES];
【补充】隐藏HUD
首先获取到显示在当前屏幕上的Window
- (UIWindow *)currentWindow {
UIWindow *window = [UIApplication sharedApplication].keyWindow;
if (window.windowLevel != UIWindowLevelNormal) {
NSArray *windowArray = [UIApplication sharedApplication].windows;
for (UIWindow *tmpWindow in windowArray) {
if (tmpWindow.windowLevel == UIWindowLevelNormal) {
window = tmpWindow;
}
}
}
return window;
}
然后移除该视图
UIWindow *window = [self currentWindow];
for (UIView *v in window.subviews) {
if ([v isKindOfClass:[NSObject class]]) {
[v removeFromSuperview];
}
}