Когда CALayer.timeOffset готов к использованию

Нужна помощь с расширенной проблемой CALayer.

У меня есть UIView, который добавляет CAShapeLayer. Слой приостановлен (скорость = 0), и к нему прикреплена анимация, которой я хочу управлять вручную.

Очень похоже на здесь: Tweening/Интерполяция между двумя CGPaths/UIBeziers - кроме моего view — это ячейка представления коллекции.

Все работает, как и ожидалось, за исключением того, что я не хочу начинать с позиции 0. Каждая ячейка может начинаться с другой позиции в анимации.

Когда представление коллекции запрашивает мое представление, я пытаюсь настроить layer.timeOffset, скажем, на 0,5, а не на 0. Это не работает, и я перепробовал все обратные вызовы View и Layer и делегирования, которые смог найти.

Единственный обходной путь, который я нашел, был в: dequeueReusableCellWithIdentifier вместо установки cellView.subLayer.timeOffset = 0.5; я отправляю обновление позже:

dispatch_after(main_queue, a bit later, ^{
  cellView.subLayer.timeOffset = 0.5
});

Итак, мой вопрос в том, что эквивалентно viewDidLoad для слоев/анимаций. Когда действительно сработает вызов timeOffset для слоя?

У кого-нибудь была эта проблема?


person Bogdan Balan    schedule 29.07.2017    source источник
comment
Пожалуйста, отформатируйте правильно.   -  person matt    schedule 30.07.2017


Ответы (1)


Нашел несколько (вероятно, неверных) решений, манипулируя начальным timeOffset анимации.

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

Это означает, что кода немного больше, но, по крайней мере, он правильный. Слой и синхронизация мультимедиа сложны. Лучшие статьи, которые я нашел на нем, находятся здесь:

Если вам нужно это сделать, я настоятельно рекомендую приостановить и возобновить слой, как рекомендует Apple:

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

person Bogdan Balan    schedule 29.07.2017
comment
Пожалуйста, отформатируйте правильно. Обратите внимание, что через 48 часов после публикации вы можете принять свой собственный ответ (и вы должны это сделать). - person matt; 30.07.2017
comment
Хотя я не очень рад сообщить вам, что, как вы говорите, похоже, есть ошибка с timeOffset. Вы должны принять этот ответ и подать радар - person agibson007; 15.08.2017
comment
Я обнаружил, что если вы установите beginTime анимации, она будет доступна быстрее. - person agibson007; 15.08.2017