Я хочу установить свойство strokeEnd
для CAShapeLayer
без анимации по умолчанию, без анимации вообще. Я посмотрел вокруг, чтобы попытаться найти, как это сделать, но все, кажется, связано с тем, как оживить свойства.
Изменение 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]};