adaptive-layout

___ qstntxt ___

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%     
___ qstnhdr ___ iOS Automatische Anpassung von anpassbaren UI-Problemen ___ answer41733277 ___

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. %code% 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 %code% entfernen. Das System führt neue automatische Layoutberechnungen durch, bevor %code% 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 %code% 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 %code% .

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

Neue / Methoden ändern:

%Vor%     
___ answer41704495 ___

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 %code% :

%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 %code% 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%     
___ answer41728924 ___

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

%Vor%     
___ tag123swift ___ Swift ist eine universelle Open-Source-Programmiersprache, die von Apple Inc. für ihre Plattformen und Linux entwickelt wurde. Verwenden Sie das Tag nur für Fragen zu Sprachfunktionen oder für Code in Swift. Verwenden Sie die Tags [ios], [osx], [watch-os], [tvos], [cocoa-touch] und [cocoa] für (sprachunabhängige) Fragen zu den Plattformen oder Frameworks. ___ tag123autolayout ___ Auto Layout ist ein auf Einschränkungen basierendes, beschreibendes Benutzeroberflächen-Layoutsystem für OS X und iOS. ___ answer41729427 ___

Dies ist der problematische Teil:

%Vor%

Diese Zeile generiert 4 Einschränkungen:

  1. top to %code% distance ist %code% .
  2. Höhe von %code% ist %code% .
  3. %code% bis %code% distance ist %code% .
  4. %code% bis zum unteren Abstand ist %code% .

Die vier Einschränkungen zusammen brechen im Querformat, da die Gesamthöhe des Bildschirms kleiner als %code% 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%     
___ tag123adapelayout ___ Das adaptive Layout ist eine Technik zur Unterstützung mehrerer Anzeigegrößen und -ausrichtungen in iOS-Anwendungen. ___ tag123ios ___ iOS ist das mobile Betriebssystem, das auf dem Apple iPhone, iPod touch und iPad ausgeführt wird. Verwenden Sie dieses Tag [ios] für Fragen zur Programmierung auf der iOS-Plattform. Verwenden Sie die verwandten Tags [objective-c] und [swift] für Probleme, die für diese Programmiersprachen spezifisch sind. ___
4
Antworten

iOS Automatische Anpassung von anpassbaren UI-Problemen

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...
15.01.2017, 01:37