iphone - perfil - sdk ios 11
La animaciĆ³n en la vista de OpenGL ES se congela cuando se arrastra UIScrollView en el iPhone (1)
Tengo una subvista OpenGL ES animada transparente (una modificación de la clase EAGLView de la plantilla de Apple) que dibuja una esfera giratoria. Al igual que el ejemplo de Apple, CADisplayLink se usa en dispositivos donde están disponibles.
En la misma pantalla, hay un UIScrollView que contiene UIButtons que se pueden seleccionar. Cuando el usuario se desplaza por UIScrollView, la animación de mi EAGLView se congela. Este comportamiento se reproduce en iOS Simulator 4.2 y en iPhone OS 3.1.3 en un dispositivo iPhone 2G.
¿Alguna idea sobre qué hacer para evitar la pausa del EAGLView, además de codificar mi propia vista de desplazamiento?
Si CADisplayLink
durante las volutas depende del modo con el que lo agregue al ciclo de ejecución. Probablemente tengas esto, en alguna parte:
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
UIApplication agrega un modo de ciclo de ejecución, UITrackingRunLoopMode
, para ''rastrear en controles'', que incluye cuando una vista de desplazamiento se desplaza. Entonces, en ese punto, el runloop se desconecta del modo predeterminado y, por lo tanto, su enlace de pantalla (y también los temporizadores, NSURLConnections
, etc., agregados en el modo predeterminado) no se disparará hasta que se restaure el modo predeterminado.
Solución rápida: cambie su código a:
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
UITrackingRunLoopMode se considera uno de los modos comunes.
Pasar demasiado tiempo interrumpiendo UIKit puede llevar a una respuesta de control muy pobre, por lo que debe tener cuidado. Sería para divergir del tema de forma masiva, pero aunque OpenGL es modal y, por lo tanto, no es especialmente útil para el subprocesamiento, puede usar un EAGLSharegroup para realizar la representación en un subproceso independiente y luego insertarlo en el subproceso principal.
Un ejemplo en (2016) Swift3 ...
let d = CADisplayLink(target: self, selector: #selector(ThisClassName.updateAlpha))
d.add(to: RunLoop.current, forMode: RunLoopMode.commonModes)
//and then, for example...
func updateAlpha() {
let a = leader.layer.presentation()?.value(forKey: "opacity") as! CGFloat
follower.alpha = a
}