xyk blog

最近は iOS 開発の記事が多めです。

UIView が持つ描画・レイアウト更新系のメソッドメモ

setNeedsLayout()

現在の子Viewの配置を無効にし、次の更新サイクルで配置し直すようにする(メインスレッドから呼ぶこと)。
このメソッドは即時の更新を強制するものではなく、次の更新サイクルを待つので、更新要求を書き留めたらすぐに処理を戻す。
これを利用して複数のViewの配置を無効にできる。

layoutIfNeeded()

子Viewを即時に配置する。描画前に子Viewを強制的に配置するために使う。
このメソッドを呼んだViewをルートとし、その子孫View全ての配置を行う。

layoutSubviews()

子Viewを配置する。デフォルトの実装では、子Viewの大きさや位置を決めるために設定したConstraintを使う。
サブクラスでは子ViewのautoresizingとConstraintに基づく振る舞いが期待通りにならない場合にオーバーライドする。
このメソッドは直接呼ばないこと。
配置を更新したい場合は次の描画の更新前にsetNeedsLayout()メソッドを呼ぶ。
即時に更新したい場合はlayoutIfNeeded()メソッドを呼ぶ。

setNeedsDisplay()

Viewのboundsの矩形全体に再描画が必要であることを示す。
このメソッドは即時の更新を強制するものではなく、次の更新サイクルを待つので、更新要求を書き留めたらすぐに処理を戻す。
このメソッドはViewの内容や外見が変わった時にのみ使うこと。

updateConstraintsIfNeeded()

このViewとその子ViewのConstraintを更新する。
新しい配置作業がViewに呼び出されると、システムは、Viewとその子ViewのConstraintが現在のView階層とConstraintの情報で確実に更新されるようにするためにこのメソッドを呼ぶ。
このメソッドはシステムに自動的に呼ばれるが、必要な時に手動で呼んでもよい。
このメソッドはオーバーライドしないこと。

updateConstraints()

配置が実行される直前に呼ばれ、ViewのConstraintを更新する。
自身でConstraintを設定する場合にオーバーライドする。
呼ばれた時、まだViewのプロパティが変更されていない段階で、意図した全ての必須Constraintが適切に存在するかを確かめることができる。
Constraintの更新段階ではConstraintを無効にしてはいけない。
また配置や描画を呼んでもいけない。
実装の最後でSuper実装を呼ぶこと。

setNeedsUpdateConstraints()

ViewのConstraintが更新を必要とするかどうかを管理する。
プロパティの変更がConstraintに影響を与える時など、このメソッドを呼ぶことで、Constraintがどこかのタイミングで更新を必要としていることを示すことができる。
システムは通常の配置作業の一部としてupdateConstraints()メソッドを呼ぶ。
必要になる直前にすべてを一度に更新することにより、次の配置作業までの間にViewを複数の変更が会った時も、不要なConstraintの再計算をしなくてすむ。


setNeedsLayout と setNeedsDisplay の違い

setNeedsLayout はサブビューを含むレイアウトの更新で layoutSubviews() が呼ばれるのに対し、 setNeedsDisplay は自ビューの再描画で drawRect() が呼ばれ、 layoutSubviews() は呼ばれない。