2012-10-08 5 views
14

Ich habe eine Ansicht, die das Layout ihrer Subviews im Code ausführt. Das Layout ist zu komplex für das automatische Layout und das automatische Layout bricht den Layout-Code. Gibt es eine Möglichkeit, das automatische Layout zu erzwingen, die Subviews dieser Ansicht in Ruhe zu lassen? Ich habe versucht, LayoutSubviews zu überschreiben, aber keine Freude.Sie haben das automatische Layout für eine einzelne Ansicht deaktiviert?

Danke für jede Hilfe.

Antwort

5

Auto-Layout wird pro Storyboard oder XIB aktiviert oder deaktiviert. Wenn sich Ihre Ansicht in einer eigenen XIB befindet, können Sie das automatische Layout für diese XIB deaktivieren. Wenn in Ihrem XIB andere Ansichten vorhanden sind, die auf automatischem Layout basieren, müssen Sie eine andere Lösung finden.

+1

Es scheint die einzige Lösung zu sein, es in seine eigene NIB zu setzen. –

+0

Ja, es ist scheiße, du kannst es nicht pro Szene ein- oder ausschalten. – Flea

+0

Sie * können * Subviews manuell positionieren (d. H. Ihre Frames festlegen) für eine bestimmte Ansicht, solange Sie es tun * nachdem * die automatische Layout-Engine mit ihnen fertig ist (siehe meine Antwort unten). – wcochran

2

Die Antwort in den WWDC-Videos gefunden. layoutSubviews funktioniert unter dem automatischen Layout nicht wie zuvor. Es verhindert nicht das automatische Layout, sondern bietet die Möglichkeit, Einschränkungen während des Layouts hinzuzufügen, zu ändern oder zu entfernen.

Letzte Nacht habe ich versucht, die benutzerdefinierte Ansicht auf eine andere NIB zu verschieben, und das scheint die einzige Lösung zu sein.

2

You can mix auto layout and manual layout!

Solange keine eine Subviews Ansicht in alle Autolayoutbeschränkungen beteiligt sind, die ein anderes Auto-Layout auf dieser Ansicht passieren auslösen würden, können Sie layoutSubviews außer Kraft setzen und setzen die Rahmen in jeder Unteransicht manuell:

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(...) 
     ... 

    } 

} 

Der Grund dafür ist, dass nach super.layoutSubviews() wird aufgerufen, Ändern der Frames auf beliebige Untersichten tut nicht triggern einen anderen Layout-Durchlauf (alle Einschränkungen im Zusammenhang mit Subviews sind zufrieden und die Auto-Layout-Engine ist mit ihnen getan); daher erhält diese Methode das letzte Wort über die Position ihrer Subviews!

  • Beachten Sie, dass MyView Instanzen können Einschränkungen Auto Layout im Zusammenhang gesetzt haben und alles funktioniert.

  • IB gibt keine Warnungen, solange Sie tun nicht auf den Subviews keine Einschränkungen gesetzt.

+0

Auf Mac OS wäre die Methode zur Unterklasse 'layout'. – Demitri

Verwandte Themen