Warum ist die Methode hitTest:withEvent: drei mal aufgerufen für jeden touch?
Habe ich eine Unterklasse von UIView
in die habe ich überschrieben hitTest:withEvent:
wie folgt:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
NSLog(@"Event = %@", event);
return self;
}
Für jede Note in der Ansicht, ich sehe drei Anrufe zu hitTest:withEvent:
. Diese drei Anrufe gemacht, bevor Sie berühren sich. Die Ausgabe ist wie folgt:
2011-07-01 09:20:58.553 AppName[930:207] Event = <UITouchesEvent: 0x6a08360> timestamp: 4297.16 touches: {(
)}
2011-07-01 09:20:58.553 AppName[930:207] Event = <UITouchesEvent: 0x6a08360> timestamp: 4297.16 touches: {(
)}
2011-07-01 09:20:58.554 AppName[930:207] Event = <UITouchesEvent: 0x6a08360> timestamp: 4304.54 touches: {(
)}
Anhand der Zeitstempel und Adressen, es scheint, als ob Sie ein einzelnes UITouchesEvent
- Objekt verwendet wird und die Zeitstempel nicht richtig, bis der Dritte Anruf. Kann mir jemand erklären, warum hitTest:withEvent:
aufgerufen wird, wird in drei Zeiten wie diesen? Ich bin nicht auf der Suche nach einem workaround. Ich möchte nur verstehen, was Los ist.
- haben Sie überprüft, die stack-trace in den debugger? ich würde vermuten, die verschiedenen Teile der Maschinen erkundigen, wer die Note getroffen hat
- Es sieht aus wie
_UIApplicationHandleEvent
tun all die Fragen, zweimal durch[UIWindow _hitTestToPoint:pathIndex:forEvent:]
und einmal auf seine eigenen. - Hast du jemals das Glück haben, herauszufinden, warum dies geschieht, oder wie es zu vermeiden? Ich bin versucht zu tun, einige Protokollierung für berührt auf einen Blick aber immer noch wollen, lassen Sie die Berührungen durch die anzeigen zu es superview.
- Ich habe keine zusätzlichen Informationen. Sorry.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hatte das gleiche problem und konnte es lösen mit diesem code. Obwohl pointInside und hitTest bekommen 3 mal aufgerufen, touchesBegan (oder touchesEnded) von UIView, die berührt wurde wird nur einmal aufgerufen.
Haben Sie mehr als eine Untersicht?
Aus der docs:
Diese Methode durchläuft die view-Hierarchie durch das Absenden der pointInside:withEvent: Nachricht an jeder Untersicht, um zu bestimmen, die Untersichten erhalten eine touch-event. Wenn pointInside:withEvent: gibt JA dann die Untersicht der Hierarchie durchzogen wird; andernfalls ist die Filiale der view-Hierarchie ignoriert wird. Sie selten benötigen, um diese Methode aufrufen, aber Sie überschreiben können es zu verbergen, berühren Sie Veranstaltungen aus der Untersichten.
hitTest:withEvent:
Nachrichten. Hinzufügen oder entfernen Geschwister Ansichten nicht ändern, das Ergebnis entweder.Finden Sie unter Apple-Mailing-Liste: Re: -die Methode hitTest:withEvent: zweimal aufgerufen?
Sollten Sie überprüfen, um zu sehen, wenn Sie den subtype und type-Eigenschaft sind alle gleich. diese 3 Ereignisse machen Sinn, denn es gibt Falle, die ausgelöst werden muß, um den OS zu verstehen, die Natur des touch-event.
Beispielsweise, swipe, pinch und tap, alle starten mit den gleichen touch-event. Meine Vermutung ist, dass die ersten beiden werden gefeuert 1 zu registrieren, Tippen Sie auf ein Ereignis und die zweite um zu testen, Tippen Sie auf ein Ereignis zu "bewegen". der zweite genannt wird, nicht lange danach wahrscheinlich entweder vom Pinchen/Zoomen/was auch immer.
Bottom line, die Dokumentationen, Gespräche über 3 verschiedene Art der Veranstaltungen: Berührung, Bewegung und remote-Ereignisse. UIEvent Klasse Referenz