iOSにはUIViewをアニメーションさせるための、便利なフレームワーク「Core Animation」があります。
でも、何となく使い方は分かってるけど、CALayerって何?っていうところがぼやけていたりしませんか?
そこで、本稿では、UIiewとCALayerの関係について書いてみたいと思います。
Core AnimationはViewをアニメーションさせるための基本的な仕組みを提供するもので、よく混同されがちなのですが、
Viewとは全く異なった役割を持ったものです。Core AnimationはViewのコンテンツをbitmapとしてキャッシュし、
それをGPUに直接処理させることで、アニメーションを実現するものです。
しかし、そのコンテンツそのものを準備する部分については、Viewに委ねられています。
Core Animationを扱う際、最も混乱しやすい部分がUIViewとCALayerの関係についてではないかと思います。
以下の2つのコードを見てください。
2つのソースコードの実行結果は全く同じになります。画像を画面の左から右にアニメーションさせながら移動します。
こうしてみると、ますます、UIViewとCALayerを混同してしまいそうですね。
しかし、UIViewをCALayerは全く異なった役割を持つ別のものなのです。
繰り返しになりますが、CALayerはUIViewのコンテンツをbitmapとしてキャッシュし、
その状態を変えることでアニメーションを実行する役割を担っています。
その一方で、イベントを処理したり、コンテンツを描画したりすることは出来ません。それはUIViewの役割になります。
iOSではUIViewのインスタンスには必ずそれに対応するCALayerのインスタンスが作成され、後ろに控えています。
そして、上記のサンプルコードのように、いくつかのCALayerのプロパティはUIViewのプロパティからも
アクセスできるようになっています。その場合、CALayerのプロパティとUIViewのプロパティが異なった
値を持っているわけではなく、常に同じ値を持っています。
(なお、CALayerのプロパティに直接アクセスするためには、QuartzCore/QuartzCore.hをインポートしておく
必要があります。)
一見すると、UIViewがアニメーションの機能を提供しているように見えますが、それは後ろに控えている
CALayerによって実現されているのです。
でも、何となく使い方は分かってるけど、CALayerって何?っていうところがぼやけていたりしませんか?
そこで、本稿では、UIiewとCALayerの関係について書いてみたいと思います。
Core Animationについて
Core AnimationはViewをアニメーションさせるための基本的な仕組みを提供するもので、よく混同されがちなのですが、
Viewとは全く異なった役割を持ったものです。Core AnimationはViewのコンテンツをbitmapとしてキャッシュし、
それをGPUに直接処理させることで、アニメーションを実現するものです。
しかし、そのコンテンツそのものを準備する部分については、Viewに委ねられています。
UIViewとCALayerの関係について
Core Animationを扱う際、最も混乱しやすい部分がUIViewとCALayerの関係についてではないかと思います。
以下の2つのコードを見てください。
@implementation ViewController{ IBOutlet UIImageView *_charactor; } ・・・・・・・・・・・・・・・・・・・・・ -(IBAction)startButtonTouched:(id)sender { [UIView animateWithDuration:1.0f animations:^{ _charactor.center = CGPointMake(250,_charactor.center.y); }]; } ・・・・・・・・・・・・・・・・・・・・・
#import <QuartzCore/QuartzCore.h>
@implementation ViewController{
IBOutlet UIImageView *_charactor;
}
・・・・・・・・・・・・・・・・・・・・・
-(IBAction)startButtonTouched:(id)sender
{
[UIView animateWithDuration:1.0f animations:^{
_charactor.layer.position = CGPointMake(250,_charactor.center.y);
}];
}
・・・・・・・・・・・・・・・・・・・・・
2つのソースコードの実行結果は全く同じになります。画像を画面の左から右にアニメーションさせながら移動します。
実行前 | 実行後 |
![]() |
![]() |
こうしてみると、ますます、UIViewとCALayerを混同してしまいそうですね。
しかし、UIViewをCALayerは全く異なった役割を持つ別のものなのです。
繰り返しになりますが、CALayerはUIViewのコンテンツをbitmapとしてキャッシュし、
その状態を変えることでアニメーションを実行する役割を担っています。
その一方で、イベントを処理したり、コンテンツを描画したりすることは出来ません。それはUIViewの役割になります。
iOSではUIViewのインスタンスには必ずそれに対応するCALayerのインスタンスが作成され、後ろに控えています。
そして、上記のサンプルコードのように、いくつかのCALayerのプロパティはUIViewのプロパティからも
アクセスできるようになっています。その場合、CALayerのプロパティとUIViewのプロパティが異なった
値を持っているわけではなく、常に同じ値を持っています。
(なお、CALayerのプロパティに直接アクセスするためには、QuartzCore/QuartzCore.hをインポートしておく
必要があります。)
一見すると、UIViewがアニメーションの機能を提供しているように見えますが、それは後ろに控えている
CALayerによって実現されているのです。
コメント
コメントの投稿
トラックバック
http://csfun.blog49.fc2.com/tb.php/119-578ddba2