iOS のAutoLayout(オートレイアウト)を扱うときのTipsまとめ
AutoLayout
AutoLayoutエンジン
AutoLayoutエンジンは外接矩形(装飾(影など)を除いたViewで計算)
Debugのテク
デバッグ中に外接矩形を見るためには [Product]->[Scheme]->[EditScheme]->[Run]->[Argument]に-UIViewShowAlignmentRectsを追加
Instric Content Size(固有の寸法)
圧縮や切り出しをせずに表示するための最低限必要なサイズ
レイアウトのサイクル
- 制約の更新 UpdateConstraint 子Viewから親Viewにかけて計算される
- フレームの更新 layoutSubviews 親Viewから子Viewにかけて計算される
- レンダリング
各メソッドでの動き
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レスポンシブデザインをマスター
- 作者: 川邉雄介,所友太
- 出版社/メーカー: リックテレコム
- 発売日: 2016/06/17
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る