LoginSignup
45
47

More than 5 years have passed since last update.

[Objective-C] UIViewとCALayerの階層についてメモ

Posted at

まだまだ勉強不足で、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);

上記コードを実行すると以下のイメージになります。

sample.png

それぞれの色と関係は明記した通り。
UIViewを先に入れ子にして、その後でそれぞれCALayerを追加したけど、UIView1にあとから追加したGrayのCALayerがUIViewそれぞれよりも前面に来ているので、入れ子構造はUIViewもCALayerも追加した順に反映されるみたい。

45
47
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
45
47