1

При анимации CAShapeLayer необходимо постоянно обновлять путь к слою или есть ли способ полагаться только на CABasicAnimation?CAShapeLayer Анимация без обновления пути

В приведенном ниже примере я установил четыре круга и нарисовал их. Тогда я хочу оживить их, чтобы исчезнуть. Однако после того, как анимация завершилась, они возвращаются к исходным дорожкам.

int radius = halfWidth-30; //the radius is the distance out from the centre 
    trackActive.path = [UIBezierPath bezierPathWithArcCenter:cicleCenter radius:radius startAngle:degreesToRadians(circleStart) endAngle:degreesToRadians(circleEnd) clockwise:true].CGPath; 
    circleActive.path = [UIBezierPath bezierPathWithArcCenter:cicleCenter radius:radius startAngle:degreesToRadians(circleStart) endAngle:degreesToRadians(circleEnd) clockwise:true].CGPath; 

    radius = halfWidth - 10; 
    trackNew.path = [UIBezierPath bezierPathWithArcCenter:cicleCenter radius:radius startAngle:degreesToRadians(circleStart) endAngle:degreesToRadians(circleEnd) clockwise:true].CGPath; 
    circleNew.path = [UIBezierPath bezierPathWithArcCenter:cicleCenter radius:radius startAngle:degreesToRadians(circleStart) endAngle:degreesToRadians(circleEnd) clockwise:true].CGPath; 

    NSArray * layers = @[trackActive, circleActive, trackNew, circleNew]; 
    for (CAShapeLayer * layer in layers){ 

     [CATransaction begin]; 
     CABasicAnimation * animation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"]; 
     animation.duration = 1.0f; 
     animation.removedOnCompletion = false; 
     animation.fromValue = @(1.0); 
     animation.toValue = @(0.0); 
     animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
     [layer addAnimation:animation forKey:@"circleAnimation"]; 

     [CATransaction commit]; 
    } 

Я понимаю, что я могу добавить к этому, чтобы установить новый путь:

[CATransaction setCompletionBlock:^{ 

     //set the new path 
     layer.path = [UIBezierPath bezierPathWithArcCenter:cicleCenter radius:radius startAngle:degreesToRadians(circleStart) endAngle:degreesToRadians(arcEnd) clockwise:true].CGPath; 

    }]; 

Но предпочел бы избежать необходимости держать обновление пути, и вместо того, чтобы полагаться на анимацию слое исключительно. Это возможно?

Нечто вроде: layer.path = animation.path или animation.updatesOriginalPath = true; может быть желаемое за действительное, не уверен.

+1

Вы можете опустить эффект пружины, установив strokeEnd слоя на ноль, поскольку анимация не изменяет состояние слоя. – clemens

ответ

1

You может упростить код и опустить пружинный эффект:

[CATransaction begin]; 
[CATransaction setAnimationDuration:1.0]; 
[CATransaction setAnimationTimingFunction: kCAMediaTimingFunctionEaseInEaseOut]; 
layer.strokeEnd = 0.0; 
[CATransaction commit]; 

сделка будет создавать и добавлять неявный объект анимации для вас.

0

Вы можете установить флаг в анимации, так что остается там, где он был в конце концов и начинается там, где он должен начать так:

[animation setRemovedOnCompletion:NO]; 
[animation setFillMode:kCAFillModeBoth]; 

также проверить этот ответ: What exactly does removedOnCompletion = NO do?

+1

Вам следует избегать анимации на слоях. Удаление или замена анимации позже приведет к _unexpected_ эффектам. Значение 'layer.strokeEnd = 0.0' перед' addAnimation' будет иметь тот же эффект. – clemens

+0

Другим недостатком сохранения анимации является то, что слой не отражает его видимое состояние. Он всегда возвращает 1.0 для 'strokeEnd', но отображает значение 0.0. – clemens

 Смежные вопросы

  • Нет связанных вопросов^_^