Ios8 键盘不';应用程序进入后台后,不会收到点击

Ios8 键盘不';应用程序进入后台后,不会收到点击,ios8,iphone-softkeyboard,Ios8,Iphone Softkeyboard,我刚刚向我的纵横填字游戏应用程序Four Down发送了一个iOS 8更新,并且已经开始收到报告说它进入了一种无法输入答案的状态,因为敲击键盘会使它失效,而不是输入字母 经过一些调查,只要将应用程序放到后台,然后再次激活,它就会可靠地进入这种状态。退出应用程序并重新启动它可以修复问题,直到下一次从后台恢复 当问题发生时,由于键盘下方的视觉视图接收到触摸,因此触摸检测(但不是视觉)的顺序似乎错误。我相信这个问题是iOS 8特有的 为了诊断问题,我将UIApplication子类化并重写sendEv

我刚刚向我的纵横填字游戏应用程序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:56:57.998四下[95709:8557144]时间戳:1.29014e+06{(
阶段:开始点击计数:1窗口:视图:窗口中的位置:{243,388.5}窗口中的上一个位置:{243,388.5}视图中的位置:{243,36.5}视图中的上一个位置:{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}
)}
2014-10-04 07:58:08.952四下[95709:8557144]时间戳:1.29021e+06{(
阶段:开始点击计数:1窗口:视图:窗口中的位置:{241.5379}窗口中的上一个位置:{241.5379}视图中的位置:{236.5250}视图中的上一个位置:{236.5250}
)}
注意这两个事件的不同窗口。UITextEffectsSwindow是包含键盘的窗口,UIWindow是主应用程序窗口。我已经检查了每个窗口的windowLevel属性。这两种情况都是一样的:键盘窗口为1.0,主应用程序窗口为0.0

我做错了什么?考虑到它可以在iOS 7上运行,感觉像是一个iOS bug,但也许我应该调用一个新的iOS 8 API?如果没有,我欢迎关于解决办法的建议

我向苹果提交了一份雷达(18546966)。他们将其作为18406902的副本关闭。18406902很明显已经关闭了,但我只有这些信息。不知道修复程序将使用哪个版本的iOS。它可能会在iOS 9 Beta中修复——我还没有测试过它

同时,我想出了以下解决方法,阻止了错误报告:

- (UIView*) hitTest:(CGPoint) point withEvent:(UIEvent*) event {
    UIView* hitView = [super hitTest:point withEvent:event];
    if (!hitView) {
        UIWindow* keyboardWindow = [self findKeyboardWindow];
        if (keyboardWindow) {
            UIView* viewInKeyboardWindow = [keyboardWindow hitTest:point withEvent:event];
            if (!viewInKeyboardWindow) {
                [self resignFirstResponder];
            } else {
                return viewInKeyboardWindow;
            }
        } else {
            [self resignFirstResponder];
        }
    }
    return hitView;
}

- (UIWindow*) findKeyboardWindow {
    NSArray* windows = [UIApplication sharedApplication].windows;
    if (windows.count == 2) {
        for (UIWindow* candidate in windows) {
            if (candidate != self.window) {
                return candidate;
            }
        }
    }
    return nil;
}

你有没有找到答案?我遇到了同样的问题@没有,但我确实找到了解决办法。我会把它作为答案贴出来。希望能有帮助。