私はコードでそのサブビューのレイアウトを実行するビューを持っています。レイアウトが自動レイアウトには複雑すぎるため、自動レイアウトによってレイアウトコードが破損します。自動レイアウトでこのビューのサブビューをそのままにする方法はありますか?私はlayoutSubviewsをオーバーライドしようとしましたが、喜びはありません。1つのビューの自動レイアウトをオプトアウトしますか?
ありがとうございました。
私はコードでそのサブビューのレイアウトを実行するビューを持っています。レイアウトが自動レイアウトには複雑すぎるため、自動レイアウトによってレイアウトコードが破損します。自動レイアウトでこのビューのサブビューをそのままにする方法はありますか?私はlayoutSubviewsをオーバーライドしようとしましたが、喜びはありません。1つのビューの自動レイアウトをオプトアウトしますか?
ありがとうございました。
ストーリーボードまたはXIBごとに自動レイアウトを有効または無効にします。ビューがそれ自身のXIBにある場合、そのXIBの自動レイアウトを無効にすることができます。 XIBに自動レイアウトに依存する他のビューがある場合は、別の解決策を見つける必要があります。
WWDCビデオで回答が見つかりました。 layoutSubviewsは以前と同じように自動レイアウトでは機能しません。自動レイアウトが起こるのを止めるのではなく、レイアウト中に制約を追加/変更/削除する機会です。
昨夜私はカスタムビューを別のNIBに移動しようとしましたが、それは唯一の解決策であるようです。ビューのサブビューの
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は、限り、あなたはがサブビューに制約を設定しないでないよう何警告を発行しません。
macOSでは、サブクラス化するメソッドは 'layout'になります。 – Demitri
それを独自のNIBに入れることが唯一の解決策であるようです。 –
ええ、シーンごとにオン/オフを切り替えることはできません。 – Flea
自動レイアウトエンジンが終了した後であれば、サブビューを手動で配置することができます(フレームを設定することもできます)。 – wcochran