レイヤーを使って画像を表示する
では、レイヤーを使ってみよう。先ほど作成した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];
これで、レイヤーを使った画像の描画の出来上がりだ。実行結果は、次のようになるだろう。
なお、ここまでのプロジェクトはこちらからダウンロードできる。