iOS Automatische Anpassung von anpassbaren UI-Problemen

9

Ich möchte mein Layout ändern, je nachdem ob die Breite größer als die Höhe ist. Aber ich bekomme immer wieder Layout-Warnungen. Ich beobachte beide WWDC-Videos auf adaptivem Layout, was sehr geholfen hat, aber das Problem nicht gelöst hat. Ich habe eine einfache Version meines Layouts mit dem folgenden Code erstellt. Nur so können Leute mein Problem reproduzieren. Code wird auf dem iPhone 7 Plus ausgeführt.

%Vor%

Wenn ich ein paar Mal rotiere, protokolliert xcode die Warnungen. Ich denke, ich mache den Layout-Wechsel zu früh, weil es sich immer noch ändert, aber ich habe bereits die Höhe im Hochformat auf groß oder so eingestellt. Weiß jemand, was ich falsch mache?

Einschränkungswarnungen: (geschieht beim Zurückgehen von Querformat zu Hochformat)

%Vor%     
Haagenti 15.01.2017, 01:37
quelle

4 Antworten

2

Sie haben Recht, dass Sie die Constraint-Arbeit zu früh machen. Der Code%... ist eine vom System erstellte Einschränkung für die Höhe der View-Controller-Ansicht in der Landschaft - warum ist es 414, genau iPhone 5.5 (6/7 Plus) Höhe in der Landschaft. Die Rotation hat nicht begonnen, die vertikalen Beschränkungen mit dem Constraint-Konflikt mit 450 Höhen und Sie erhalten die Warnung.

Sie müssen also die Abhängigkeiten hinzufügen, nachdem die Rotation abgeschlossen ist. <NSLayoutConstraint:0x600000085d70 'UIView-Encapsulated-Layout-Height' UIView:0x7ff68ec03f50.height == 414 ist der logische Ort, da dieser aufgerufen wird, wenn die Ansichtsgröße bereit ist, aber bevor irgendetwas auf dem Bildschirm erscheint, und das System den Layout-Durchlauf speichern kann, den es gemacht hätte.

Um jedoch die Warnung stummzuschalten, müssen Sie noch die Einschränkungen in viewWillLayoutSubviews entfernen. Das System führt neue automatische Layoutberechnungen durch, bevor viewWillTransition(to size: with coordinator:) aufgerufen wird, und Sie erhalten eine Warnung, wenn Sie von Hochformat auf Querformat wechseln.

BEARBEITEN: Wie @sulthan im Kommentar vermerkt hat, sollten Sie vor dem Hinzufügen von Constraints immer auch Constraints entfernen, da andere Dinge das Layout auslösen können. Wenn viewWillLayoutSubviews() array geleert wurde, gibt es keinen Effekt. Da das Leeren des Arrays nach dem Deaktivieren ein entscheidender Schritt ist, sollte es in einer eigenen Methode sein, also [constraints] .

Denken Sie auch daran, im anfänglichen Layout nach der Orientierung zu suchen - Sie rufen clearConstraints() in layoutPortrait() an, natürlich war das nicht das Problem.

Neue / Methoden ändern:

%Vor%     
Mike Sand 19.01.2017, 03:36
quelle
0

Soweit ich das beurteilen kann, liegt die Warnung tatsächlich daran, dass die Einschränkung zu spät verschoben wird. Die Warnung wird angezeigt, wenn in die Landschaft gedreht wird - die Bedingung 450 ist weiterhin festgelegt und kann nicht erfüllt werden, da die Höhe der Ansicht zu klein ist.

Ich habe mehrere Dinge ausprobiert und am besten funktioniert es, wenn ich die Einschränkung für die kleinere Ansicht festlege, sodass die Höhe der größeren Ansicht immer noch 450 beträgt.

Statt

%Vor%

Ich habe

benutzt %Vor%

und dann in viewWillTransitionToSize :

%Vor%

Bearbeiten:

Die andere Sache, die für mich funktioniert hat (und vielleicht eine allgemeinere Antwort, obwohl ich mir nicht sicher bin, ob sie empfohlen wird): Einschränkungen vor dem Aufruf von super.viewWillTransition deaktivieren und dann den Rest neben dem Übergang animieren. Mein Grundgedanke ist, dass die Beschränkungen sofort entfernt werden, technisch bevor die Rotation beginnt, und sobald die App beginnt, sich in die Landschaft zu drehen (zu diesem Zeitpunkt wäre die alte Höhenbeschränkung unerfüllbar gewesen), sind die Beschränkungen bereits deaktiviert und die neuen können nehmen Wirkung.

%Vor%     
Samantha 17.01.2017 18:33
quelle
0

Ich kam mit der gleichen Antwort wie @ Samantha. Ich musste deactivate jedoch nicht vor dem Aufruf von super aufrufen. Dies ist eine Alternative mit Merkmalssammlungen, aber der transitionToSize -Ansatz funktioniert ähnlich.

%Vor%     
Graham Perks 18.01.2017 20:32
quelle
0

Dies ist der problematische Teil:

%Vor%

Diese Zeile generiert 4 Einschränkungen:

  1. top to a1 distance ist 0 .
  2. Höhe von a1 ist 450 .
  3. a1 bis a2 distance ist 0 .
  4. a2 bis zum unteren Abstand ist 0 .

Die vier Einschränkungen zusammen brechen im Querformat, da die Gesamthöhe des Bildschirms kleiner als 450 ist.

Was Sie jetzt tun, ist die Aktualisierung der Einschränkungen, bevor Sie in den Querformat-Modus wechseln, und das funktioniert, wenn Sie von Hochformat auf Querformat umschalten. Wenn Sie jedoch von Querformat zu Hochformat wechseln, ändern Sie Ihre Randbedingungen zu früh und für kurze Zeit erhalten Sie im Querformat Hochformat-Einschränkungen, die diese Warnung auslösen.

Beachten Sie, dass Ihre Einschränkungen im Wesentlichen nicht falsch sind. Wenn Sie Ihre Warnung beheben möchten, ist meiner Meinung nach die beste Lösung, die Priorität einer Ihrer Einschränkungen zu reduzieren, z. die Höhenbeschränkung:

%Vor%     
Sulthan 18.01.2017 21:05
quelle