特定のViewだけAutoLayoutをオフにする方法のメモ
基本的にはAutoLayoutを使用して配置するけど、特定のViewの中だけ自分でframeを指定したい時、そのViewだけAutoLayoutをオフにする方法のメモ。
動作を確認した環境
環境 | 情報 |
---|---|
Xcode | 6.3 (6D570) |
iOS | 8.3 |
Swift | 1.2 |
Date | 2015/4/27 |
AutoLayoutをオフにしない場合
AutoLayoutをオフにしないで自力でframeを変更した場合、いくつか問題が起こる。
- 最初の表示で画面に反映されるのが一瞬遅れる
- 画面の回転でframeが元に戻る
根本的に解決しようと思ったら、AutoLayoutをオフにするのが楽かな、と。
設定方法
説明するよりソースを見てもらったほうが早い。こんな感じ。
func autoLayoutOff(view: UIView) { // 制約を全て削除 let ar = view.constraints() view.removeConstraints(ar) // 基準になるViewは自動変換を使わない view.setTranslatesAutoresizingMaskIntoConstraints(false) // 子Viewは自動変換をONに for child in view.subviews { if let child = child as? UIView { child.setTranslatesAutoresizingMaskIntoConstraints(true) } } }
AutoLayoutをオフにするViewはsetTranslatesAutoresizingMaskIntoConstraints()がfalseで、その子Viewはtrueに設定するのがポイント。たぶん。
参考資料
See_Ku / AutoLayoutTips — Bitbucket
https://bitbucket.org/See_Ku/autolayouttips
xcode - Can I disable autolayout for a specific subview at runtime? - Stack Overflow
http://stackoverflow.com/questions/11368440/can-i-disable-autolayout-for-a-specific-subview-at-runtime