Ich habe versucht, mit dem Erstellen von adaptiven Layouts in reinem Code (keine Storyboards verwendet) zu beginnen. Ich verwende Layoutanker, um Constraints zu setzen und traitCollectionDidChange zu verwenden, um zwischen verschiedenen Constraint-Sets und anderen Schnittstellenänderungen zu variieren. Ich benutze eine switch-Anweisung, um die entsprechende Methode mit dem entsprechenden Satz von Constraints aufzurufen.Ändern der Klassen in Code (Swift)
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
switch (traitCollection.horizontalSizeClass, traitCollection.verticalSizeClass) {
case (.regular, .regular):
setupRegularRegular()
case (.compact, .compact):
setupCompactCompact()
case (.regular, .compact):
setupRegularCompact()
case (.compact, .regular):
setupCompactRegular()
default: break
}
}
Zum Zwecke des Testens, verändert ich nur eine Einschränkung, die centerYAnchor.constraint ist. Im Portrait ist die ständige -150, in der Landschaft Ich will es auf 50. Für iPad geändert werden, stelle ich die Konstante auf 0.
bigLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: -150).isActive = true
Es funktioniert gut, wenn zwischen iPhone und iPad wechseln. Wenn Sie jedoch das Drehen des iPhone von Hoch- auf Querformat starten, kann das Layout-System, nämlich:
[LayoutConstraints] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0x600000097890 UILabel:0x7fac02c08aa0'Main Label'.centerY == UIView:0x7fac02e0a950.centerY - 150 (active)>",
"<NSLayoutConstraint:0x604000097840 UILabel:0x7fac02c08aa0'Main Label'.centerY == UIView:0x7fac02e0a950.centerY + 50 (active)>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x604000097840 UILabel:0x7fac02c08aa0'Main Label'.centerY == UIView:0x7fac02e0a950.centerY + 50 (active)>
Ich habe versucht, verschiedene Methoden überschreiben und die isActive Eigenschaft der Beschränkung auf false gesetzt und dann auf true zurück, aber das hat nicht geholfen. Ich habe ein paar Tage im Internet gesucht. Bisher keine Lösung. Meine Frage ist also, wie wechseln Sie beim Drehen des Geräts tatsächlich zwischen den Größenklassen hin und her? Ist es notwendig, eine andere Methode oder etwas zu überschreiben? Gibt es eine bessere Lösung für ein adaptives Layout in reinem Code? Gibt es Best Practices für adaptive Layouts/Größenklassen/Layout-Anker und Einschränkungen im Code (ohne Verwendung des Storyboards)? Danke für Hilfe!
P.S. die Methoden Einschränkungen der Einrichtung sind:
func setupCompactRegular() {
bigLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: -150).isActive = true
}
func setupRegularCompact() {
bigLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 50).isActive = true
}
Zeigen Sie den Code für Ihre Setup-Methoden. Bearbeiten Sie die vorhandene Einschränkung oder erstellen Sie einfach eine zusätzliche? – dan
Habe gerade den Post mit den Methoden aktualisiert. – Andrei