CAAnimationクラスとCALayerクラスは、NSKeyValueCodingプロトコルを拡張して、キーのデフォルト値、拡張したラッピング規則、およびキーパスのサポートをCGPoint、CGRect、CGSize、およびCATransform3Dに対して追加します。
キー値コーディング準拠のコンテナクラス
デフォルト値のサポート
ラッピング規則
構造体フィールドのためのキーパスサポート
CALayerとCAAnimationはどちらもキー値コーディング準拠のコンテナクラスです。任意のキーに値を設定し、アーカイブできます。
キー「foo」はCALayerクラスの宣言されたプロパティではありませんが、キー「foo」に次のように値を設定できます。
[theLayer setValue:[NSNumber numberWithInteger:50] forKey:@"foo"]; |
キー「foo」の値は、次のコードを使用して取得します。
fooValue=[theLayer valueForKey:@"foo"]; |
Core Animationでは、キー値コーディングに新しい規則を追加しており、これによりクラスは、対象となるキーに値が設定されていない場合にデフォルト値を提供できます。CALayerとCAAnimationはどちらも、クラスメソッドdefaultValueForKey:を使ってこの規則をサポートします。
あるキーにデフォルト値を指定するには、クラスのサブクラスを作成してdefaultValueForKey:をオーバライドします。サブクラスの実装がそのキーパラメータを調べて適切なデフォルト値を返します。リスト 1に、レイヤプロパティmasksToBoundsに新しいデフォルト値を指定するdefaultValueForKey:の実装例を示します。
リスト 1 defaultValueForKey:の実装例
+ (id)defaultValueForKey:(NSString *)key |
{ |
if ([key isEqualToString:@"masksToBounds"]) |
return [NSNumber numberWithBool:YES]; |
return [super defaultValueForKey:key]; |
} |
キー値コーディングメソッドを使って、標準のキー値コーディングのラッピング規則でサポートされるオブジェクト以外の値を持つプロパティにアクセスする場合は、次のラッピング規則を使用します。
Cの型 | クラス |
|---|---|
CGPoint | NSValue |
CGSize | NSValue |
CGRect | NSValue |
CGAffineTransform | NSAffineTransform |
CATransform3D | NSValue |
CAAnimationは、キーパスを使って選択した構造体のフィールドにアクセスするためのサポートを提供しています。これは、これらの構造体フィールドをアニメーションのキーパスとして指定したり、setValue:forKeyPath:とvalueForKeyPath:を使って値の設定と取得を行う場合に役立ちます。
CATransform3Dは次のフィールドを公開します。
構造体フィールド | 説明 |
|---|---|
| ラジアン単位によるX軸での回転。 |
| ラジアン単位によるY軸での回転。 |
| ラジアン単位によるZ軸での回転。 |
| ラジアン単位によるZ軸での回転。これは |
| X軸の拡大縮小倍率。 |
| Y軸の拡大縮小倍率。 |
| Z軸の拡大縮小倍率。 |
| 3つの拡大縮小倍率すべての平均。 |
| X軸での平行移動。 |
| Y軸での平行移動。 |
| Z軸での平行移動。 |
| XおよびY軸での平行移動。値はNSSizeまたはCGSizeです。 |
CGPointは次のフィールドを公開します。
構造体フィールド | 説明 |
|---|---|
| 点のX成分。 |
| 点のY成分。 |
CGSizeは次のフィールドを公開します。
構造体フィールド | 説明 |
|---|---|
| サイズの幅の成分。 |
| サイズの高さの成分。 |
CGRectは次のフィールドを公開します。
構造体フィールド | 説明 |
|---|---|
| 矩形の原点を |
| 矩形の原点のX成分。 |
| 矩形の原点のY成分。 |
| 矩形サイズを |
| 矩形サイズの幅の成分。 |
| 矩形サイズの高さの成分。 |
構造体フィールドのキーパスをObjective-C 2.0プロパティを使用して指定することはできません。次のような指定はできません。
myLayer.transform.rotation.x=0; |
代わりに、次に示すようにsetValue:forKeyPath:またはvalueForKeyPath:を使う必要があります。
[myLayer setValue:[NSNumber numberWithInt:0] forKeyPath:@"transform.rotation.x"]; |
Last updated: 2007-12-06