コードでサブビューのレイアウトを実行するビューがあります。自動レイアウトにはレイアウトが複雑すぎます。自動レイアウトはレイアウト コードを壊します。このビューのサブビューをそのままにして自動レイアウトを強制する方法はありますか? 私はlayoutSubviewsをオーバーライドしようとしましたが、喜びはありません.
助けてくれてありがとう。
コードでサブビューのレイアウトを実行するビューがあります。自動レイアウトにはレイアウトが複雑すぎます。自動レイアウトはレイアウト コードを壊します。このビューのサブビューをそのままにして自動レイアウトを強制する方法はありますか? 私はlayoutSubviewsをオーバーライドしようとしましたが、喜びはありません.
助けてくれてありがとう。
自動レイアウトは、ストーリーボードまたは XIB ごとに有効または無効になります。ビューが独自の XIB にある場合は、その XIB の自動レイアウトを無効にすることができます。XIB に自動レイアウトに依存する他のビューがある場合は、別の解決策を見つける必要があります。
ビューのサブビューが、そのビューで別の自動レイアウト パスをトリガーする自動レイアウト制約に関与していない限り、各サブビューのフレームを手動でオーバーライドして設定できます。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(...)
...
}
}
これが機能する理由は、super.layoutSubviews()
が呼び出された後、サブビューのフレームを変更しても別のレイアウト パスがトリガーされないためです (サブビューに関連するすべての制約が満たされ、自動レイアウト エンジンがそれらを処理します)。したがって、このメソッドはサブビューの位置に関する最後の単語を取得します!
MyView
インスタンスには関連する自動レイアウト制約を設定でき、すべてが正常に機能することに注意してください。
サブビューに制約を設定しない限り、IB は警告を発行しません。
WWDC ビデオで答えを見つけました。layoutSubviews は、以前と同じように自動レイアウトでは機能しません。自動レイアウトの発生を止めるものではなく、レイアウト中に制約を追加/変更/削除する機会です。
昨夜、カスタム ビューを別の NIB に移動しようとしましたが、それが唯一の解決策のようです。