2012-10-08 17 views
14

私はコードでそのサブビューのレイアウトを実行するビューを持っています。レイアウトが自動レイアウトには複雑すぎるため、自動レイアウトによってレイアウトコードが破損します。自動レイアウトでこのビューのサブビューをそのままにする方法はありますか?私はlayoutSubviewsをオーバーライドしようとしましたが、喜びはありません。1つのビューの自動レイアウトをオプトアウトしますか?

ありがとうございました。

答えて

5

ストーリーボードまたはXIBごとに自動レイアウトを有効または無効にします。ビューがそれ自身のXIBにある場合、そのXIBの自動レイアウトを無効にすることができます。 XIBに自動レイアウトに依存する他のビューがある場合は、別の解決策を見つける必要があります。

+1

それを独自のNIBに入れることが唯一の解決策であるようです。 –

+0

ええ、シーンごとにオン/オフを切り替えることはできません。 – Flea

+0

自動レイアウトエンジンが終了した後であれば、サブビューを手動で配置することができます(フレームを設定することもできます)。 – wcochran

2

WWDCビデオで回答が見つかりました。 layoutSubviewsは以前と同じように自動レイアウトでは機能しません。自動レイアウトが起こるのを止めるのではなく、レイアウト中に制約を追加/変更/削除する機会です。

昨夜私はカスタムビューを別のNIBに移動しようとしましたが、それは唯一の解決策であるようです。ビューのサブビューの

2

You can mix auto layout and manual layout!

限りとしてなしは、そのビュー上の別の自動レイアウトパスをトリガーする任意の自動レイアウト制約に関与している、あなたはlayoutSubviewsを上書きして設定することができます手動で各サブビューのフレーム:

class MyView : UIView { 

    // 
    // mySubview is not involved in any constraints 
    // that would trigger another layout pass. 
    // e.g., no explicit constraints set in IB. 
    // 
    @IBOutlet weak var mySubview: UIView! 

    override func layoutSubviews() { 
     super.layoutSubviews() // let auto layout engine run first 

     // 
     // Auto layout engine now done with this view so we can 
     // set the frames how ever we wish since we have the last 
     // word! 
     // 
     mySubview.frame = CGRectMake(...) 
     ... 

    } 

} 

この作品理由があることは後ですが呼び出されたとき、サブビューのフレームを変更すると、ではなくが別のレイアウト・パスをトリガーします(サブビューに関連するすべての制約が満たされ、自動レイアウト・エンジンでそれらが完了します)。 したがって、このメソッドはそのサブビューの位置の最後の単語を取得します。

  • MyViewインスタンスオートレイアウト制約を設定し、すべてが正常に動作します関連していることができます。

  • IBは、限り、あなたはがサブビューに制約を設定しないでないよう警告を発行しません。

+0

macOSでは、サブクラス化するメソッドは 'layout'になります。 – Demitri

関連する問題