Действия слоев Core Animation

Cocoa

Действия слоя вызываются в ответ на: вставку и удаление слоя из дерева слоев, в значение свойства слоя вносятся изменения, или посылается запрос приложению. Как правило, действие вызывает результате отображение анимации.

Роль объектов действий

Объект действия является объектом, который реагирует на действия идентификатора через CAAction протокол. Идентификаторы действия именуются с использованием стандартных разделенных точками ключевых путей. Слой отвечает за отображение идентификатора действия на соответствующий объект действия. Когда объекта действия для идентификатора размещается, этот объект посылает сообщение определяемое CAAction протоколом.

CALayer класс обеспечивает объектам-экземплярам CAAnimation действия по умолчанию, совместимые с протоколом CAAction класса для всех анимационных свойств слоя. CALayer также определяет следующие триггеры действий, которые не связаны непосредственно со свойствами, а также действия идентификаторов, приведенных в таблице 1.

Таблица 1 Действие триггеров и соответствующие идентификаторы

ТриггерИдентификатор действия
Слой вставляется в видимый слой дерева или hidden свойству задано значение NO.Действие постоянного идентификатора kCAOnOrderIn.
Слой удаляется из видимого дерева слоев или hidden свойству задано значение YES.Действие постоянного идентификатора kCAOnOrderOut.
Слой заменяет существующий слой видимого дерева слоев с помощью replaceSublayer:with:.Действие постоянного идентификатора kCATransition.

Расширенный поиск шаблонов ключей действий

Когда происходит действие триггера, вызывается метод слоя actionForKey:. Этот метод возвращает объект действия который соответствует идентификатору действия передаемого в качестве параметра, или nil, если никаких действий для объекта не существует.

Когда в реализации CALayer вызывается actionForKey: для идентификатора используется следующая схема поиска:

  1. Если слой имеет делегата, и он реализует метод actionForLayer:forKey: он вызывается, принимая слой, и идентификатор действия в качестве параметра. Реализация actionForLayer:forKey: делегата должна отвечать следующему:
    • Возвращать объект действия, который соответствует идентификатору действия.
    • Возвращать nil, если он не обрабатывает идентификатор действия.
    • Возвращать NSNull, если он не обрабатывает идентификатор действия и поиск должн быть прекращен.
  2. Словарь actions слоев должен осуществлять поиск объекта по идентификатору действия
  3. Свойство style слоя ищется для словаря действий, который содержит идентификатор.
  4. Класс слоя направляет defaultActionForKey: сообщение. Оно возвращает объект действия, соответствующий идентификатору, или nil, если не найден.

Принятие протокола CAAction

CAAction протокол определяет порядок действий объектов которые вызываются. Классы, которые реализуют протокол CAAction имеют метод с сигнатурой runActionForKey:object:arguments:.

Когда объект действия получает сообщение runActionForKey:object:arguments: он принимает идентификатор действия, слой на котором действие должно происходить, и дополнительный словарь параметров.

Как правило, объекты действий экземпляры подкласса CAAnimation, который реализует CAAction протокол. Можно, однако, возвращать экземпляр любого класса, который реализует протокол. Когда этот экземпляр получает сообщение runActionForKey:object:arguments: он должен реагировать, выполняя свои действия.

Когда экземпляр CAAnimation получает сообщение runActionForKey:object:arguments: он отвечает, добавив себя в слои анимации, в результате чего запускается анимация (см. листинг 1).

Листинг 1 реализация runActionForKey:object:arguments:, которая инициирует анимацию

- (void)runActionForKey:(NSString *)key object:(id)anObject arguments:(NSDictionary *)dict
{
     [(CALayer *)anObject addAnimation:self forKey:key];
}

Переопределение подразумеваемой анимации

Вы можете предоставить различные подразумеваемые анимации для идентификатора действия, вставив экземпляр CAAnimation в словарь actions, в словаре действий в словарь style, путем реализации методa делегата actionForLayer:forKey: или подклассов класса слоя, перекрывая defaultActionForKey: и возвращая соответствующий объект действия.

Пример в листинге 2 заменяет подразумеваемую анимацию по умолчанию для свойства contents с использованием делегации.

Листинг 2 Подразумеваемая анимация для свойства contents

- (id<CAAction>)actionForLayer:(CALayer *)theLayer forKey:(NSString *)theKey
{
  CATransition *theAnimation=nil;

  if ([theKey isEqualToString:@"contents"])
  {
    theAnimation = [[CATransition alloc] init];
    theAnimation.duration = 1.0;
    theAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
    theAnimation.type = kCATransitionPush;
    theAnimation.subtype = kCATransitionFromRight;
  }

  return theAnimation;
}

Пример в листинге 3 отключает анимацию по умолчанию для свойства sublayers, используя шаблон словаря actions.

Листинг 3 Подразумеваемая анимация для свойства sublayers

//получим изменяемую версию текущего словаря действий
NSMutableDictionary *customActions=[NSMutableDictionary dictionaryWithDictionary:[theLayer actions]];

// добавим новое действие для sublayers
[customActions setObject:[NSNull null] forKey:@"sublayers"];

// установим theLayer действия для обновленного словаря
theLayer.actions=customActions;

Временное отключение действия

По умолчанию, в любое время Вы можете изменять свойства анимации, производя соответствующие анимации.

Вы можете временно отключить действия при изменении свойства слоя с помощью транзакции.

 
 
homeЗаметили ошибкукарта сайта 
   Made on a Mac