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 UIViewAnimationOptionRepeat
no 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];
}
Todavía no resuelto, pero encontré una alternativa. Uso la opción UIViewAnimationOptionRepeat y elimino el bloque de finalización por completo. – brianpartridge