3 Stimmen

iPad: touchesBegan wird nicht aufgerufen, wenn der Finger vom oberen Bildschirmrand gezogen wird

Ich schreibe eine ipad-Anwendung, bei der man mit 1 oder 2 Fingern auf dem Bildschirm herumziehen kann. Ich verwende die Methoden touchesBegan, touchesMoved und touchesEnded, um die Berührungen zu erkennen. Ich habe multipletouches für die Ansicht aktiviert.

Jetzt ist mir ein seltsames Verhalten aufgefallen. Wenn ich einen Finger außerhalb des oberen Bildschirmrandes platziere und ihn nach unten auf den Bildschirm ziehe, erhalte ich keinen Aufruf von touchesBegan oder touchesMoved. Dies kann für die anderen Bildschirmränder nicht reproduziert werden.

Der einzige andere Fall, in dem das Problem reproduziert werden kann, ist, wenn ich das Querformat verwende und die Home-Taste nach links zeige. In diesem Fall erhalte ich das gleiche Verhalten für den oberen Bildschirmrand.

Hat jemand Informationen darüber oder macht die gleichen Erfahrungen, wenn er Tests durchführt?

Bearbeiten: Ich habe einige zusätzliche Tests durchgeführt. Der Bereich, in dem sich normalerweise die Statusleiste befinden würde, empfängt touchesBegan oder touchesMoved sehr gut, wenn ich den Finger in diesem Bereich ablege oder ihn von einer beliebigen unteren Bildschirmposition nach oben schiebe. Die Eingabe wird nur dann nicht erkannt, wenn ich den Finger von einer Position, die komplett über dem Bildschirmrand liegt, nach unten schiebe.

Bearbeiten2: Zusätzliche Informationen: - Meine Anwendung verwendet eine OpenGL-Ansicht. - Die Statusleiste ist ausgeblendet. - touchesBegan wird beim Berühren der (ausgeblendeten) Statusleistenbereiche in allen Ausrichtungen korrekt aufgerufen.

3voto

Ben Weiss Punkte 31

Ich glaube, das zugrunde liegende Problem ist, dass die berührungsempfindliche Schicht auf dem Bildschirm erstreckt sich ein paar Pixel über den sichtbaren Bildschirm, was bedeutet, dass Berührungen, die dort technisch beginnen außerhalb Ihrer UIViewController Ansicht. Da Ihr UIViewController nur Berührungen sieht, die innerhalb seiner Ansicht beginnen, wird er diese Berührungen nicht sehen. Wenn also der Bildschirm Ihres Geräts ein oder zwei Pixel oberhalb der sichtbaren Pixel berührt wird, wird die Berührung an die virtuelle Ebene gesendet, die in diesem Offscreen-Bereich existiert (vielleicht die Statusleiste?). Dadurch wird verhindert, dass Ihr UIViewController Berührungen empfängt, da die Berührung nicht aus dem Anzeigebereich Ihres UIViewControllers stammt.

Um dies zu umgehen, können Sie zum Zeitpunkt des Starts der Anwendung die Größe des UIWindow so ändern, dass es (sagen wir) auf jeder Seite 10 Pixel größer ist, und darin eine UIViewController-Hintergrundebene erstellen, die der erweiterten Größe des Fensters entspricht. Dann setzen Sie Ihre Hauptschnittstelle UIViewController Ansicht zu einem Kind der "Hintergrund"-Ansicht, eingefügt 10 Pixel auf allen Seiten, um die physische Bildschirmgröße wieder anzupassen. Wenn sich Ihre Schnittstelle dreht, muss die 10-Pixel-Vergrößerung der Hintergrundansicht jedes Mal in der willAnimateRotationToInterfaceOrientation-Methode in Ihrem Hintergrund-UIViewController erneut angewendet werden.

Schließlich lassen Sie die touchesBegan/Moved/Ended-Methoden im Hintergrund-View-Controller ihre Berührungen direkt an die entsprechenden Methoden in Ihrem Haupt-UI-View-Controller weiterleiten. Voilà!

Ich hoffe, das hilft, Ben

0voto

Ole Begemann Punkte 133946

Klingt für mich richtig. Wenn Sie Ihren Finger zuerst über die Statusleiste ziehen, empfängt sie alle Berührungsereignisse für diesen Finger, bis Sie ihn anheben. Alle Berührungsereignisse werden an die Ansicht geliefert, in der die Berührung begann.

0voto

0xDE4E15B Punkte 1294

Leider kann touchesBegan nicht aus dem Bereich der Statusleiste aufgerufen werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X