20
18

More than 5 years have passed since last update.

[Objective-C] UIViewの親子関係が変化する際のイベント(デリゲート)

Posted at

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が取り除かれようとしているときに呼び出されます。

親ビューに追加されたあとにレイアウト用のメソッドを呼んでもらうようにする方法もありますが、それだとそのメソッドを呼ぶことを覚えてないとならないし、やや冗長な処理になってしまうのでこうしたデリゲートを使って追加された際に処理する、というほうがスマートです。

(セルなどのように付け外しが頻繁に行われるビューについては処理負荷の観点から必ずしもいいとは限りませんが)

20
18
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
20
18