Используйте взамен CADisplayLink. Работает так же, как NSTimer, но срабатывает ровно один раз за каждый кадр и будет идеально синхронизироваться с анимацией.
Вот как вы его настроили:
self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(step)];
[link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
Ваш код анимации
- (void)step
{
//do something related to your animation
}
Затем, когда анимация заканчивается
[self.displayLink invalidate];
self.displayLink = nil;