14

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

助けてくれてありがとう。

4

3 に答える 3

5

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

于 2012-10-08T20:14:41.433 に答える
2

自動レイアウトと手動レイアウトを混在させることができます!

ビューのサブビューが、そのビューで別の自動レイアウト パスをトリガーする自動レイアウト制約に関与していない限り、各サブビューのフレームを手動でオーバーライドして設定できます。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 は警告を発行しません。

于 2016-01-23T00:33:54.480 に答える
2

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

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

于 2012-10-17T16:58:57.863 に答える