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.
Wie gesagt, alles funktioniert, außer Scrollen.
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% 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.
Tags und Links iphone animation event-handling uikit event-loop