2012年9月9日日曜日

CALayerをビューに追加したときの順番について

CALayerをビューに追加したときの順番に関して調べたのでメモ。

CALayerの重なる順番はaddSublayer:メソッドでビューに追加した順にどんどん重なっていく仕様のようです。もちろんメソッドの順番でも関係してきます。

その重なりの順番を変更したい場合は「insertSublayer:」メソッドを使用すれば良いようです。以下検証。

レイヤーの順番をいろいろ検証

検証1

//レイヤー1
CALayer *layer = [CALayer layer];
layer.frame = CGRectMake(30, 50, 200, 200);
layer.backgroundColor = [UIColor redColor].CGColor;
[self.view.layer addSublayer:layer]; 

//レイヤー2
CALayer *layer2 = [CALayer layer];
layer2.frame = CGRectMake(50, 70, 200, 200);
layer2.backgroundColor = [UIColor blueColor].CGColor;
[self.view.layer addSublayer:layer2];

レイヤー1、2の表示にaddSublayer:メソッドを使用。

addSublayer:メソッド順にレイヤー1の上にレイヤー2が重なる。

検証2

//レイヤー1
CALayer *layer = [CALayer layer];
layer.frame = CGRectMake(30, 50, 200, 200);
layer.backgroundColor = [UIColor redColor].CGColor;
[self.view.layer insertSublayer:layer atIndex:1];

//レイヤー2
CALayer *layer2 = [CALayer layer];
layer2.frame = CGRectMake(50, 70, 200, 200);
layer2.backgroundColor = [UIColor blueColor].CGColor;
[self.view.layer insertSublayer:layer2 atIndex:0];

レイヤー1、2の表示にinsertSublayer:メソッドを使用。レイヤー1のatIndex:の引数を1、レイヤー2のatIndex:の引数に0を指定。

レイヤー2の上にレイヤー1が重なる。

検証3

//レイヤー1
CALayer *layer = [CALayer layer];
layer.frame = CGRectMake(30, 50, 200, 200);
layer.backgroundColor = [UIColor redColor].CGColor;
[self.view.layer addSublayer:layer];

//レイヤー2
CALayer *layer2 = [CALayer layer];
layer2.frame = CGRectMake(50, 70, 200, 200);
layer2.backgroundColor = [UIColor blueColor].CGColor;
[self.view.layer insertSublayer:layer2 atIndex:0];

レイヤー2の表示にinsertSublayer:メソッドを使用。atIndex:の引数を0を指定。

レイヤー2の上にレイヤー1が重なる。

検証4

//レイヤー1
CALayer *layer = [CALayer layer];
layer.frame = CGRectMake(30, 50, 200, 200);
layer.backgroundColor = [UIColor redColor].CGColor;
[self.view.layer insertSublayer:layer atIndex:1];

//レイヤー2
CALayer *layer2 = [CALayer layer];
layer2.frame = CGRectMake(50, 70, 200, 200);
layer2.backgroundColor = [UIColor blueColor].CGColor;
[self.view.layer addSublayer:layer2];

レイヤー1の表示にinsertSublayer:メソッドを使用。atIndex:の引数を1を指定。レイヤー2はaddSublayer:メソッドを使用。

レイヤー1の上にレイヤー2が重なる。

検証5

//レイヤー1
CALayer *layer = [CALayer layer];
layer.frame = CGRectMake(30, 50, 200, 200);
layer.backgroundColor = [UIColor redColor].CGColor;
[self.view.layer addSublayer:layer];

//レイヤー2
CALayer *layer2 = [CALayer layer];
layer2.frame = CGRectMake(50, 70, 200, 200);
layer2.backgroundColor = [UIColor blueColor].CGColor;
[self.view.layer insertSublayer:layer2 atIndex:1];

レイヤー1の表示にaddSublayer:メソッドを使用。レイヤー2はinsertSublayer:メソッドを使用。atIndex:の引数を1を指定。

レイヤー2の上にレイヤー1が重なる。

おわり

今回の検証より、addSublayer:メソッドとinsertSublayer:メソッドではinsertSublayer:メソッドの方が優先されるようですね。

単純なレイヤーの追加はaddSubview:メソッドを利用し、予め設計ができているのであればinsertSubview:メソッドで追加するのが望ましいかもしれません。

また、試してないのですがUIViewを最前面、最背面に持ってくる場合はそれぞれbringSubviewToFront:メソッド、sendSubviewToBack:メソッドを使用すればいいようです。詳しくは以下の記事を参考にしてください。

参考記事

[CALayer]layerの重なり順を設定する - 3ヶ月でiPhoneアプリを1本作る日記
Subviewを最前面・最背面に移動する - C開発者によるiPhoneプログラミング

0 件のコメント:

コメントを投稿