点击键盘时会触发hotTest

时间:2011-11-09 23:05:44

标签: ios ios5 hittest first-responder

我正在尝试修复一个涉及UIView hitTest的错误:withEvent:当触摸在UIKeyboard上时,在我的视图中被调用,但只有在应用程序处于后台之后才会被调用。

它发生在我的应用程序中,具有复杂的视图层次结构,所以我在一个只有2个视图的应用程序中重现它:

  • 1 UIView 768x1024(全屏)
  • 全屏视图上半部分的1 UITextView 200x200

行为如下:

  • 点击文本视图会导致全屏视图的hitTest方法触发,文本字段成为第一响应者,然后键盘将按预期显示。点击键盘键工作正常。
  • 现在解雇键盘。
  • 将应用发送到后台。
  • 然后恢复应用。
  • 再次使textview成为第一响应者。这就麻烦了,现在当点击键盘上的键时,全屏视图的hitTest方法正在触发。

我在iOS 5 iPad上看到这个2.但是只在设备上,从不在模拟器中。知道为什么hitTesting会以这种方式搞砸了吗?感谢。

4 个答案:

答案 0 :(得分:10)

上面描述的问题似乎是由键盘的UIWindow卡在一个糟糕的状态引起的。确保键盘窗口的隐藏属性设置为YES(即使它已经是YES)也为我解决了问题。这可以在您的UIApplicationDelegate类中完成:

- (void)applicationWillEnterForeground:(UIApplication *)application {
    // The keyboard sometimes disables interaction when the app enters the 
    // background due to an iOS bug. This brings it back to normal.
    for (UIWindow *testWindow in [UIApplication sharedApplication].windows) {
        if (!testWindow.opaque && [NSStringFromClass(testWindow.class) hasPrefix:@"UIText"]) {
            BOOL wasHidden = testWindow.hidden;
            testWindow.hidden = YES;

            if (!wasHidden) {
                testWindow.hidden = NO;
            }

            break;
        }
    }
}

键盘窗口的类名称(至少在带有标准美式键盘的iOS 5中)是UITextEffectsWindow。像往常一样,依靠未记录的类名称并不是一个好主意,但在特定于操作系统的错误的情况下,它可以用于我的目的。可以有任意数量的窗口,包括根应用程序窗口,键盘,警报以及您的应用程序或其他框架添加的其他窗口,因此不要过于具体。

答案 1 :(得分:9)

在这里遇到同样的问题。它确实发生在我回家并返回应用程序时。 在第一次新赛跑中不会发生。

它也与iOS5有关。

答案 2 :(得分:0)

我遇到了同样的问题,我的工作是听UIKeyboardDidShowNotification和UIKeyboardDidHideNotification,使用UIKeyboardFrameEndUserInfoKey计算键盘高度,然后在我的hitTest:withEvent:方法中我会看到命中是否在键盘“区域”或不

答案 3 :(得分:0)

为了扩展@ enzo-tran的答案,这就是我最终要做的事情:我在我的UIView子类中添加了一个keyboardRect属性,注册了UIKeyboardDidShowNotificationUIKeyboardDidHideNotification,并添加了:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
  if (CGRectContainsPoint([self keyboardRect], point)) {
    // Ignore      
  } else {
    ...
  }
}

- (void)keyboardDidShow:(NSNotification *)notif {
    CGRect keyboardRect;

    [[[notif userInfo] valueForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardRect];
    keyboardRect = [self convertRect:keyboardRect fromView:nil];

    [self setKeyboardRect:keyboardRect];
}

- (void)keyboardDidHide:(NSNotification *)notif {
    [self setKeyboardRect:CGRectZero];
}