< Previous PageNext Page > Hide TOC

Core Animation Extensions To Key-Value Coding

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.

Contents:

Key-Value Coding Compliant Container Classes
Default Value Support
Wrapping Conventions
Key Path Support for Structure Fields


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 “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.

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. 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];
}

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

CGPoint

NSValue

CGSize

NSValue

CGRect

NSValue

CGAffineTransform

NSAffineTransform

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 using setValue: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 the rotation.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"];


< Previous PageNext Page > Hide TOC


© 2008 Apple Inc. All Rights Reserved. (Last updated: 2008-11-13)


Did this document help you?
Yes: Tell us what works for you.
It’s good, but: Report typos, inaccuracies, and so forth.
It wasn’t helpful: Tell us what would have helped.