#ios #animation #core-animation #calayer #cashapelayer
#iOS #Анимация #ядро-анимация #calayer #слой cashapelayer
Вопрос:
Я поиграл с рисованием контура с использованием слоя CAShapeLayer, как описано в этой замечательной статье,http://oleb.net/blog/2010/12/animating-drawing-of-cgpath-with-cashapelayer , но мне интересно, есть ли способ анимировать заливку слоя.
Например, у меня есть некоторый текст, который я хочу нарисовать на экране, но я смог нарисовать только обводку текста, а не заливку. Другой пример, у меня есть форма звезды, в которой я хотел бы анимировать ее заполнение.
Возможно ли это с использованием CAShapeLayer или другого объекта?
Спасибо!
Комментарии:
1. Какой вид анимации вы имеете в виду? Движущийся штрих? Заполнение снизу вверх или слева направо? Перекрестный выцветший цвет?
Ответ №1:
Большую часть времени используется один и тот же код, вам просто нужно установить разные значения для fromValue
и toValue
для вашего CABasicAnimation
. Я создал категорию, которая возвращает мне CABasicAnimation
:
Анимация для завершения штриха
(CABasicAnimation *)animStrokeEndWithDuration:(CGFloat)dur
delegate:(id)target{
CABasicAnimation *animLine =
[CABasicAnimation animationWithKeyPath:@"strokeEnd"];
[animLine setDuration:dur];
[animLine setFromValue:[NSNumber numberWithFloat:0.0f]];
[animLine setToValue:[NSNumber numberWithFloat:1.0f]];
[animLine setRemovedOnCompletion:NO];
[animLine setFillMode:kCAFillModeBoth];
[animLine setDelegate:target];
[animLine setTimingFunction:
[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
return animLine;
}
Анимация для fillColor
(CABasicAnimation *)animFillColorWithDur:(CGFloat)dur
startCol:(UIColor *)start
endColor:(UIColor *)end
delegate:(id)target{
CABasicAnimation *animFill =
[CABasicAnimation animationWithKeyPath:@"fillColor"];
[animFill setDuration:dur];
[animFill setFromValue:(id)start.CGColor];
[animFill setToValue:(id)end.CGColor];
[animFill setRemovedOnCompletion:NO];
[animFill setDelegate:target];
[animFill setFillMode:kCAFillModeBoth];
return animFill;
}
Возвращаемое CABasicAnimation
просто должно быть добавлено в CAShapeLayer
:
[_myShapeLayer addAnimation:returnedAnimation forKey:@"animKey"]
Ответ №2:
Да, это возможно.
CAShapeLayers имеют свойство fillColor, которое можно анимировать.
Это работает так же, как изменение strokeEnd / strokeStart, как вы уже делали с вашей анимацией.