iOS 11 弹出框不显示解决方案
问题
项目中很多地方使用了 window
的 rootViewController
去模态弹出框.
升级到 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
, 而且这个window
的 hidden = YES
iOS10 系统下window层级
iOS11 系统下window层级
隐藏的
window
—–>_UIInteractiveHighlightEffectWindow
解决
优化获取最上层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;
}