Ich habe einen GLKViewController, um einige OpenGL-Zeichnungen zu bearbeiten. Ich habe die Methode glkView:drawInRect
und update
implementiert und die Eigenschaft preferredFramesPerSecond
auf 30 (den Standardwert) gesetzt.
Das Problem besteht darin, dass die Delegate-Methoden nicht mehr ausgelöst werden, wenn der Benutzer mit anderen Teilen der App interagiert. Die zwei Fälle, in denen ich das gesehen habe, sind, wenn der Benutzer einen UITableView scrollt oder mit einem MKMapView interagiert.
Gibt es eine Möglichkeit, sicherzustellen, dass diese Delegierten immer auslösen, unabhängig davon, was der Rest der App tut. Das einzige Mal, wenn ich möchte, dass dies aufhört, ist, wenn die App in den Hintergrund tritt (was automatisch der Fall ist).
Der Grund dafür ist, dass beim Scrollen in einer Tabellenansicht oder einer Kartenansicht der Runloop in UITrackingRunLoopMode
ist, was eine höhere Priorität als der Standardmodus hat. Dies verhindert, dass einige Ereignisse ausgelöst werden, um eine hohe Scrollleistung zu garantieren.
Um Ihr Problem zu lösen, müssen Sie eine eigene Rendering-Schleife einrichten, anstatt sich auf GLKViewController
zu verlassen.
enableSetNeedsDisplay
von GLKView
auf NO
setzen (sollte bei Verwendung von GLKViewController automatisch gesetzt werden). preferredFramesPerSecond
auf 0 (oder vielleicht 1), um die Rendering-Schleife von GLKViewController
zu deaktivieren oder verwenden Sie GLKViewController überhaupt nicht #import <QuartzCore/QuartzCore.h>
CADisplayLink
und plane es in NSRunLoopCommonModes
: Ich habe das nicht getestet, also sag mir, ob es funktioniert!