В другом тесте 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), и мерцание было более заметным и более очевидным в отношении того, что я вижу. Это была последовательность событий:
Похоже, что мерцание, которое я вижу, - это шаг 4.
Править 22 марта
Я только что загрузил на GitHub демонстрационный проект, демонстрирующий перемещение объекта по траектории Безье. Код можно найти на PathMove
Я также писал об этом в своем блоге на Перемещение объектов по пути Безье в iOS