Eureka Engineering
Published in

Eureka Engineering

iOSエンジニア必見!!iOSのレイアウトで押さえておきたいこと【総集編】

iOSエンジニア必見!!iOSのレイアウトで押さえておきたいこと【総集編】

こんにちは!CouplesのiOSエンジニアをしている丹です。
今回はiOSエンジニアなら、絶対に押さえておきたいViewのレイアウトについてまとめました。Viewのレイアウトはアプリを作る上で基本中の基本ですが、深い理解がなくても、動くものは作れます。しかし、パフォーマンスを意識したり、設計をしっかりする上でViewのレイアウトの理解は必須です。レイアウトの理解を深めるために、本記事が少しでも参考になれば嬉しいです!対象読者は初級者〜中級者の方を想定しています。


* 本記事は、執筆時点で最新のXcode7.2.1、Swift2.1を使用しています。

  • ViewとViewControllerのレイアウトサイクル
  • Constraints
  • ViewのupdateConstraints
  • ViewのIntrinsic Content Sizeとは
  • Content HuggingとCompression Resistance
  • Intrinsic Content Sizeを動的に変更する
  • ViewControllerのupdateViewConstraints
  • カスタムビューはrequiresConstraintBasedLayoutを書こう
  • Layout
  • ViewのlayoutSubviews
  • NSLayoutConstraintの値を更新した場合
  • ViewControllerのviewWillLayoutSubviewsとviewDidLayoutSubviews
  • Viewのレイアウトサイクルのメソッドまとめ
  • AutoLayoutとアニメーション
  • コードでAutoLayoutを組む
  • コードでAutoLayoutを組むときの注意点
  • Couplesで使用しているAutoLayoutのライブラリ「Cartography」について
  • おわりに

ViewとViewControllerのレイアウトサイクルは絶対押さえておきたいところです。
アプリの裏側がどう動いているかを理解するために、レイアウトサイクルを知ることはとても重要です。


今回はSubviewが1つもない空のViewControllerを用意します。
このViewControllerを表示した時、以下の順番でViewControllerとViewControllerのviewの各メソッドが呼ばれます。

レイアウトサイクル

説明が必要なメソッドについては、別途説明します。ここでは大雑把に3つのステップがあることを理解してください。


Step1. 制約(Constraints):
このステップでAutoLayoutの制約を更新します。制約の更新はsubviewからsuperviewの順番で呼ばれます。


Step2. レイアウト(Layout):
Step1の制約をもとにレイアウトを実行します。ここでViewのcenterとboundsを決定します。レイアウトの更新はsuperviewからsubviewの順番で呼ばれます。


Step3. 描画(Draw):
Step2のレイアウト後にUIViewのdrawRect(rect: CGRect)が呼ばれます。この描画ステップではCore Graphicsを使って描画します。Core Graphicsで描画が必要なアプリはあまり多くないと思いますので、本記事では説明を省略していますが、是非学習してみてください。


以上をまとめると、レイアウトサイクルは1. 制約、2. レイアウト、3. 描画の順番で、ステップ1, 2はUIViewとUIViewControllerの両方にメソッドが用意されています。

ConstraintsとLayoutの更新順序

ここからはそれぞれのサイクルについて詳しく見ていきます。まずは制約についてです。

UIViewの updateConstraints は制約を更新するときに呼ぶメソッドです。サブクラスでオーバーライドして使用します。以下のように書きます。superを最後に呼ぶことに注意してください。

ViewのupdateConstraintsの例
Intrinsic Content Sizeが定義されている方向の例
NSLayoutConstraintの値を更新した場合の例
  • アップデートメソッド: このメソッドで値の更新をします。
  • マークメソッド: アップデートメソッドを呼ぶべきViewにマークをつけます。
  • トリガーメソッド: マークが付いているViewに対してアップデートメソッドをそれぞれ呼びます。

--

--

Learn about Eureka’s engineering efforts, product developments and more.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store