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.
Es scheint die einzige Lösung zu sein, es in seine eigene NIB zu setzen. –
Ja, es ist scheiße, du kannst es nicht pro Szene ein- oder ausschalten. – Flea
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