開発メモ

開発関係のメモをいろいろと。たぶん。

特定の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