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

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

作者: InterestingPDD | 来源:发表于2017-08-17 15:24 被阅读842次

    第一种

    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等弹窗信息

          本文链接:https://www.haomeiwen.com/subject/vffnrxtx.html