NSTimer no se dispara cuando ocurre un evento uiscrollview

Tengo un UIImageView colocado en UIScrollView. Básicamente, este UIImageView tiene un mapa muy grande y creó una animación en una ruta predefinida con “flechas” en la dirección de navegación.

Pero, cada vez que ocurre algún evento inesperado, creo que MainLoop se congela y que NSTimer no se activa y la animación se detiene.

¿Existe alguna propiedad existente que resuelva este problema en UIScrollView, CAKeyFrameAnimation o NSTimer?

//viewDidLoad self.myTimer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(drawLines:) userInfo:nil repeats:YES]; - (void)drawLines:(NSTimer *)timer { CALayer *arrow = [CALayer layer]; arrow.bounds = CGRectMake(0, 0, 5, 5); arrow.position = CGPointMake(line.x1, line.y1); arrow.contents = (id)([UIImage imageNamed:@"arrow.png"].CGImage); [self.contentView.layer addSublayer:arrow]; CAKeyframeAnimation* animation = [CAKeyframeAnimation animation]; animation.path = path; animation.duration = 1.0; animation.rotationMode = kCAAnimationRotateAuto; // object auto rotates to follow the path animation.repeatCount = 1; animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; animation.fillMode = kCAFillModeForwards; [arrow addAnimation:animation forKey:@"position"]; } 

Las aplicaciones iOS se ejecutan en un NSRunLoop. Cada NSRunLoop tiene diferentes modos de ejecución para diferentes tareas. Por ejemplo, el nstimer predeterminado está progtwigdo para ejecutarse bajo NSDefaultRunMode en NSRunLoop. Sin embargo, lo que esto significa es que ciertos UIEvents, siendo scrollviewing uno, interrumpirán el temporizador y lo colocarán en una cola para ejecutarse tan pronto como el evento deje de actualizarse. En su caso, para que no se interrumpa el temporizador, debe progtwigrlo para un modo diferente, a saber, NSRunLoopCommonModes, de la siguiente manera:

  self.myTimer = [NSTimer scheduledTimerWithTimeInterval:280 target:self selector:@selector(doStuff) userInfo:nil repeats:NO]; [[NSRunLoop currentRunLoop] addTimer:self.myTimer forMode:NSRunLoopCommonModes]; 

Este modo permitirá que su temporizador no se vea interrumpido por el desplazamiento. Puede encontrar más información sobre esta información aquí: https://developer.apple.com/documentation/foundation/nsrunloop En la parte inferior verá las definiciones de los modos que puede elegir. Además, según cuenta la leyenda, puedes escribir tus propios modos personalizados, pero pocos han vivido para contar la historia. Tengo miedo.