Ho avuto lo stesso problema e sono andato a Apple DTS per aiutare con una soluzione alternativa.
Come per DTS, questo effetto "sfarfallio" o effetto di snap-back è il comportamento previsto ... Ho pensato che stavo facendo qualcosa di sbagliato con il mio progetto per molto tempo.
In particolare, è in questo modo perché gli stati di documentazione, per
UIViewAnimationOptionAutoreverse Esegui l'animazione all'indietro e in avanti .
Deve essere combinato con l'opzione UIViewAnimationOptionRepeat.
Per far sparire il flicker, ho dovuto fare 2 cose.
La mia implementazione era dinamica, quindi potrebbe non essere necessario implementare il primo passaggio, ma lo terrò qui solo per riferimento.
In primo luogo, ho controllato per vedere se UIViewAnimationOptionAutoreverse
faceva parte delle opzioni che stavo per passare nel mio animazione e UIViewAnimationOptionRepeat
non ero ... Se è così, ho messo a nudo dalle opzioni aggiungendo una riga come:
animationOptions &= ~UIViewAnimationOptionAutoreverse;
Per creare l'animazione di inversione senza ripetere, ho aggiunto un'animazione UIView opposta come blocco di completamento. Ho anche invertito l'allentamento se era o UIViewAnimationOptionCurveEaseIn
o UIViewAnimationOptionCurveEaseOut
...
Il codice dal mio progetto segue:
L'affermazione che mette a nudo l'opzione autoreverse da animationOptions di un oggetto:
if ((animationOptions & AUTOREVERSE) == AUTOREVERSE) {
self.shouldAutoreverse = YES;
animationOptions &= ~AUTOREVERSE;
}
An esempio di un setter di proprietà sovrascritto che gestisce un'animazione:
-(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];
}
Il metodo di completamento richiesto in t caso di inversione senza ripetere:
-(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];
}
Ancora non risolto, ma ho trovato un lavoro in giro. Uso l'opzione UIViewAnimationOptionRepeat e rimuovo completamente il blocco di completamento. – brianpartridge