なんとかするから、なんとかなる

エンジニア関係のことを書きます

iOS のAutoLayout(オートレイアウト)を扱うときのTipsまとめ

AutoLayout

AutoLayoutエンジン

AutoLayoutエンジンは外接矩形(装飾(影など)を除いたViewで計算)

Debugのテク

デバッグ中に外接矩形を見るためには [Product]->[Scheme]->[EditScheme]->[Run]->[Argument]に-UIViewShowAlignmentRectsを追加

Instric Content Size(固有の寸法)

圧縮や切り出しをせずに表示するための最低限必要なサイズ

レイアウトのサイクル

  1. 制約の更新 UpdateConstraint 子Viewから親Viewにかけて計算される
  2. フレームの更新 layoutSubviews 親Viewから子Viewにかけて計算される
  3. レンダリング

各メソッドでの動き

layoutSubviews

  • super.layoutSubviewsを呼ぶまで、フレームは更新なし
  • 親Viewのレイアウトは変えてはいけない 無限ループとなる。トップダウンでレイアウト更新する

loadView()

  • StoryBoardを用いない場合は、super.loadViewを呼ばずにコードで書く super.loadViewを呼ぶとself.viewが生成される
  • self.viewが必要ならsuper.loadViewを呼ぶ。ただしコードでself.viewを追加してもOK

viewWillAppear()

  • viewControllerのself.viewのフレームは確定
  • サブViewのレイアウトは未確定、端末の向きも未確定

viewWillLayoutSubviews()

  • サブViewのレイアウトは未確定、端末の向きは確定
  • Autolayout使用時に、画面の状態(向き)によって制約を変更する時はここで変更する

viewDidLayaoutSubviews()

  • サブViewのフレームが確定

viewDidAppear()

  • ユーザ体験に直接影響を与えない処理
  • ログをの送信などに向いている
  • 表示のたびに呼ばれる

制約の関係式

firstItem.Attribute = secondItem.Attribute * multiplier + Const(定数)

InstricContentSize

  • InstricContentSizeは何もしなければつく制約
  • InstricContentSizeの優先度は低いため、明示的に付与するのが安全

UIStackViewについて

  • DistributionをFillにすると 内部ViewにはInstricContentSizeでUIStackViewの軸方向に制約がつく 横ならwidth, 縦ならheight

Stroyboard上にて制約をつけるとき

  • [constraint to Margin]にチェックを入れると、もっとも近いViewのマージンに対して制約がつく

注意点

  • スレッドセーフでないため、必ずメインスレッドで実行すること
  • iOS9からは画面のサイズはUIScreenでなくUIWindowから取得する

よくわかるAuto Layout iOSレスポンシブデザインをマスター

よくわかるAuto Layout iOSレスポンシブデザインをマスター