在我们弹出 UIActivityViewController 后 最外层 window 默认成 了UIRemoteKeyboardWindow, 从而导致了一些问题,在此记录下。
了解: 在 iOS9 之前,键应用程序窗口顶部的第二个UIWindow(窗口级别高于UIWindowLevelNormal)覆盖了包括键盘在内的所有窗口。视图层次结构显示键盘在 UITextEffectsWindow 中。
但是,iOS9 中的键盘位于另一个窗口 UIRemoteKeyboardWindow 中,该窗口位于所有其他窗口的顶部。在键盘上方设置自定义 UIWindow 似乎并不简单。一种解决方案是在显示/隐藏自定义窗口时手动关闭/显示键盘。
- UIRemoteKeyboardWindow 出现的时机
- UIRemoteKeyboardWindow 可能产生的问题
一、UIRemoteKeyboardWindow 出现的时机
- UIActivityViewController 弹窗时
- iOS 9 之后当键盘 弹出后出现
PS: 有小伙伴说UIAlertController 弹出时也出现这个window,我测试了好几个版本也没发现。
二、UIRemoteKeyboardWindow 可能产生的问题
- 之前获取的最外层 Window 不是我们想要的那一层
[UIApplication sharedApplication].windows
所以此处要针对其作出相应的判断
- 键盘的显示和隐藏, 其实还是 最外层 Window 的问题。
PS: UIWindow
- 1、UIWindow是一种特殊的UIView,通常在一个 app 中至少会有一个UIWindow。
- 2、UIWindow 是有层级的
UIKIT_EXTERN const UIWindowLevel UIWindowLevelNormal; // 0
UIKIT_EXTERN const UIWindowLevel UIWindowLevelAlert; // 2000
UIKIT_EXTERN const UIWindowLevel UIWindowLevelStatusBar; // 1000
而 UIRemoteKeyboardWindow 是在更上层的。
相应解决方法
- 找到自己要的那一层就好了。
- 对 UIRemoteKeyboardWindow 可以直接隐藏 hidden 的。
网友评论