Мерцание анимации UIView с автореверсом - PullRequest
7 голосов
/ 18 сентября 2011

Я пытаюсь анимировать индикатор в пустое поле формы, поэтому я использую метод ниже, чтобы анимировать позицию, повернуть анимацию и повторить. В симуляторе это работает нормально, на моем 3GS похоже, что при вызове блока завершения есть мерцание. Индикатор кратко отображается в средней позиции, а не назад в его начале.

Есть мысли о том, почему это происходит? Спасибо.

- (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];
                     }];
}

1 Ответ

13 голосов
/ 17 июля 2012

У меня была такая же проблема, и я пошел в 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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...