Подтвердить что ты не робот

Как указать startTime для анимации с помощью CFTimeInterval?

Для моего понимания, beginTime можно использовать, чтобы сказать "эй, начните ровно с 12:00 часов". Но как я могу сказать это с помощью типа CFTimeInterval? Я думал, что это не что иное, как своего рода "плавающее" значение для указания секунд.

Или что еще было бы тогда разницей в свойстве timeOffset, указанном в протоколе CAMediaTiming?

4b9b3361

Ответ 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