第一种
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;
}