2011-09-18 765 views
6

Estoy tratando de animar un indicador a un campo de formulario vacío, así que estoy usando el siguiente método para animar a una posición, invertir la animación y repetir. En el simulador funciona bien, en mi 3GS parece que hay un parpadeo justo cuando se llama al bloque de finalización. El indicador se muestra brevemente en la posición del medio en lugar de volver a su origen.Animación UIView parpadeando con autoreverse

¿Alguna idea de por qué sucede esto? Gracias.

- (void)bounceFormIndicator { 
    if (formIndicator.superview == nil) { 
     return; 
    } 

    int bounceDistance = 24; 

    [UIView animateWithDuration:0.6 
          delay:0 
         options:UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAutoreverse | UIViewAnimationOptionAllowUserInteraction 
        animations:^{ 
         CGRect indicatorFrame = formIndicator.frame; 
         indicatorFrame.origin.x += bounceDistance; 
         formIndicator.frame = indicatorFrame; 
        }completion:^(BOOL finished){ 
         CGRect indicatorFrame = formIndicator.frame; 
         indicatorFrame.origin.x -= bounceDistance; 
         formIndicator.frame = indicatorFrame; 
         [self bounceFormIndicator]; 
        }]; 
} 
+0

Todavía no resuelto, pero encontré una alternativa. Uso la opción UIViewAnimationOptionRepeat y elimino el bloque de finalización por completo. – brianpartridge

Respuesta

13

que tenían el mismo problema, y ​​se fue a Apple DTS para ayudar con una solución.

Según DTS, este efecto de "parpadeo" o efecto de retroceso es el comportamiento esperado ... Pensé que estaba haciendo algo mal con mi proyecto durante mucho tiempo.

En particular, es de esta manera porque los estados de documentación, para

UIViewAnimationOptionAutoreverse Ejecutar la animación hacia atrás y hacia delante .

Se debe combinar con la opción UIViewAnimationOptionRepeat.

Para que el parpadeo desaparezca, tuve que hacer 2 cosas.

Mi implementación fue dinámica, por lo que quizás no tenga que implementar el primer paso, pero lo mantendré aquí solo como referencia.

En primer lugar, he comprobado para ver si UIViewAnimationOptionAutoreverse era parte de las opciones que iba a pasar a mi animación, y UIViewAnimationOptionRepeatno estaba ... Si es así, me despojó de las opciones mediante la adición de una línea como:

animationOptions &= ~UIViewAnimationOptionAutoreverse; 

para crear la animación de marcha atrás sin repetir, añadí una animación UIView opuesto como mi bloque finalización. También invirtió el alivio si era o UIViewAnimationOptionCurveEaseIn o UIViewAnimationOptionCurveEaseOut ...

El código de mi proyecto sigue:

La afirmación de que despoja a la opción de autoreverse animationOptions de un objeto:

if ((animationOptions & AUTOREVERSE) == AUTOREVERSE) { 
    self.shouldAutoreverse = YES; 
    animationOptions &= ~AUTOREVERSE; 
} 

Un ejemplo de un organizador de propiedades anulado que maneja una animación:

-(void)setCenter:(CGPoint)center { 
    CGPoint oldCenter = CGPointMake(self.center.x, self.center.y); 

    void (^animationBlock) (void) =^{ super.center = center; }; 
    void (^completionBlock) (BOOL) = nil; 

    BOOL animationShouldNotRepeat = (self.animationOptions & REPEAT) != REPEAT; 
    if(self.shouldAutoreverse && animationShouldNotRepeat) { 
     completionBlock =^(BOOL animationIsComplete) { 
      [self autoreverseAnimation:^ { super.center = oldCenter;}]; 
     }; 
    } 
    [self animateWithBlock:animationBlock completion:completionBlock]; 
} 

El método de finalización que se solicita en t El caso de revertir sin repetir:

-(void)autoreverseAnimation:(void (^)(void))animationBlock { 
     C4AnimationOptions autoreverseOptions = BEGINCURRENT; 
     if((self.animationOptions & LINEAR) == LINEAR) autoreverseOptions |= LINEAR; 
     else if((self.animationOptions & EASEIN) == EASEIN) autoreverseOptions |= EASEOUT; 
     else if((self.animationOptions & EASEOUT) == EASEOUT) autoreverseOptions |= EASEIN; 

     [UIView animateWithDuration:self.animationDuration 
           delay:0 
          options:autoreverseOptions 
         animations:animationBlock 
         completion:nil]; 
} 
Cuestiones relacionadas