気楽なソフト工房

プログラミングについていろいろな記事を書いています。



mykonos2008

Author:mykonos2008
システムエンジニアとして働いている30代の会社員です。
仕事や趣味でプログラムを書いている方の役に立つ記事を書いていきたいと思っています。
ご意見、ご感想はこちらまで
If you are an english speaker,Please visit my english blog.

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
iOSにはUIViewをアニメーションさせるための、便利なフレームワーク「Core Animation」があります。
でも、何となく使い方は分かってるけど、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

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。