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

Наблюдение изменений анимированных свойств в CALayer

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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