まだまだ勉強不足で、UIViewとCALayerの兼ね合いが曖昧なのでメモ。
最初、UIViewとCALayerは独立して存在しているのかと思っていたのだけど、どうやら階層構造はUIView、CALayerともに同じになる?
(あるいはaddSubview:
を実行した時点で、そのUIViewのCALayerを追加してるのかも。まだリファレンスしっかり追えてません)
とりあえず動作を確認するために簡単にコードを書いてみた。
// Viewの重なりテスト
self.view.backgroundColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:0.5];
UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 160, 200)];
view1.backgroundColor = [UIColor redColor];
UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 160, 200)];
view2.backgroundColor = [UIColor blueColor];
UIView *view3 = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 160, 200)];
view3.backgroundColor = [UIColor greenColor];
// UIViewを入れ子に
[view1 addSubview:view2];
[view2 addSubview:view3];
CALayer *layer1 = [CALayer layer];
layer1.backgroundColor = [UIColor grayColor].CGColor;
layer1.frame = CGRectMake(20, 20, 100, 100);
CALayer *layer2 = [CALayer layer];
layer2.backgroundColor = [UIColor blackColor].CGColor;
layer2.frame = CGRectMake(40, 40, 100, 100);
CALayer *layer3 = [CALayer layer];
layer3.backgroundColor = [UIColor whiteColor].CGColor;
layer3.frame = CGRectMake(60, 60, 100, 100);
// それぞれのUIViewにCALayerを新たに追加
[view1.layer addSublayer:layer1];
[view2.layer addSublayer:layer2];
[view3.layer addSublayer:layer3];
[self.view addSubview:view1];
NSLog(@"%@", self.view.layer.sublayers);
上記コードを実行すると以下のイメージになります。
それぞれの色と関係は明記した通り。
UIViewを先に入れ子にして、その後でそれぞれCALayerを追加したけど、UIView1にあとから追加したGrayのCALayerがUIViewそれぞれよりも前面に来ているので、入れ子構造はUIViewもCALayerも追加した順に反映されるみたい。