レイヤーを使って画像を表示する

では、レイヤーを使ってみよう。先ほど作成したController.mに、awakeFromNibメソッドを追加し、コードを記述していく。

まず、レイヤーの作成だ。レイヤーは、CALayerというクラスで表す。CALayerには、インスタンスを作るためにlayerというクラスメソッドがあるので、これを使ってインスタンスを取得する。

// レイヤーを作成する
CALayer* layer;
layer = [CALayer layer];

レイヤーを作成したら、次はコンテンツを設定する。CALayerでは、コンテンツとして画像を使うことが出来る。ちなみに、画像以外のものを表示したい場合は、それに特化したCALayerのサブクラスが用意されている。たとえば、テキストならばCATextLayer、QuickTimeムービーならばQTMovieLayer、OpenGLならばCAOpenGLLayerなどが使える。

画像は、ちょっと面倒なのだが、Cocoaで画像を表すNSImageではなく、CGImageを使う。これは、Core Graphicsのオブジェクトだ。CGImageオブジェクトを作るには、Core GraphicsのAPIを使ってもいいが、NSBitmapImageRepにまさにこの目的のためなのか、CGImageというメソッドが追加されたので、そちらを使ってみよう。

// CGImageを作成する
NSBitmapImageRep*   bitmapImage;
CGImageRef          image;
bitmapImage = [NSBitmapImageRep imageRepWithContentsOfFile:
     @"/Library/Desktop Pictures/Nature/Earth.jpg"];
image = [bitmapImage CGImage];

画像として、デスクトップピクチャとして用意されているEarth.jpgを使ってみた。

画像が出来たら、それをレイヤーに設定する。それには、レイヤーのcontensプロパティを利用する。同時に、大きさも指定しておこう。これはframeプロパティを利用する。このプロパティは、NSRectではなく、CGRect型になっているので注意してほしい。どうやら、全般的にCore Animationは、Cocoaのグラフィックスシステムよりも、Core Graphicsの方を好んでいるようだ。

// レイヤーに画像を設定する
layer.contents = (id)image;
layer.frame = CGRectMake(0, 0, 256, 160);

これで、画像レイヤーは出来た。これを直接使うのは、これからいろいろなアニメーションを行うのに都合が悪いので、もう1つレイヤーを作ろう。全体の背景となるレイヤーだ。背景レイヤーは、背景色で塗りつぶしておく。backgroundColorプロパティで、塗りつぶし色を指定する。

// 背景レイヤーを作成する
CALayer*    backgroundLayer;
CGColorRef  blackColor;
backgroundLayer = [CALayer layer];
blackColor = CGColorCreateGenericGray(0, 1.0f);
backgroundLayer.backgroundColor = blackColor;
CGColorRelease(blackColor);

これで、2つのレイヤーが出来た。この2つを重ねよう。背景レイヤーの上に、画像レイヤーを置くようにする。これには、addSublayer:メソッドを使う。NSViewのaddSubview:と似たようなものだと考えてもらっていい。

// 画像レイヤーを背景レイヤーに追加する
[backgroundLayer addSublayer:layer];

これでレイヤーの準備は完了だ。

最後に、レイヤーを画面に表示できるようにする。実は、レイヤーだけでは画面に描画を行うことが出来ない。CocoaのビュークラスであるNSViewの助けが必要だ。Leopardでは、NSViewにsetLayer:というメソッドが追加された。これを使ってレイヤーをビューに設定する。さらに、setWantsLayer:というメソッドもある。これは、描画にレイヤーを使うかどうかを指定するものだ。これに、YESを指定しておく。

// レイヤーをビューに設定する
[_view setLayer:backgroundLayer];
[_view setWantsLayer:YES];

これで、レイヤーを使った画像の描画の出来上がりだ。実行結果は、次のようになるだろう。

なお、ここまでのプロジェクトはこちらからダウンロードできる。