tutorial iphone cocoa-touch

iphone - tutorial - ios



Mis elementos de IU personalizados no se actualizan mientras se desplaza UIScrollView (3)

Tengo un elemento UI de círculo giratorio que actualiza un NSTimer. También tengo un UIScrollView que ''bloquearía'' el círculo giratorio mientras se desplaza. Eso se esperaba, porque el temporizador y la vista de desplazamiento estaban en el mismo hilo.

Así que puse el temporizador en un hilo separado que básicamente funciona muy bien! Puedo ver que funciona porque los NSLogs siguen llegando incluso mientras se desplaza.

¡Pero mi problema es que mi círculo giratorio aún se detiene al desplazarse! Sospecho que el redibujado se detiene hasta la próxima iteración del ciclo de ejecución del hilo principal (?). Entonces, incluso si su ángulo cambia todo el tiempo, es posible que no se vuelva a dibujar ...

¿Alguna idea de lo que puedo hacer? ¡Gracias!


Mientras se desplaza, el ciclo de ejecución del subproceso principal está en UITrackingRunLoopMode . Entonces, lo que debe hacer es programar su temporizador en ese modo (posiblemente además del modo predeterminado). Creo que NSRunLoopCommonModes incluye los modos de seguimiento predeterminado y de eventos, por lo que puedes hacer esto:

NSTimer *timer = [NSTimer timerWithTimeInterval:0.42 target:foo selector:@selector(doSomething) userInfo:nil repeats:YES]; [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

Por cierto, deberías hacer todo esto en el hilo principal. No es necesario generar un hilo de fondo (a menos que cada invocación de temporizador vaya a hacer un procesamiento largo).


Tiene razón en que UIScrollView no actualiza su vista de contenido durante el desplazamiento.

Probablemente su mejor opción, y esto es algo así como un truco, es mostrar su vista de animación por separado (quizás dentro de una vista de marco, para obtener el recorte libre) y usar las devoluciones de llamada delegadas de vista de desplazamiento para averiguar la posición actual del desplazamiento y coloque su animación en consecuencia.

NOTA : ¡esta sugerencia es un truco ! No se trata de las mejores prácticas y, ciertamente, es contrario al código simple y mantenible sin efectos secundarios. Sin embargo, es la única forma en que puedo pensar para obtener la pantalla que desea.

Otro truco: vuelva a pensar en la importancia de mostrar los contenidos animados de una vista desplazable mientras se desplaza.


UIScrollView no solo bloquea NSTimers, sino que bloquea todo el hilo principal. Y los objetos UIKit solo deben accederse en el hilo principal (y, a menudo, son limitados de maneras impredecibles si intenta eludir esa restricción), que probablemente sea la razón, incluso si tiene un reloj que viene de un hilo externo, usted No puedo publicar actualizaciones.

Es un poco esquivo, pero ¿hay alguna manera de que tu animación se pueda lograr con CoreAnimation? Las cosas vinculadas a eso continúan funcionando independientemente de lo que esté sucediendo en el hilo principal.