Help us understand the problem. What is going on with this article?

UIViewにおけるレイアウトのライフサイクル

More than 1 year has passed since last update.

UIViewにおけるレイアウトのライフサイクル

以下の3つのステップにより構成される。

  1. 制約の更新
  2. フレームの更新
  3. レンダリング

制約の更新

以下の条件で、Viewの制約が変更されるとUIViewクラスのupdateConstraints()が呼び出され制約の再計算が行われる

  • 制約のactiveフラグによる有効/無効化
  • 制約の優先度変更
  • 制約の追加・削除
  • 制約が与えられたviewの階層の変更

updateConstraints()内で制約を更新すると、複数のレイアウトパスの中でバッジ処理が行われるため、効率良く制約を更新できる。
制約更新の処理が重い場合などは、updateConstraints()内で制約を更新したほうが良い。

明示的に制約の更新を行う場合

  • updateConstraintsIfNeeded()
  • setNeedsUpdateConstraints()

この二つのメソッドは、制約の更新は行われるがフレームの更新の実行は保証されているわけではない。setNeedsUpdateConstraints()は即座にupdateConstraints()は呼ばれず、複数のレイアウトの更新があっても同じレイアウトパスで更新されるためパフォーマンスが良い。

フレームの更新

制約が更新されるとlayoutSubviews()が呼び出され、フレームが更新される。layoutSubviews()が呼び出されるとupdateConstraintsIfNeeded()も呼び出され、必要であれば制約も更新される。

  • ビューのフレームが変更された時(端末が回転した時など)
  • サブビューの追加・削除
  • UIScrollviewクラスのcontentOffsetが変更された時

明示的にフレームの更新を行う場合

  • layoutIfNeeded()
  • setNeedsLayout()

明示的にフレームの更新を行った後、何らかの処理を実行する場合はlayoutIfNeeded()を使用し、それ以外はsetNeedsLayout()を使ったほうがパフォーマンスが良い。

layoutSubview()のオーバライド

super.layoutSubview()を実行する時点で制約の更新処理は終了しているので、そのレイアウト情報を利用して処理を実行する場合に有効。メインスレッドをブロックせずレイアウトの更新ができる。
トップダウン(親ビュー → 子ビュー)に更新されるので親ビューのレイアウトの更新をすると再起的に更新され、クラッシュを招く。

レンダリング

フレーム情報が更新されるとディスプレイに表示されるためにレンダリングが行われ、drawRect_:が呼び出される。また、以下の条件で、drawRect_:が呼び出され再描画を行う。

  • ビューの一部を隠してる別のビューの移動・削除
  • hidden(非表示)になっていたビューの再表示
  • ビューを画面外までスクロールし、再び画面内に戻す
  • ビューのsetNeedsDisplay(), setNeedsDisplayInRect(_:)の明示的な呼び出し
shoheiyokoyama
【横山 祥平 / @shoheiyokoyama 】 CyberAgent, Inc / AbemaTV / CATS / iOS Engineer Medium: https://medium.com/@shoheiyokoyama
https://github.com/shoheiyokoyama
cyberagent
サイバーエージェントは「21世紀を代表する会社を創る」をビジョンに掲げ、インターネットテレビ局「AbemaTV」の運営や国内トップシェアを誇るインターネット広告事業を展開しています。インターネット産業の変化に合わせ新規事業を生み出しながら事業拡大を続けています。
http://www.cyberagent.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした