UIViewをサブクラス化した際に、目的のビューを生成するために中身のボタンなどのパーツをレイアウトする必要があると思います。
その場合に、サブクラス化したビュー自体の幅が未定で、親ビューに追加されるとき(インスタンス化されるとき)にサイズが決まるケースはよくあると思います。
そうなると事前にサイズを知ることができなくなり、レイアウトに問題が出る場合があります。
そんなときは、実際に親ビューに追加されたときにレイアウト処理を実行したい、という場合があります。
そんなときに使えるデリゲートメソッドです。
具体的には以下。
viewの状態が変化したときのイベント
メソッド名 | 意味 |
---|---|
- (void)willMoveToSuperview:(UIView *)newSuperview | 自分自身が新しいSuperview以下に移動しようとしたとき(新しいSuperviewに対してaddSubview:されようとしたとき)に呼び出されます。 |
- (void)didMoveToSuperview | 自分自身が新しいSuperview以下に移動したとき(新しいSuperviewにaddSubview:されたとき)に呼び出されます。 |
- (void)willMoveToWindow:(UIWindow *)newWindow | 自分自身が新しいWindow以下に移動しようとしたとき(新しいWindowに対してaddSubview:されようとしたとき)に呼び出されます。 |
- (void)didMoveToWindow | 自分自身が新しいWindow以下に移動したとき(新しいWindowに対してaddSubview:されたとき)に呼び出されます。 |
- (void)didAddSubview:(UIView *)subview | 自分自身に他のviewがsubviewとして追加されたときに呼び出されます。 |
- (void)willRemoveSubview:(UIView *)subview | 自分自身のsubviewsから他のviewが取り除かれようとしているときに呼び出されます。 |
親ビューに追加されたあとにレイアウト用のメソッドを呼んでもらうようにする方法もありますが、それだとそのメソッドを呼ぶことを覚えてないとならないし、やや冗長な処理になってしまうのでこうしたデリゲートを使って追加された際に処理する、というほうがスマートです。
(セルなどのように付け外しが頻繁に行われるビューについては処理負荷の観点から必ずしもいいとは限りませんが)