CABasicAnimation – изменить начальное значение анимации во время паузы

Чтобы повернуть круг в 360, я использую CABasicAnimation, таким образом:

func startRotate(from : Double) { let rotation : CABasicAnimation = CABasicAnimation(keyPath: "transform.rotation.z") rotation.fromValue = from rotation.toValue = NSNumber(value: M_PI * 2 - from) rotation.duration = 10 rotation.isCumulative = true rotation.repeatCount = 1 self.cdImage.layer.add(rotation, forKey: "rotationAnimation") } 

В первый раз cdImage (view) начинается со значения 0.

Когда анимация прибыла в середину (через 5 секунд), я хочу остановить анимацию и установить преобразование для представления cdImage, например, вернуть вид на 20 градусов назад и возобновить его с новой позиции.

следующим образом: 1. Я вызываю функцию stopRotate

 func stopRotate(from : Double) { self.cdImage.layer.removeAnimation(forKey: "rotationAnimation") } 
  1. Я установил новое преобразование

     self.cdImage.transform = CGAffineTransform(rotationAngle: imageAngle * CGFloat(M_PI) / 180); 
  2. вызвать startRotate с новым значением

    startRotate (imageAngle * CGFloat (M_PI) / 180)

Я полагаю, что анимация начнется с новой позиции и снова повернет представление в 360 градусов, но на самом деле анимация начнет круг с 0 градусов, как я могу возобновить новую анимацию с новой позиции?

Если вы хотите забрать с того места, где вы остановились, когда вы остановите анимацию, вы хотите:

  • захватить, сколько он повернул (см. https://stackoverflow.com/a/9712319/1271826 );
  • определить значение в полете, исследуя уровень представления;
  • соответственно установите transform слоя (чтобы он оставался там, когда вы удаляете анимацию); а также
  • удалить анимацию

Таким образом:

 var angle: CGFloat? func stopRotate() { let transform = cdImage.layer.presentation()!.transform angle = atan2(transform.m12, transform.m11); cdImage.layer.transform = transform cdImage.layer.removeAnimation(forKey: "rotationAnimation") } 

Затем вы можете запустить анимацию с этого angle при ее перезапуске.