Какой самый простой способ оживить линию? - PullRequest
6 голосов
/ 21 июля 2011

Я создаю приложение, которое включает в себя анимацию линий в рабочем пространстве с течением времени. Мой текущий подход для этого заключается в использовании кода, подобного этому, в drawRect:

CGContextSetStrokeColor(context, black);
CGContextBeginPath(context);
CGContextMoveToPoint(context, startPoint.x, startPoint.y);
CGContextAddLineToPoint(context, finalPoint.x, finalPoint.y);
CGContextStrokePath(context);

... а затем просто установите таймер для запуска каждые 0,05 секунды для обновления finalPoint и вызова setNeedsDisplay.

Я считаю, что этот подход (при одновременном перемещении 5-ти строк) очень сильно замедляет работу приложения, и даже при такой высокой частоте обновления он все равно выглядит прерывистым.

Должен быть какой-то лучший способ выполнить это очень простое рисование линий в анимированной линии - то есть сказать, что я хочу, чтобы линия начиналась с x1, y1 и растягивалась до x2, y2 в течение заданного промежутка времени. Какие у меня есть варианты для этого? Мне нужно сделать это быстрее, и я бы хотел избавиться от этого неуклюжего таймера.

Спасибо!

1 Ответ

5 голосов
/ 25 февраля 2012

Используйте CAShapeLayers и комбинацию CATransactions и CABasicAnimation.

Вы можете добавить заданный путь к shapeLayer и позволить ему выполнять рендеринг.

Объект CAShapeLayer имеет два свойства с именами strokeStart и strokeEnd, которые определяют, где вдоль пути должен отображаться конец строки. Значения по умолчанию: 0,0 для strokeStart и 1,0 для strokeEnd.

Если вы настроите свой путь так, чтобы strokeEnd изначально начинался с 0.0, вы не увидите никакой строки.

Затем вы можете анимировать от 0,0 до 1,0 свойство strokeEnd, и вы увидите удлинение линии.

Чтобы изменить неявное время анимации CAShapeLayer по умолчанию на 0,25 с, вы можете добавить в класс функцию, например, так:

-(void)animateStrokeEnd:(CGFloat)_strokeEnd {
    [CATransaction begin];
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:keyPath];
    animation.duration = 2.0f; //or however long you want it to happen
    animation.fromValue = [NSNumber numberWithFloat:self.strokeEnd]; // from the current strokeEnd value
    animation.toValue = [NSNumber numberWithFloat:_strokeEnd]; //to the end of the path
    [CATransaction setCompletionBlock:^{ self.strokeEnd = _strokeEnd }];
    [self addAnimation:animation forKey:@"animateStrokeEnd"];
    [CATransaction commit];
}

Вы можете передать любое значение от 0.0f до 1.0f как значение _strokeEnd.

setCompletionBlock: гарантирует, что передаваемое вами значение будет явно установлено после завершения анимации.

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