Как оживить рисунок CGPath?

Мне интересно, есть ли способ сделать это, используя Core Animation. В частности, я добавляю подслой к пользовательскому NSView с поддержкой слоев и устанавливаю его делегат в другой пользовательский NSView. Этот метод drawInRect класса использует одиночный CGPath:

- (void)drawInRect:(CGRect)rect inContext:(CGContextRef)context
{
    CGContextSaveGState(context);
    CGContextSetLineWidth(context, 12);

    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, NULL, 0, 0);
    CGPathAddLineToPoint(path, NULL, rect.size.width, rect.size.height);

    CGContextBeginPath(context);
    CGContextAddPath(context, path);
    CGContextStrokePath(context);
    CGContextRestoreGState(context);
}

Моим желаемым эффектом было бы оживить рисование этой строки. То есть, я бы хотел, чтобы линия фактически "растягивалась" анимированным образом. Похоже, что это будет простой способ сделать это с помощью Core Animation, но я не смог найти никого.

Есть ли у вас какие-либо предложения относительно того, как я мог бы достичь этой цели?

Ответ 1

Конечно, не рисуй линию самостоятельно. Добавьте подуровень с 12 пикселями с плоским фоном, начиная с кадра нулевой ширины и анимируя до ширины вашего представления. Если вам нужны закругленные концы, установите уровень cornerRadius на половину высоты.

Ответ 2

Я нашел этот пример анимированных путей и хотел поделиться им для всех, кто ищет, как это сделать, с некоторыми примерами кода.

Вы будете использовать CAShapeLayer strokeStart и strokeEnd, для чего требуется sdk 4.2, поэтому, если вы ищете поддержку старых SDK для iOS, к сожалению, это не то, что вы хотите.

Действительно хорошая вещь об этих свойствах заключается в том, что они являются анимированными. Анимируя strokeEnd от 0.0 до 1.0 в течение нескольких секунд, мы можем легко отобразить путь по мере его рисования:

CABasicAnimation *pathAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
pathAnimation.duration = 10.0;
pathAnimation.fromValue = [NSNumber numberWithFloat:0.0f];
pathAnimation.toValue = [NSNumber numberWithFloat:1.0f];
[self.pathLayer addAnimation:pathAnimation forKey:@"strokeEndAnimation"];

Наконец, добавьте второй слой, содержащий изображение пера, и используйте CAKeyframeAnimation для анимации по пути с той же скоростью чтобы сделать иллюзию совершенной:

CAKeyframeAnimation *penAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
penAnimation.duration = 10.0;
penAnimation.path = self.pathLayer.path;
penAnimation.calculationMode = kCAAnimationPaced;
[self.penLayer addAnimation:penAnimation forKey:@"penAnimation"];

Какой источник можно просмотреть здесь и демонстрационное видео здесь. Прочтите создателей blog для получения дополнительной информации.