Переключение CABasicAnimation на свойство позиции в середине анимации вызывает мерцание - PullRequest
4 голосов
/ 09 июля 2009

У меня есть код, который использует CALayers, чтобы пузыри текли снизу вверх. Если пользователь касается экрана, у меня есть некоторый код, который заменяет текущую анимацию на ту, у которой есть toPoint, где палец касался. Когда анимация переключается, это вызывает мерцание на устройстве (не на симуляторе). Любые советы по устранению мерцания будет принята с благодарностью! Спасибо.

Код для пузырьков, вытекающих внутри самого слоя:

CABasicAnimation *animation = [CABasicAnimationanimationWithKeyPath:@"position"];
[animation setDelegate:self];
CGPoint position = [self position];
NSValue *prevVal = [NSValue valueWithCGPoint:position];
[animation setFromValue:prevVal];
CGPoint toPoint = CGPointMake(position.x,-100);
[animation setToValue:[NSValue valueWithCGPoint:toPoint]];
[animation setDuration:animationDuration];
[self addAnimation:animation forKey:@"flow"];

Код для привлечения ближайших пузырьков к точке касания, написанный в суперслое:

int count = [self.layer.sublayers count];
for(int i = 0; i < count ; i++) {
   CALayer *layer= [self.layer.sublayers objectAtIndex:i];
   CALayer *p = (CALayer*)[layer presentationLayer];
   CGPoint position = [p position];

   if(abs(position.x - touchPoint.x) < 100 && abs(position.y - touchPoint.y) < 100) {

    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
    [animation setDelegate:self];
    NSValue *prevVal = [NSValue valueWithCGPoint:position];
    [animation setFromValue:prevVal];
    [animation setToValue:[NSValue valueWithCGPoint:touchPoint]];
    [animation setDuration:2.0];
    [animation setTimingFunction:[CAMediaTimingFunction  
            functionWithName:kCAMediaTimingFunctionEaseOut]];
    [layer addAnimation:animation forKey:@"flow"];
   }        

}

1 Ответ

5 голосов
/ 13 июля 2010

Попробуйте использовать блокировку CATransaction вокруг ваших обновлений, чтобы посмотреть, поможет ли это. Это не позволит предыдущим анимациям изменять положение слоев во время их обновления новыми анимациями.

В вашем методе обработки касаний оберните анимацию в транзакции и заблокируйте:

[CATransaction lock];
[CATransaction begin];

// update the sublayers with new animations

[CATransaction commit];
[CATransaction unlock];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...