taoru's memo

Objective-c,cocos2d,など開発についてのメモ(andoroidも少しだけ)

InsertSubviewしたときはaddSubviewはいらない

UIViewをサブビューとして画面に表示させたいとき、

UIView *subview = [[[UIView alloc] init] autorelease];
[parentView addSubview:subview];

のように書くとparentViewのサブビューリストの末尾にsubviewが追加される(一番上に表示される)

で、既存のサブビューの並び順を変えたいときは、

[parentView bringSubviewToFront:subview];  // subviewのインデックスを末尾に移動する(一番上に表示される)
[parentView sendSubviewToBack:subview];   // subviewのインデックスを先頭に移動する(一番後ろに表示される)

これらを使う。

InsertSubviewはサブビューリストに新たにサブビューを挿入する

勘違いしていたのだけど、insertSubviewも前述2つのメソッドと同じように既存サブビューのインデックスをいじるものだと思っていた。
考えてみればinsertって付いているのだから、気がつけよと…

[parentView insertSubview:subview1 aboveSubview:subview2];  // 既存subview2の上に新たにsubview1が挿入される
[parentView insertSubview:subview1 belowSubview:subview2];  // 既存subview2の下に新たにsubview1が挿入される
[parentView insertSubview:subview1 atIndex:index];                  // parentViewのサブビューリストのindexの位置に新たにsubview1を挿入する

新たに追加するので、insertSubviewを使用するならaddSubviewしてはいけない(※追記)

[parentView insertSubview:subview atIndex:[parentView.subviews count]];

と、

[parentView addSubview:subview];

は同義ってことですね。

今まではaddSubviewした後にinsertSubviewで順番を入れ替えるとかアホなことしてました。

※追記 2013/05/09 10:16

既にsubviewとなっているviewをもう一度addSubviewしようとしても特に問題なかった。
その場合貼り直しになるので、indexは最大になる。
既にsuperviewを持っているviewを他のviewにaddSubviewした場合の振る舞い - taoru's memo

QLOOKアクセス解析