2013-08-12 16 views
8

Auf Mac kann man immer die Position der Maus "außerhalb des Ereignisstroms" erhalten (dh, selbst wenn Sie keine Delegiertenmethoden für mouseUp: und andere abonniert haben), indem Sie [NSEvent mouseLocation] aufrufen.Berührungen beim Start unter iOS

Gibt es eine Möglichkeit auf iOS, aktuelle Touch-Ereignisse zu erhalten, ohne auf touchesBegan: zu hören?

Ich frage, weil es zumindest eine Situation, in der touchesBegan nicht aufgerufen wird: bei App-Start, wenn ein Touch bereits im Gange ist, wird touchesBegan nie genannt. Tatsächlich werden auch keine der berührungsbezogenen UIEvent-Methoden so genau aufgerufen, wie ich sagen kann (anscheinend auch nicht die von UIApplication/UIWindow sendEvent:).

Ich möchte das Verhalten meiner App leicht abhängig davon variieren, ob beim Start eine Berührung stattfindet. Gibt es eine Möglichkeit, beim App-Start eine in Bearbeitung befindliche Berührung zu erkennen??

+0

Was bedeutet "zum Start der App" für Ihre Anwendung? Machst du zeitaufwendige Aktionen am Hauptthread zur Ladezeit? – yurish

+0

"bei App-Start" ist "wenn der Benutzer auf das App-Symbol auf dem Sprungbrett tippt und die App öffnet". Touch-Events nicht zu bekommen, ist * nicht *, weil die App übermäßig belastet wird mit starker Verarbeitung; Das liegt daran, dass Berührungen, die beim Öffnen der App ausgeführt werden, nicht auf die übliche Weise an die App übermittelt werden. Ich versuche herauszufinden, ob irgendjemand einen Weg außerhalb der normalen Schleife kennt, vielleicht Subclassing und Overriding, um Berührungen zu erhalten, die willkürlich von irgendeiner Methode zu irgendeiner Zeit ausgeführt werden. – SG1

+0

Ich denke, das ist nicht möglich. UIApplication ist nicht für Unterklassen geeignet und das ist der Einstiegspunkt für Ihre Anwendung –

Antwort

6

Dies ist nicht möglich. Der einfache Grund: Die Berührungsereignisse gehören nicht zu Ihrer App. Jede Berührung gehört zu einem UI-Element (oder Responder). Wie Sie bereits wissen, erhält dieses Element die begonnenen, verschobenen, beendeten, abgebrochenen Nachrichten.

Dies gilt sogar innerhalb einer ordnungsgemäß programmierten App: Alle Ereignisse in Bezug auf eine Touch werden an das gleiche Objekt geliefert. Wie könnte ein anderes Objekt schließlich wissen, was mit diesem Ereignis geschehen soll und wie sollte das erste Objekt das erwartete Verhalten ordnungsgemäß beenden?

Sie können (oder könnten, sollten aber wahrscheinlich nicht) eine Arbeit in Ihrer App finden, es gibt keine Möglichkeit für Cross-App-Touch-Passings.

Und auf dem Mac können Sie die Mausposition abfragen, aber im normalen Anwendungsablauf wird immer eine Maustaste gedrückt, bevor Sie ein Mausereignis erhalten.

Um ehrlich zu sein, sehe ich keinen Grund, warum das sowieso nötig wäre ... oh warte ... Ich könnte mein App-Icon in mehrere Bereiche aufteilen ... nicht sicher, ob es schon Datenschutzgesetze verletzen würde Wenn Sie jedoch wissen, wo der Benutzer sein Symbol auf dem Bildschirm hat.

+0

Danke für die Zeit in die Antwort und die Klarstellung. Während dies die aktuelle kanonische Antwort zu sein scheint, möchte ich warten, bis es eine "Antwort" auf diese Frage gibt - z. B. in iOS 9, nachdem mein Fehlerbericht angesprochen wurde;) Ich denke, ich kann die Antworten später jedoch ändern ... – SG1

0

Ich denke, Sie könnten einfach den Anwendungsstart "erweitern". Wenn ich während des Starts meiner Anwendung zeitraubende Aufgaben hatte, zeigte ich während der Ausführung der Aktion denselben Begrüßungsbildschirm mit einem UIActivityIndicator.

Sie könnten einfach einen NSTimer erstellen, ungefähr 2 Sekunden warten und während dieser Zeit nach Berührungen suchen, während der Begrüßungsbildschirm immer noch angezeigt wird.

Drücken Sie dazu in applicationDidFinishLaunch einen ViewController, der genau wie der Begrüßungsbildschirm aussieht und nach Berührungen in diesem ViewController sucht. Nach diesen 2 Sekunden fahren Sie mit der normalen Initialisierung fort. Dieses Verhalten hilft auch, wenn Sie während der Initialisierung zeitaufwendige Aufgaben ausführen müssen.

Ich weiß, es ist eine Problemumgehung, aber meine Vermutung ist, dass es nicht möglich ist, nach Berührungen zu überprüfen, weil die Anwendung am Hauptthread arbeitet und die Berührungen auch im Hauptthread verarbeitet werden. Dies kann auch passieren, weil keine ViewControllers oder UIWindow initialisiert und bereit sind, Berührungen zu hören.

Ich hoffe, es hilft.

-2

Sie könnten versuchen, den hitTest: withEvent: stattdessen.

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event; 

Da Apple doc nach „Gibt den fernsten Abkömmling des Empfängers in der Ansichtshierarchie (einschließlich sich selbst), die einen festgelegten Punkt beinhaltet.“