The CAAnimation and CALayer classes extend theNSKeyValueCoding protocol adding default values for keys, expanded wrapping conventions, and key path support forCGPoint, CGRect, CGSize, and CATransform3D.
Key-Value Coding Compliant Container Classes
Both CALayer and CAAnimation are key-value coding compliant container classes, allowing you to set values for arbitrary keys. That is, while the key “someKey” is not a declared property of theCALayer class, however you can still set a value for the key “someKey” as follows:
[theLayer setValue:[NSNumber numberWithInteger:50] forKey:@"someKey"];
|
|
You retrieve the value for the key “someKey” using the following code:
someKeyValue=[theLayer valueForKey:@"someKey"];
|
OS X Note: On OS X, the CALayer andCAAnimation classes support the NSCoding protocol and will automatically archive any additional keys that you set for an instance of those classes.
Default Value Support
Core Animation adds a new convention to key value coding that allows a class to provide a default value that is used when a class has no value set for that key. BothCALayer or CAAnimation support this convention using the class methoddefaultValueForKey:.
To provide a default value for a key you create a subclass of the class and overridedefaultValueForKey:. The subclass implementation examines the key parameter and then returns the appropriate default value. Listing 1 shows an example implementation ofdefaultValueForKey: that provides a new default value for the layer propertymasksToBounds.
Listing 1 Example implementation of defaultValueForKey:
|
+ (id)defaultValueForKey:(NSString *)key
|
{
|
if ([key isEqualToString:@"masksToBounds"])
|
return [NSNumber numberWithBool:YES];
|
|
return [super defaultValueForKey:key];
|
}
|
Wrapping Conventions
When using the key-value coding methods to access properties whose values are not objects the standard key-value coding wrapping conventions support, the following wrapping conventions are used:
C Type | Class |
NSValue | |
NSValue | |
NSAffineTransform (OS X only) | |
CATransform3D | NSValue |
Key Path Support for Structure Fields
CAAnimation provides support for accessing the fields of selected structures using key paths. This is useful for specifying these structure fields as the key paths for animations, as well as setting and getting values usingsetValue:forKeyPath: and valueForKeyPath:.
CATransform3D exposes the following fields:
Structure Field | Description |
rotation.x | The rotation, in radians, in the x axis. |
rotation.y | The rotation, in radians, in the y axis. |
rotation.z | The rotation, in radians, in the z axis. |
rotation | The rotation, in radians, in the z axis. This is identical to setting therotation.z field. |
scale.x | Scale factor for the x axis. |
scale.y | Scale factor for the y axis. |
scale.z | Scale factor for the z axis. |
scale | Average of all three scale factors. |
translation.x | Translate in the x axis. |
translation.y | Translate in the y axis. |
translation.z | Translate in the z axis. |
translation | Translate in the x and y axis. Value is an NSSize or CGSize. |
CGPoint exposes the following fields:
Structure Field | Description |
x | The x component of the point. |
y | The y component of the point. |
CGSize exposes the following fields:
Structure Field | Description |
width | The width component of the size. |
height | The height component of the size. |
CGRect exposes the following fields:
Structure Field | Description |
origin | The origin of the rectangle as a CGPoint. |
origin.x | The x component of the rectangle origin. |
origin.y | The y component of the rectangle origin. |
size | The size of the rectangle as a CGSize. |
size.width | The width component of the rectangle size. |
size.height | The height component of the rectangle size. |
You can not specify a structure field key path using Objective-C 2.0 properties. This will not work:
myLayer.transform.rotation.x=0;
|
Instead you must use setValue:forKeyPath: or valueForKeyPath: as shown below:
[myLayer setValue:[NSNumber numberWithInt:0] forKeyPath:@"transform.rotation.x"]; |
CABasicAnimation *pulseAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
pulseAnimation.duration = .5;
pulseAnimation.toValue = [NSNumber numberWithFloat:bigSize];
pulseAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
pulseAnimation.autoreverses = YES;
pulseAnimation.repeatCount = FLT_MAX;
[view.layer addAnimation:pulseAnimation forKey:@"transform.scale"];