Benutzerdefinierte Ereignisschleife und UIKit-Steuerelemente. Welche zusätzliche Magie hat Apples Event-Loop?

9

Kennt jemand oder haben gute Links, die erklären, was die Ereignisschleife des iPhone unter der Haube tut?

Wir verwenden eine benutzerdefinierte Ereignisschleife in unserem OpenGL-basierten iPhone-Spielframework. Er ruft unser Spiel-Rendering-System auf, ruft presentRenderbuffer auf und pumpt Events mit CFRunLoopRunInMode. Weitere Informationen finden Sie im folgenden Code.

Es funktioniert gut, wenn wir keine UIKit-Steuerelemente verwenden (als Beweis versuchen Sie Facetap , unser erstes veröffentlichtes Spiel).

Wenn Sie jedoch UIKit-Steuerelemente verwenden, funktioniert fast , aber nicht ganz. Insbesondere funktioniert das Scrollen von UIKit-Steuerelementen nicht ordnungsgemäß.

Betrachten wir zum Beispiel folgendes Szenario.

  • Wir zeigen UIImagePickerController zusätzlich zu unserer eigenen Ansicht.
  • UIImagePickerController deckt unsere benutzerdefinierte Ansicht
  • ab
  • Wir unterbrechen auch unser eigenes Rendering, verwenden aber weiterhin die benutzerdefinierte Ereignisschleife.

Wie gesagt, alles funktioniert, außer Scrollen.

  • Fotos picken funktioniert.
  • Drilling bis zu Fotoalben funktioniert und Übergangsanimationen sind glatt.
  • Wenn Sie versuchen, die Fotoalbumansicht zu durchlaufen, folgt die Ansicht Ihrem Finger.

Problem: Beim Scrollen stoppt das Scrollen sofort, nachdem Sie Ihren Finger gehoben haben. In der Regel wird die Verarbeitung basierend auf der Geschwindigkeit Ihrer Bewegung reibungslos fortgesetzt, jedoch nicht, wenn die benutzerdefinierte Ereignisschleife verwendet wird. Es scheint, dass die Ereignisschleife des iPhones mit dem UIKit-Scrollen etwas magisch macht, das wir selbst nicht implementiert haben.

Nun können wir die UIKit-Steuerelemente mit unserem eigenen System kombinieren, indem wir Apples Ereignisschleife verwenden und unser eigenes Rendering über NSTimer-Callbacks aufrufen. Dennoch würde ich gerne verstehen, was möglicherweise in der iPhone-Ereignisschleife passiert, die nicht in unserer benutzerdefinierten Ereignisschleife implementiert ist.

%Vor%     
Teemu Kurppa 07.04.2010, 12:37
quelle

1 Antwort

4

Wenn Sie NSLog [[NSRunLoop currentRunLoop] currentMode] von [UIScrollView setContentOffset:] wenn [UIScrollView isDecelerating] wahr ist, sehen Sie UITrackingRunLoopMode .

Im Allgemeinen verwendet das System Modi außer kCFRunLoopDefaultMode in der Haupt-UI-Thread-Ausführungsschleife, von denen nur einige dokumentiert sind. Die einzige Möglichkeit, das vollständige Systemverhalten zu erhalten, besteht darin, mit der Systemlaufschleife im Hauptthread zusammenzuarbeiten.

Sie könnten versuchen, ein NSTimer zu verwenden und das System Sie anrufen zu lassen, anstatt CFRunLoopRunInMode selbst aufzurufen. Ein NSTimer kann im Laufe der Zeit frei laufen, und wenn keine andere UI angezeigt wird, würde die Systemlaufschleife nichts außer dem Aufruf des Timers tun.

Die Alternative wäre, von Ihrer customEventLoop-Funktion zurückzukehren, während Systemsteuerelemente angezeigt werden, und sie erneut aufzurufen, wenn Sie Ihre benutzerdefinierte Benutzeroberfläche wieder aufnehmen.

    
drawnonward 11.05.2010, 05:19
quelle