iOS 正确获取最上层的window 用来显示HUD等弹窗信息

第一种

UIWindow *window = [[UIApplication sharedApplication].windows lastObject];

第二种

UIWindow *window = [UIApplication sharedApplication].keyWindow;

第三种

- (UIWindow *)lastWindow

{

NSArray *windows = [UIApplication sharedApplication].windows;

for(UIWindow *window in [windows reverseObjectEnumerator]) {

if([window isKindOfClass:[UIWindowclass]] &&

CGRectEqualToRect(window.bounds, [UIScreen mainScreen].bounds))

returnwindow;

}

return[UIApplication sharedApplication].keyWindow;

}


这三种都可以获取到window  但是在有特殊情况下 比如自定义了一个window显示出来 或者当键盘(也是一个窗口:UITextEffectsWindow)被弹出时可能会将要展示的UIView覆盖,这是必然的,因为有一个先后关系,后者居上。  我用的MBProgressHUD就有这个问题 ,导致我的hud没有显示出来。  结果发现比较好的始终都能显示HUD的获取window方法:

这种情况下可以监听键盘的弹出,在当前顶层的窗口来添加UIView控件。

+ (UIWindow*)lastWindow {

NSEnumerator*frontToBackWindows = [UIApplication.sharedApplication.windowsreverseObjectEnumerator];

for(UIWindow*windowinfrontToBackWindows) {

BOOL windowOnMainScreen = window.screen==UIScreen.mainScreen;

BOOL windowIsVisible = !window.hidden&& window.alpha>0;

BOOL windowLevelSupported = (window.windowLevel>=UIWindowLevelNormal&& window.windowLevel<=UIWindowLevelNormal);

BOOL windowKeyWindow = window.isKeyWindow;

if(windowOnMainScreen && windowIsVisible && windowLevelSupported && windowKeyWindow) {

returnwindow;

}

}

     return[UIApplicationsharedApplication].keyWindow;

}

你可能感兴趣的:(iOS 正确获取最上层的window 用来显示HUD等弹窗信息)