hitTest触发UIKeyboard时触发

我试图修复一个涉及UIView hitTest的bug:withEvent:当UIKeyboard上的触摸时,我的视图被调用,但只有在应用程序已经在后台。

这是发生在我的应用程序与复杂的视图层次结构,所以我转载它只有2意见的应用程序:

  • 1 UIView 768×1024(全屏)
  • 1 UITextView 200×200在全屏视图的上半部分

行为如下:

  • 点击textview导致全屏视图的hitTest方法触发,文本字段成为第一响应者,然后键盘出现所有预期的。 点击键盘上的按键工作正常。
  • 现在closures键盘。
  • 发送应用程序的背景。
  • 然后恢复应用程序。
  • 再次使textview第一响应。 这是麻烦,现在当敲击键盘上的按键时,全屏视图的hitTest方法正在触发。

我在iOS 5 iPad 2上看到了这一点。只有在设备上,从来没有在模拟器。 任何想法为什么hitTesting可能会搞砸了这种方式? 谢谢。

在这里得到同样的问题。 它只有当我打回家,然后返回到应用程序才会发生。 在第一次运行中不会发生。

它也与iOS5相关。

上面描述的问题似乎是由于键盘的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; } } } 

至less在带有标准美式键盘的iOS 5中,键盘窗口的类名是UITextEffectsWindow。 像往常一样,依赖未公开的类名称并不是一个好主意,但是在特定于操作系统的错误的情况下,它适用于我的目的。 可能有任何数量的窗口,包括根应用程序窗口,键盘,警报和其他窗口,您的应用程序或其他框架已添加,所以不要太具体。

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

只是扩大@ enzo-tran的答案,这是我最终做的:我添加了一个keyboardRect属性到我的UIView子类,注册为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]; } 
Interesting Posts