hitTest se triggers quand UIKeyboard est engagé

J'essaie de corriger un bug qui implique UIView hitTest: withEvent: étant appelé sur ma vue lorsque les touches sont sur le UIKeyboard, mais seulement après que l'application a été en arrière-plan.

Il se produisait dans mon application avec une hiérarchie de vue complexe, donc je l'ai reproduit dans une application avec seulement 2 vues:

  • 1 UIView 768×1024 (plein écran)
  • 1 UITextView 200×200 dans la moitié supérieure de la vue plein écran

Le comportement est le suivant:

  • Si vous appuyez sur la vue du text, la méthode hitTest de la vue en plein écran se triggers, le champ de text devient le premier répondeur, puis le keyboard apparaît comme prévu. Taper sur les touches du keyboard fonctionne bien.
  • Maintenant, écartez le keyboard.
  • Envoyer l'application à l'arrière-plan
  • Ensuite, reprenez l'application.
  • Rendez le premier répondeur textuel à nouveau. Voici le problème, maintenant en tapant sur les touches du keyboard, la méthode hitTest de la vue en plein écran est en train de tirer.

Je vois ceci sur un iPad 5 iOS 2. Seulement sur l'appareil cependant, jamais dans le simulateur. Une idée de pourquoi hitTesting pourrait se foirer de cette façon? Merci.

J'ai le même problème ici. Cela arrive seulement quand je rentre à la maison et returnne à l'application. Cela n'arrive pas dans la première manche.

Et il est également lié à iOS5.

Le problème décrit ci-dessus semble provenir de l'UIWindow du keyboard coincé dans un mauvais état. S'assurer que la propriété cachée de la window du keyboard est définie sur YES (même si elle est déjà OUI) résout le problème pour moi. Cela peut être fait dans votre class 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 && [NSSsortingngFromClass(testWindow.class) hasPrefix:@"UIText"]) { BOOL wasHidden = testWindow.hidden; testWindow.hidden = YES; if (!wasHidden) { testWindow.hidden = NO; } break; } } } 

Le nom de class de la window du keyboard, au less dans iOS 5 avec un keyboard américain standard, est UITextEffectsWindow. Comme d'habitude, ce n'est pas une bonne idée de s'appuyer sur des noms de class non documentés, mais dans le cas d'un bogue spécifique au operating system, cela fonctionne pour mes fins. Il peut y avoir un certain nombre de windows, y compris la window de l'application racine, le keyboard, les alertes et autres windows que votre application ou d'autres frameworks ont ajoutées, alors ne soyez pas trop inspécifique.

J'ai eu le même problème, et mon travail consiste à écouter UIKeyboardDidShowNotification et UIKeyboardDidHideNotification, calculer la hauteur du keyboard en utilisant UIKeyboardFrameEndUserInfoKey, puis dans ma méthode hitTest: withEvent: je verrais si le hit était sur le keyboard "zone" ou non.

Juste pour développer la réponse de @ enzo-tran, voici ce que j'ai fini par faire: j'ai ajouté une propriété keyboardRect à ma sous-class UIView, enregistrée pour UIKeyboardDidShowNotification et UIKeyboardDidHideNotification , et ajouté:

 - (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]; }