iOS 11 弹出框不显示解决方案

问题

项目中很多地方使用了 windowrootViewController 去模态弹出框. 升级到 iOS11 后, 经常出现弹出框显示不出来的问题.

/**
 获取最上层window

 @return window
 */
+ (UIWindow *)lastWindow {
    NSArray *windows = [UIApplication sharedApplication].windows;
    for(UIWindow *window in [windows reverseObjectEnumerator]) {
        if ([window isKindOfClass:[UIWindow class]] &&
            CGRectEqualToRect(window.bounds, [UIScreen mainScreen].bounds))
            return window;
    }
    return [UIApplication sharedApplication].keyWindow;
}

分析

通过 Reveal 查看层级结构发现 iOS11 系统下多了一个 window, 而且这个windowhidden = YES

iOS10 系统下window层级

iOS10_windows.png

iOS11 系统下window层级

iOS11_window.png

隐藏的 window —–> _UIInteractiveHighlightEffectWindow

隐藏状态的windows.png

解决

优化获取最上层window方法, 过滤隐藏状态的 window

/**
 获取最上层window

 @return window
 */
+ (UIWindow *)lastWindow {
    NSArray *windows = [UIApplication sharedApplication].windows;
    for(UIWindow *window in [windows reverseObjectEnumerator]) {
        if ([window isKindOfClass:[UIWindow class]] && !window.hidden &&
            CGRectEqualToRect(window.bounds, [UIScreen mainScreen].bounds))
            return window;
    }
    return [UIApplication sharedApplication].keyWindow;
}
Loading Disqus comments...
Table of Contents