アニメーションを繰り返す
アニメーションは、複数追加することも出来る。試しに、位置を動かすアニメーションも追加してみよう。今度はpositionプロパティを使ってみる。
// アニメーションを作成する
animation = [CABasicAnimation animationWithKeyPath:@"position"];
animation.duration = 1.0f;
// アニメーションのプロパティを設定する
CGPoint position;
position = layer.position;
animation.fromValue = [NSValue valueWithPoint:NSPointFromCGPoint(position)];
position.x += 256;
position.y += 160;
animation.toValue = [NSValue valueWithPoint:NSPointFromCGPoint(position)];
// レイヤーにアニメーションを追加する
[layer addAnimation:animation forKey:@"positionAnimation"];
positionプロパティは、CGPoint型になる。fromValueやtoValueプロパティに設定するときは、Objective-Cのオブジェクトにする必要があるので、NSValueクラスを使っている。
また、面白いアニメーションのプロパティとして、autoreversesとrepeatCountがある。これらを使うと、アニメーションを繰り返すことができるのだ。
animation.autoreverses = YES;
animation.repeatCount = 4;
まず、autoreversesをYESにすると、アニメーションがfromValueからtoValueまで変化した後、再びtoValueからfromValueまで戻るアニメーションを行う。これを、repeatCountで指定した回数繰り返すのだ。
なお、ここまでのプロジェクトはこちらからダウンロードできる。
Core Animationは2次元か3次元か?
Core AnimationはWWDC 2006でプレビューされたのだが、そのときのデモとしてiPodのCMである「1000 Songs」を再現させていた。これにより、「Core Animationは3次元グラフィックスの技術なのか? 」という議論を呼んでいた。
さて、実際のところCore Animationは2次元なのか3次元なのか? まず、ビューでのレイヤーの配置を考えると、これは2次元に限定される。レイヤーは、frameやboundsといったプロパティを使い、2次元上の座標で配置される。
ところが、レイヤーのプロパティとして、transformというものが用意されている。これは、CATransform3Dという、4x4の行列型の値になっている。名前からも分かるが、4x4の行列があれば、3次元空間でのアフィン変換が可能である。したがって、レイヤーの内部では、3次元的な表現が可能だ、ということになる。
ただし、光源や影の処理は含まれないため、3次元空間の表現としては、いささか力不足だ。Core Animationでの3次元表示は、Cover Flowや画像のフリップのような、ちょっとしたエフェクトを実現できる程度、と考えておくのがいいだろう。