【发布时间】:2014-10-04 06:10:25
【问题描述】:
我刚刚为我的填字游戏应用程序 Four Down 发布了 iOS 8 更新,并开始收到报告说它进入无法输入答案的状态,因为点击键盘会关闭它而不是输入字母。
经过一番调查,只要应用程序进入后台,然后再次激活,它就会可靠地进入此状态。退出应用并重新启动它可以解决问题,直到它下一次从后台恢复。
当问题发生时,由于键盘下方的视觉视图正在接收触摸,因此似乎以错误的顺序堆叠以进行触摸检测(但不是视觉上)。我相信问题是特定于 iOS 8 的。
为了诊断问题,我将 UIApplication 子类化并重写了 sendEvent,以便我可以检查正在发送的事件。当问题发生时,该事件被分配给错误的 UIWindow。这是它工作时的事件:
2014-10-04 07:56:57.998 four-down[95709:8557144] <UITouchesEvent: 0x7fe838f07350> timestamp: 1.29014e+06 touches: {(
<UITouch: 0x7fe83a11abf0> phase: Began tap count: 1 window: <UITextEffectsWindow: 0x7fe838d549e0; frame = (0 0; 320 568); opaque = NO; gestureRecognizers = <NSArray: 0x7fe838d556d0>; layer = <UIWindowLayer: 0x7fe838d54ea0>> view: <UIKeyboardLayoutStar: 0x7fe838da6a90; frame = (0 0; 320 216); opaque = NO; layer = <CALayer: 0x7fe838db3cc0>> location in window: {243, 388.5} previous location in window: {243, 388.5} location in view: {243, 36.5} previous location in view: {243, 36.5}
)}
这是不工作时的事件:
2014-10-04 07:58:08.952 four-down[95709:8557144] <UITouchesEvent: 0x7fe838f07350> timestamp: 1.29021e+06 touches: {(
<UITouch: 0x7fe83a5c91a0> phase: Began tap count: 1 window: <UIWindow: 0x7fe83a33f3f0; frame = (0 0; 320 568); gestureRecognizers = <NSArray: 0x7fe83a340010>; layer = <UIWindowLayer: 0x7fe83a304160>> view: <CrosswordInteractiveView: 0x7fe83a555920; frame = (0 65; 310 310); gestureRecognizers = <NSArray: 0x7fe83a54d4e0>; layer = <CALayer: 0x7fe83a544df0>> location in window: {241.5, 379} previous location in window: {241.5, 379} location in view: {236.5, 250} previous location in view: {236.5, 250}
)}
注意两个事件的不同窗口。 UITextEffectsWindow 是包含键盘的窗口,而 UIWindow 是主应用程序窗口。我检查了每个窗口的 windowLevel 属性。在这两种情况下都是一样的:1.0 用于键盘窗口,0.0 用于主应用程序窗口。
如果有的话,我做错了什么?鉴于它适用于 iOS 7,感觉就像是一个 iOS 错误,但也许我应该调用一个新的 iOS 8 API?如果没有,我欢迎提出解决方法的建议
【问题讨论】:
-
你找到答案了吗?我遇到了同样的问题!
-
@gusbit 不,但我确实找到了解决方法。我会发布它作为答案。希望对您有所帮助。