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;

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容