我正在尝试修复一个涉及UIView hitTest的错误:withEvent:当触摸在UIKeyboard上时,在我的视图中被调用,但只有在应用程序处于后台之后才会被调用。
它发生在我的应用程序中,具有复杂的视图层次结构,所以我在一个只有2个视图的应用程序中重现它:
行为如下:
我在iOS 5 iPad上看到这个2.但是只在设备上,从不在模拟器中。知道为什么hitTesting会以这种方式搞砸了吗?感谢。
答案 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属性,注册了UIKeyboardDidShowNotification
和UIKeyboardDidHideNotification
,并添加了:
- (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];
}