У меня была такая же проблема, и я пошел в Apple DTS, чтобы помочь с обходным решением.
Что касается DTS, то этот «мерцающий» эффект или эффект мгновенного возврата является ожидаемым поведением ... Я думал, что долго делал что-то не так с моим проектом.
В частности, именно так, потому что в документации говорится, для
UIViewAnimationOptionAutoreverse Запустить анимацию назад и
вперед.
Должен быть объединен с опцией UIViewAnimationOptionRepeat.
Чтобы убрать мерцание, мне пришлось сделать 2 вещи.
Моя реализация была динамичной, поэтому вам, возможно, не придется реализовывать первый шаг, но я оставлю ее здесь только для справки.
Сначала я проверил, является ли UIViewAnimationOptionAutoreverse
частью опций, которые я собирался передать в свою анимацию, и UIViewAnimationOptionRepeat
не был ... Если так, я снял его с варианты, добавив строку, как:
animationOptions &= ~UIViewAnimationOptionAutoreverse;
Чтобы создать реверсивную анимацию без повторения, я добавил противоположную анимацию UIView в качестве блока завершения. Я также инвертировал замедление, если оно было UIViewAnimationOptionCurveEaseIn
или UIViewAnimationOptionCurveEaseOut
...
Следующий код из моего проекта:
Оператор, который удаляет опцию автореверса из объекта animationOptions:
if ((animationOptions & AUTOREVERSE) == AUTOREVERSE) {
self.shouldAutoreverse = YES;
animationOptions &= ~AUTOREVERSE;
}
Пример переопределенного установщика свойств, который обрабатывает анимацию:
-(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];
}
Метод завершения, который требуется в случае обращения без повторения:
-(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];
}