アニメーションを繰り返す

アニメーションは、複数追加することも出来る。試しに、位置を動かすアニメーションも追加してみよう。今度は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や画像のフリップのような、ちょっとしたエフェクトを実現できる程度、と考えておくのがいいだろう。