Как указать startTime для анимации с помощью CFTimeInterval?
Для моего понимания, beginTime можно использовать, чтобы сказать "эй, начните ровно с 12:00 часов". Но как я могу сказать это с помощью типа CFTimeInterval? Я думал, что это не что иное, как своего рода "плавающее" значение для указания секунд.
Или что еще было бы тогда разницей в свойстве timeOffset, указанном в протоколе CAMediaTiming?
Ответы
Ответ 1
То, что я пропустил в документах: beginTime находится в "абсолютном времени основной анимации", поэтому вы должны получить текущее время и указать свое смещение от этого:
// Start in 5 seconds
theAnimation.beginTime = CACurrentMediaTime()+5;
Ответ 2
Сначала вам нужно преобразовать время в слой следующим образом:
let currentLayerTime = myLayer.convertTime(CACurrentMediaTime(), from: nil)
После этого вы можете установить beginTime
относительно слоя Теперь время. Например, чтобы анимация начиналась в 2 с:
myAnimation.beginTime = currentLayerTime + 2
Вы также, вероятно, захотите установить fillMode
на .backwards
, чтобы вы могли установить окончательное значение свойства перед добавлением анимации:
myAnimation.fillMode = .backwards
myLayer.someProperty = someFinalValue
myLayer.addAnimation(myAnimation, forKey: "myAnimationName")
Ответ 3
Я думаю, что документация по протоколу CAMediaTiming очень плохая. Time Warp in Animation - подробное объяснение (повторная документация) всех свойств протокола CAMediaTiming.
Ответ 4
Нет, это не то, что beginTime делает. Он указывает относительное время начала из своей родительской анимации (по умолчанию несколько анимаций в группе все сразу срабатывают).
Из documentation:
Задает время начала приемник в отношении его родителя объект, если применимо.
timeOffset заставляет его запускать анимацию в фрейме, в котором он находился, в момент offSet, и когда он достигает конца, он обходит вокруг. Другими словами, представьте, что A, B, C, D, E являются кадрами анимации, это то, что происходит в разных случаях, если вы устанавливаете beginTime или timeOffset равным значению, когда вы попадаете в кадр C в нормальном случае.
Normal |A->B->C->D->E
beginTime: | A->B->C->D->E
timeOffset: |C->D->E->A->B