一直对 keyWindow 有着误解, 以为只有 keyWindow 能响应事件, App 的其他 window 都是不管事儿, 只有显示的功能。但实际使用中, 发现如果创建一个 windowLevel 比 appDelegate.window 高的 myWindow, myWindow 也是可以响应点击事件的。那 keyWindow 有什么用呢?
在官方文档中,是这样解释的:
The value of this property is YES when the window is the key window or NO when it is not. The key window receives keyboard and other non-touch related events. Only one window at a time may be the key window.
也就是说 keyWindow 的特别之处在于相较于其他的 non-keyWindow, keyWindow 可以接收键盘事件与其他非触摸事件。
那么我们来看一下触摸事件的类型:
屏幕快照 2018-04-04 上午8.42.15.png
也就是说, non-keyWindow 与 keyWindow 都可以响应 UIEventTypeTouches, 但像 键盘输入事件 、 加速计事件 、远程控制事件(例:耳机按钮控制事件)以及 物理按键点击事件 都只会向 keyWindow 发送 Event, 其他 non-KeyWindow 不会获得这个消息。
注:
在 window 上有 textField 这类可以输入的控件时, 当该控件被点击或响应编辑时, 会将该控件所在的 window 变为 keyWindow。