Наблюдение за изменениями анимированных свойств в CALayer - PullRequest
27 голосов
/ 13 октября 2009

У меня есть CABasicAnimation, который анимирует свойство CALayer, например. bounds.origin. Я хочу иметь возможность наблюдать изменение свойства с течением времени, но на самом деле не нашел метод, который работает на 100%.

  1. Я пытался использовать KVO (наблюдение значения ключа) на bounds.origin * *1009* ключе. Система жалуется, что объект освобождается до освобождения его наблюдателей, что заставляет меня думать, что уровень представления является только временным. Наблюдение presentationLayer.bounds.origin как траектории не работает.

  2. Я попытался создать свойство на другом слое и анимировать его, например, объявив @property и сделав его @dynamic на этом слое. Однако это новое свойство изменяется только при доступе к слою презентации (например, в конце анимации), оно не обновляется во время работы анимации.

  3. Я использовал needsDisplayForKey для свойства в # 2, которое вызывает обновления во время анимации, но для следующих проблем:

    • работает только если CALayer имеет ненулевой кадр. Поскольку этот слой может быть CAShapeLayer или подклассом, он может иметь нулевой кадр.
    • похоже, что он запускает setNeedsDisplay для этого слоя, но поскольку я на самом деле не рисую этот слой, только отслеживая изменение свойства, я не хочу, чтобы он перерисовывался.
  4. Я попытался запланировать NSTimer, а в образце обратного вызова таймера - presentationLayer. Это также работает, но для этих проблем:

    • Таймер, вероятно, будет немного не синхронизирован с обновлением анимации.
    • Поскольку иногда исходная анимация вытесняется другой анимацией, трудно заставить таймер срабатывать, когда анимация запущена и только когда анимация запущена.

Есть предложения? Все это будет на iPhoneOS 3.0 / 3.1.

Ответы [ 2 ]

5 голосов
/ 17 декабря 2015

Попробуйте использовать CADisplayLink, который предназначен для синхронизации с циклом анимации. Дополнительная информация: https://ashfurrow.com/blog/animating-views-with-cadisplaylink/

5 голосов
/ 13 октября 2009

Я думаю, что вы назвали все возможности. На самом деле, я даже не знал о № 2 и № 3, и я написал книгу о базовой анимации . ; -)

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

Во всяком случае, я считаю NSTimer наиболее надежным подходом, но теперь я не уверен в том, что вы сказали. Что заставляет вас думать, что таймер не синхронизирован? Почему трудно заставить таймер срабатывать только во время анимации? Разве вы не можете просто проверить условие, которое вы хотите в обратном вызове таймера, а затем ничего не делать, если условие не выполняется?

С наилучшими пожеланиями.

...