The CAAnimation
and CALayer
classes extend the NSKeyValueCoding
protocol adding default values for keys, expanded wrapping conventions, and key path support for CGPoint
, CGRect
, CGSize
, and CATransform3D
.
Key-Value Coding Compliant Container Classes
Default Value Support
Wrapping Conventions
Key Path Support for Structure Fields
Both CALayer
and CAAnimation
are key-value coding compliant container classes, allowing you to set values for arbitrary keys. That is, while the key “foo” is not a declared property of the CALayer
class, however you can still set a value for the key “foo” as follows:
[theLayer setValue:[NSNumber numberWithInteger:50] forKey:@"foo"]; |
You retrieve the value for the key “foo” using the following code:
fooValue=[theLayer valueForKey:@"foo"]; |
Mac OS X Note: On Mac OS X, the CALayer
and CAAnimation
classes support the NSCoding
protocol and will automatically archive any additional keys that you set for an instance of those classes.
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. Both CALayer
or CAAnimation
support this convention using the class method defaultValueForKey:
.
To provide a default value for a key you create a subclass of the class and override defaultValueForKey:
. The subclass implementation examines the key parameter and then returns the appropriate default value. Listing 1 shows an example implementation of defaultValueForKey:
that provides a new default value for the layer property masksToBounds
.
Listing 1 Example implementation of defaultValueForKey:
+ (id)defaultValueForKey:(NSString *)key |
{ |
if ([key isEqualToString:@"masksToBounds"]) |
return [NSNumber numberWithBool:YES]; |
return [super defaultValueForKey:key]; |
} |
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 |
---|---|
CGPoint | NSValue |
CGSize | NSValue |
CGRect | NSValue |
CGAffineTransform | NSAffineTransform |
CATransform3D | NSValue |
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 using setValue:forKeyPath:
and valueForKeyPath:
.
CATransform3D
exposes the following fields:
Structure Field | Description |
---|---|
| The rotation, in radians, in the x axis. |
| The rotation, in radians, in the y axis. |
| The rotation, in radians, in the z axis. |
| The rotation, in radians, in the z axis. This is identical to setting the |
| Scale factor for the x axis. |
| Scale factor for the y axis. |
| Scale factor for the z axis. |
| Average of all three scale factors. |
| Translate in the x axis. |
| Translate in the y axis. |
| Translate in the z axis. |
| Translate in the x and y axis. Value is an NSSize or CGSize. |
CGPoint
exposes the following fields:
Structure Field | Description |
---|---|
| The x component of the point. |
| The y component of the point. |
CGSize
exposes the following fields:
Structure Field | Description |
---|---|
| The width component of the size. |
| The height component of the size. |
CGRect
exposes the following fields:
Structure Field | Description |
---|---|
| The origin of the rectangle as a |
| The x component of the rectangle origin. |
| The y component of the rectangle origin. |
| The size of the rectangle as a |
| The width component of the rectangle size. |
| 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"]; |
© 2008 Apple Inc. All Rights Reserved. (Last updated: 2008-11-13)