2017-08-14 2 views
1

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 

} 
+1

Zeigen Sie den Code für Ihre Setup-Methoden. Bearbeiten Sie die vorhandene Einschränkung oder erstellen Sie einfach eine zusätzliche? – dan

+0

Habe gerade den Post mit den Methoden aktualisiert. – Andrei

Antwort

2

die Frage wird Ihnen neue Zwänge schaffen .. versuchen, einen Verweis auf Ihre Constraint halten und Ihre Methoden ändern sie

func setupCompactRegular() { 

    self.bigLabelCenterYAnchor.constant = -150 

} 

func setupRegularCompact() { 

    self.bigLabelCenterYAnchor.constant = 50 

} 

Anruf layoutIfNeeded() direkt nach zu aktualisieren, wenn Es wird nicht automatisch aktualisiert

+0

Vielen Dank für Ihre Hilfe, aber ich bin neu in diesem Bereich und es fällt mir schwer herauszufinden, wie ich auf meine Einschränkungen achten soll. Könnten Sie bitte im Code angeben, was genau wohin geht, wie die Referenz erstellt und gehalten wird und wo genau layoutIfNeeded() aufgerufen wird? Tausend Dank! – Andrei

+0

P.S. Was ist BigLabelCenterYAnchor? Ist es eine globale Variable oder eine Eigenschaft vom Typ CGFloat oder was? Wenn ja, wo sollte es erstellt werden und wie wird es angewendet, wenn Anker verwendet werden? Oder vielleicht meintest du self.bigLabel.centerYAnchor? Wenn ja, dann gibt es kein solches Mitglied als konstant. Sorry für diese neuen Fragen, aber ich bin überwältigt von diesem Zeug. – Andrei