Изменение CAShapeLayer без анимации

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

Ответ 1

В терминологии Core Animations более общим термином для анимации является "действие". Например, вы можете видеть, что CAAnimation соответствует протоколу CAAction. Вы также видите терминологию "действие", используемую при их отключении (отключение анимации).

Существует много разных способов изменения действий слоя. Многие из них хорошо документированы в обсуждении документации actionForKey: на CALayer (выдержка из ниже). Некоторые из них более актуальны при подклассификации (и вы также можете переопределить actionForKey: в своем подклассе, чтобы добавить больше неявных действий для новых ключей.

Этот метод ищет связанные с слоями действия в следующем порядке:

  • Если на слое есть делегат, и этот делегат реализует метод доступа к фильтрам слоев, слой вызывает этот метод. Делегат должен выполнить одно из следующих действий:
    • Возвращает объект действия для данного ключа.
    • Возвращает nil, если он не обрабатывает действие.
    • Возвращает объект NSNull, если он не обрабатывает действие, и поиск должен быть завершен.
  • Слой выглядит в слоях actions.
  • Слой выглядит в словаре стиля для словаря действий, содержащего ключ.
  • Слой вызывает метод `defaultActionForKey: ', чтобы искать любые действия, определенные определенным классом.
  • Слой ищет любые неявные действия, определенные Core Animation.

Два способа, которые наиболее интересны, когда вы хотите отключить анимацию (два разных, потому что они используются для немного разных вещей):

  • Отключение действий с помощью CATransaction (не упомянуто выше)
  • Настройка [NSNull null] для ключа @"strokeEnd" в словаре действий (номер 2 выше)

Отключение действий

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

[CATransaction begin];
[CATransaction setDisableActions:YES];
// change your property here 
yourShapeLayer.strokeEnd = 0.7;
[CATransaction commit]; // animations are disabled until here...

Изменение словаря действий

Вы можете навсегда изменить анимацию по умолчанию для одного или нескольких ключей, изменив словарь действий слоев. Установка [NSNull null] означает, что анимации не должно быть и что слой должен перестать искать в другом месте для анимации по умолчанию. Вы также можете использовать это для добавления анимационных свойств. Удаление анимации с помощью словаря действия выглядит примерно так:

yourShapeLayer.actions = @{@"strokeEnd": [NSNull null]};
yourShapeLayer.strokeEnd = 0.7; // this won't have an animation

Ответ 2

Вы можете сделать что-то вроде следующего:

NSDictionary *actions = @{@"strokeEnd": [NSNull null]};
yourShapeLayer.actions = actions;

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

NSDictionary *actions = @{@"strokeEnd": [NSNull null], @"position": [NSNull null], @"position": [NSNull null]};