iOS CAKeyFrameAnimation Scaling Flickers в конце анимации

В другом тесте Key Кадровая анимация Я комбинирую перемещение UIImageView (называемого theImage ) по траектории Безье и увеличение его масштабирования по мере его перемещения, в результате чего изображение в конце пути увеличивается в 2 раза. В моем исходном коде для этого эти элементы в нем, чтобы запустить анимацию:

UIImageView* theImage = ....
float scaleFactor = 2.0;
....

theImage.center = destination;
theImage.transform = CGAffineTransformMakeScale(1.0,1.0);

CABasicAnimation *resizeAnimation = [CABasicAnimation animationWithKeyPath:@"bounds.size"];
[resizeAnimation setToValue:[NSValue valueWithCGSize:CGSizeMake(theImage.image.size.height*scaleFactor, theImage.image.size.width*scaleFactor)]];
resizeAnimation.fillMode = kCAFillModeBackwards;
resizeAnimation.removedOnCompletion = NO;  

CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
pathAnimation.path = [jdPath path].CGPath;
pathAnimation.fillMode = kCAFillModeBackwards;
pathAnimation.removedOnCompletion = NO;

CAAnimationGroup* group = [CAAnimationGroup animation];
group.animations = [NSArray arrayWithObjects:pathAnimation, resizeAnimation, nil];
group.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
group.removedOnCompletion = NO;
group.duration = duration;
group.delegate = self;

[theImage.layer addAnimation:group forKey:@"animateImage"];

Затем, когда анимация завершится, я хочу сохранить изображение в большем размере, поэтому я реализую:

- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag
{
   theImage.transform = CGAffineTransformMakeScale(scaleFactor,scaleFactor);
}

Все это работает ... вроде как. Проблема в том, что при конец анимации theImage мерцает на короткое время - ровно настолько, чтобы это выглядело плохо. Я предполагаю, что это - это переход в конце анимации, где я установил преобразование в новый размер.

Поэкспериментировав с этим, я попробовал немного другую форму описанного выше, но мерцание все равно осталось:

CAKeyframeAnimation *resizeAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform"];
NSValue* startSizeKey = [NSValue valueWithCATransform3D:CATransform3DScale (theImage.layer.transform, 1.0, 1.0, 1.0)];
NSValue* endSizeKey = [NSValue valueWithCATransform3D:CATransform3DScale (theImage.layer.transform, scaleFactor, scaleFactor, 1.0)]; 
NSArray* sizeKeys = [NSArray arrayWithObjects:startSizeKey, endSizeKey, nil];
[resizeAnimation setValues:sizeKeys];

....

theImage.transform = CGAffineTransformMakeScale(scaleFactor,scaleFactor);

Но когда я закончил анимацию с тем же размером, что и оригинал, мерцания НЕ было:

CAKeyframeAnimation *resizeAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform"];
NSValue* startSizeKey = [NSValue valueWithCATransform3D:CATransform3DScale (theImage.layer.transform, 1.0, 1.0, 1.0)];
NSValue* middleSizeKey = [NSValue valueWithCATransform3D:CATransform3DScale (theImage.layer.transform, scaleFactor, scaleFactor, 1.0)];
NSValue* endSizeKey = [NSValue valueWithCATransform3D:CATransform3DScale (theImage.layer.transform, 1.0, 1.0, 1.0)]; 
NSArray* sizeKeys = [NSArray arrayWithObjects:startSizeKey, middleSizeKey, endSizeKey, nil];
[resizeAnimation setValues:sizeKeys];

....

theImage.transform = CGAffineTransformMakeScale(1.0,1.0);

Итак Мой большой вопрос: как я могу оживить это изображение без мерцания и получить другой размер в конце анимации?


Редактировать 2 марта

Мои первоначальные тесты были с увеличением изображения. Я просто попытался уменьшить масштаб (IE scaleFactor = 0.4), и мерцание было более заметным и более очевидным в отношении того, что я вижу. Это была последовательность событий:

  1. Изображение исходного размера отображается на экране в начальной точке.
  2. По мере того, как изображение перемещается по траектории, оно плавно сжимается.
  3. Полностью сжатое изображение появляется в конце пути.
  4. Изображение будет восстановлено до исходного размера.
  5. Изображение наконец нарисовано в уменьшенном размере.

Похоже, что мерцание, которое я вижу, - это шаг 4.


Править 22 марта

Я только что загрузил на GitHub демонстрационный проект, демонстрирующий перемещение объекта по траектории Безье. Код можно найти на PathMove

Я также писал об этом в своем блоге на Перемещение объектов по пути Безье в iOS

6
задан Peter M 22 March 2012 в 19:38
поделиться