Изменение поведения уровня по умолчанию

Базовая Анимация реализует свои неявные способы поведения анимации для уровней с помощью объектов действия. Объект действия является объектом, соответствующим CAAction протокол и определяет некоторое соответствующее поведение выполнить на уровне. Все CAAnimation объекты реализуют протокол, и именно эти объекты обычно присваиваются быть выполненными каждый раз, когда изменяется свойство слоя.

Анимация свойств является одним типом действия, но можно определить действия с помощью почти любого поведения, которое Вы хотите. Чтобы сделать это, тем не менее, необходимо определить объекты действия и связать их с расположенными на слое объектами приложения.

Объекты пользовательского действия принимают протокол CAAction

Для создания собственного объекта действия примите CAAction протокол от одного из Ваших классов и реализации runActionForKey:object:arguments: метод. В том методе используйте доступную информацию для выполнения безотносительно действий, Вы хотите взять уровень. Вы могли бы использовать метод для добавления объекта Animation к уровню, или Вы могли бы использовать его для выполнения других задач.

При определении объекта действия необходимо решить, как Вы хотите, чтобы было инициировано то действие. Триггер для действия определяет ключ, который Вы используете для регистрации того действия позже. Объекты действия могут быть инициированы любой из следующих ситуаций:

Объекты действия должны быть установлены на уровне, чтобы иметь эффект

Прежде чем действие может быть выполнено, уровень должен найти, что выполняется соответствующий объект действия. Ключ для связанных с уровнем действий является или именем изменяемого свойства или специальной строкой, идентифицирующей действие. Когда надлежащее событие имеет место на уровне, уровень вызывает actionForKey: метод для поиска объекта действия связался с ключом. Ваше приложение может вмешаться само в нескольких точках во время этого поиска и обеспечить соответствующий объект действия для того ключа.

Базовая Анимация ищет объекты действия в следующем порядке:

  1. Если уровень имеет делегата, и тот делегат реализует actionForLayer:forKey: метод, уровень вызывает тот метод. Делегат должен выполнить одно из следующих действий:

    • Возвратите объект действия для данного ключа.

    • Возвратиться nil если это не обрабатывает действие, когда продолжается поиск.

    • Возвратитесь NSNull объект, когда поиск сразу заканчивается.

  2. Уровень ищет данный ключ в уровне actions словарь.

  3. Уровень заглядывает style словарь для словаря действий, содержащего ключ. (В другом слове, style словарь содержит actions ключ, значение которого является также словарем. Уровень ищет данный ключ в этом втором словаре.)

  4. Уровень вызывает defaultActionForKey: метод класса.

  5. Уровень выполняет неявное действие (если таковые имеются) определенный Базовой Анимацией.

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

То, где Вы устанавливаете свои объекты действия, зависит от того, как Вы намереваетесь изменить уровень.

Перечисление 6-1 показывает, что реализация метода делегата раньше обеспечивала объекты действия. В этом случае делегат ищет изменения в уровне contents свойство и подкачки новое содержание в место с помощью анимации перехода.

Перечисление 6-1  , Обеспечивающее действие с помощью уровня, делегирует объект

- (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;
}

Отключите действия временно Используя класс CATransaction

Можно временно отключить действия уровня с помощью CATransaction класс. При изменении свойства уровня Базовая Анимация обычно создает объект неявной транзакции анимировать изменение. Если Вы не хотите анимировать изменение, можно отключить неявные анимации путем создания явной транзакции и установки kCATransactionDisableActions свойство к true. Перечисление 6-2 показывает отрывок кода, отключающего анимации при удалении указанного уровня из дерева уровня.

Перечисление 6-2  , Временно запрещающее действия уровня

[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue
                 forKey:kCATransactionDisableActions];
[aLayer removeFromSuperlayer];
[CATransaction commit];

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