Cómo realizar un seguimiento de la animation en las animaciones iOS UIView

[UIView beginAnimations:nil context:NULL]; // animate the following: gearKnob.center = startedAtPoint; [UIView setAnimationDuration:0.3]; [UIView commitAnimations]; 

Esta es la animation, que mueve UIImageView (gearKnob) de un punto a otro. El problema es que cuando el object se está moviendo, necesito cambiar el background en consecuencia, así que necesito rastrear cada position de UIImageView cuando se está moviendo. ¿Cómo puedo rastrear su position? ¿Hay algún método o delegado para hacer eso?

Si realmente tiene que hacerlo, aquí hay una manera eficiente de hacerlo. El truco es usar un timer CADisplayLink y leer la propiedad animada desde layer.presentationLayer.

 @interface MyViewController () ... @property(nonatomic, strong) CADisplayLink *displayLink; ... @end @implementation MyViewController { - (void)animateGearKnob { // invalidate any pending timer [self.displayLink invalidate]; // create a timer that's synchronized with the refresh rate of the display self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(updateDuringAnimation)]; [self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; // launch the animation [UIView animateWithDuration:0.3 delay:0 options:0 animations:^{ gearKnob.center = startedAtPoint; } completion:^(BOOL finished) { // terminate the timer when the animation is complete [self.displayLink invalidate]; self.displayLink = nil; }]; } - (void)updateDuringAnimation { // Do something with gearKnob.layer.presentationLayer.center } } 

Como escribió David, probablemente sea mejor ejecutar una segunda animation en paralelo.

Si necesita pseudo-animar algo con un timer, puede probar CPAccelerationTimer , que le permite establecer una curva de time Bézier para las devoluciones de llamada.

Si realmente debes hacerlo, deberías poder observar valores key en gearKnob.layer.presentationLayer.center . La capa devuelta por – [CALayer presentationLayer] es "una aproximación aproximada de la capa que se muestra actualmente en la pantalla. Mientras una animation está en progreso, puede recuperar este object y usarlo para get los valores actuales para esas animaciones ".

no puede usar la animation directa en ese caso. Debe usar su propio timer y mover el mando: NSTimer timerWithTimeInterval: y en el selector, mueva el mando y obtenga la position