Изменение поведения уровня по умолчанию
Базовая Анимация реализует свои неявные способы поведения анимации для уровней с помощью объектов действия. Объект действия является объектом, соответствующим CAAction
протокол и определяет некоторое соответствующее поведение выполнить на уровне. Все CAAnimation
объекты реализуют протокол, и именно эти объекты обычно присваиваются быть выполненными каждый раз, когда изменяется свойство слоя.
Анимация свойств является одним типом действия, но можно определить действия с помощью почти любого поведения, которое Вы хотите. Чтобы сделать это, тем не менее, необходимо определить объекты действия и связать их с расположенными на слое объектами приложения.
Объекты пользовательского действия принимают протокол CAAction
Для создания собственного объекта действия примите CAAction
протокол от одного из Ваших классов и реализации runActionForKey:object:arguments:
метод. В том методе используйте доступную информацию для выполнения безотносительно действий, Вы хотите взять уровень. Вы могли бы использовать метод для добавления объекта Animation к уровню, или Вы могли бы использовать его для выполнения других задач.
При определении объекта действия необходимо решить, как Вы хотите, чтобы было инициировано то действие. Триггер для действия определяет ключ, который Вы используете для регистрации того действия позже. Объекты действия могут быть инициированы любой из следующих ситуаций:
Значение одного из свойств уровня изменилось. Это может быть любым из свойств уровня и не только animatable. (Можно также связать действия с пользовательскими свойствами, которые Вы добавляете к своим уровням.) Ключ, идентифицирующий это действие, является именем свойства.
Уровень стал видимым или был добавлен к иерархии слоев. Ключ, идентифицирующий это действие,
kCAOnOrderIn
.Уровень был удален из иерархии слоев. Ключ, идентифицирующий это действие,
kCAOnOrderOut
.Уровень собирается быть вовлеченным в анимацию перехода. Ключ, идентифицирующий это действие,
kCATransition
.
Объекты действия должны быть установлены на уровне, чтобы иметь эффект
Прежде чем действие может быть выполнено, уровень должен найти, что выполняется соответствующий объект действия. Ключ для связанных с уровнем действий является или именем изменяемого свойства или специальной строкой, идентифицирующей действие. Когда надлежащее событие имеет место на уровне, уровень вызывает actionForKey:
метод для поиска объекта действия связался с ключом. Ваше приложение может вмешаться само в нескольких точках во время этого поиска и обеспечить соответствующий объект действия для того ключа.
Базовая Анимация ищет объекты действия в следующем порядке:
Если уровень имеет делегата, и тот делегат реализует
actionForLayer:forKey:
метод, уровень вызывает тот метод. Делегат должен выполнить одно из следующих действий:Возвратите объект действия для данного ключа.
Возвратиться
nil
если это не обрабатывает действие, когда продолжается поиск.Возвратитесь
NSNull
объект, когда поиск сразу заканчивается.
Уровень ищет данный ключ в уровне
actions
словарь.Уровень заглядывает
style
словарь для словаря действий, содержащего ключ. (В другом слове,style
словарь содержитactions
ключ, значение которого является также словарем. Уровень ищет данный ключ в этом втором словаре.)Уровень вызывает
defaultActionForKey:
метод класса.Уровень выполняет неявное действие (если таковые имеются) определенный Базовой Анимацией.
При обеспечении объекта действия в какой-либо из надлежащих поисковых точек уровень останавливает свой поиск и выполняет возвращенный объект действия. Когда это находит объект действия, уровень вызывает тот объект runActionForKey:object:arguments:
метод для выполнения действия. Если действие уже экземпляром, которое Вы определяете для данного ключа является CAAnimation
класс, можно использовать реализацию по умолчанию того метода для выполнения анимации. Если Вы определяете свой собственный объект, соответствующий CAAction
протокол, необходимо использовать реализацию объекта того метода для принятия независимо от того, что меры являются надлежащими.
То, где Вы устанавливаете свои объекты действия, зависит от того, как Вы намереваетесь изменить уровень.
Для действий, которые Вы могли бы применить только при определенных обстоятельствах, или для уровней, уже использующих объект делегата, предоставьте делегату и реализуйте
actionForLayer:forKey:
метод.Для расположенных на слое объектов, обычно не использующих делегата, добавьте действие к уровню
actions
словарь.Для действий, связанных с пользовательскими свойствами, которые Вы определяете на расположенном на слое объекте, включайте действие в уровень
style
словарь.Для действий, которые являются основным принципом поведения уровня, разделите уровень на подклассы и переопределите
defaultActionForKey:
метод.
Перечисление 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]; |
Для получения дополнительной информации об использовании транзакции возражает, чтобы управлять поведением анимации, видеть, что Явные транзакции Позволяют Вам Параметры Анимации Изменения.