Die mathematischen Grundlagen des automatischen Layouts

Viele Entwickler glauben, dass Auto Layout eine Bremse und ein Problem ist, und es ist Ă€ußerst schwierig, es zu debuggen. Und es ist gut, wenn diese Schlussfolgerung auf der Grundlage meiner eigenen Erfahrung gezogen wird, ansonsten ist es nur "Ich habe gehört, ich werde nicht einmal versuchen, mich mit ihm anzufreunden".

Aber vielleicht liegt der Grund nicht draußen, sondern drinnen. Zum Beispiel werden die gefĂ€hrlichsten Vögel in der Welt des Kasuars Menschen nicht ohne Grund angreifen, sondern nur zur Selbstverteidigung. Versuchen Sie daher fĂŒr eine Sekunde anzunehmen, dass dies kein schlechtes automatisches Layout ist und Sie es nicht gut genug verstehen und nicht wissen, wie man kocht. Dies hat Anton Sergejew getan und sich mit der Theorie befasst, um alles genau zu verstehen. Wir erhalten einen vorgefertigten Überblick ĂŒber die mathematischen Grundlagen des automatischen Layouts.




Auto Layout ist ein Layoutsystem . Bevor wir uns damit befassen, lassen Sie uns ĂŒber den modernen Satz im Allgemeinen sprechen. Dann beschĂ€ftigen wir uns mit dem automatischen Layout - wir werden herausfinden, welche Aufgabe es löst und wie es es macht. BerĂŒcksichtigen Sie die Funktionen bei der Implementierung von Auto Layout in iOS und versuchen Sie, praktische Tipps zu entwickeln, die Ihnen bei der Arbeit helfen können.

Diese Geschichte wird einem mathematischen Artikel sehr nahe kommen, daher einigen wir uns zunÀchst auf die Notation, um dieselbe Sprache zu sprechen.


Über den Sprecher: Anton Sergeev ( antonsergeev88 ) arbeitet im Yandex.Mart-Team und befasst sich mit dem mobilen Client fĂŒr Maps unter iOS. Vor der mobilen Entwicklung beschĂ€ftigte er sich mit Kraftwerkssteuerungssystemen, bei denen die Kosten fĂŒr Fehler im Code zu hoch sind, um toleriert zu werden.

Bezeichnungen


Die linearen Gleichungssysteme sind uns seit der Schule bekannt - sie sind durch eine geschweifte Klammer gekennzeichnet und ihre Lösung ist bereits ohne. Außerdem haben lineare Gleichungssysteme EntitĂ€ten, die mit EinschrĂ€nkungen fĂŒr das automatische Layout arbeiten. Sie sind durch eine gerade Linie gekennzeichnet.



Der seltsame und, wie wir bereits wissen, gefĂ€hrliche Vogel wird nicht versehentlich in die obere Ecke der Rutsche gemalt. Zu Ehren des Kasuars (lat. Cassowary), der natĂŒrlich in Australien lebt, ist in allen unseren iPhones ein Algorithmus benannt.

Das automatische Layout hat seine eigenen EinschrÀnkungen. Wir werden sie mit Farben in der Reihenfolge ihrer PrioritÀt kennzeichnen: Rot - erforderlich; gelb - hoch; blau - niedrig.

Layout


Als ich die PrĂ€sentation zusammenstellte, platzierte ich verschiedene Elemente auf dem Bildschirm, zum Beispiel einen Kasuar. Dazu habe ich festgestellt, dass der Kasuar ein rechteckiges Bild ist. Sie mĂŒssen es auf einem Blatt anordnen, das Achsen und ein eigenes Koordinatensystem hat, und dafĂŒr habe ich die Koordinaten der oberen linken Ecke, Breite und Höhe bestimmt.



Die Kenntnis dieser vier Werte reicht aus, um jede Ansicht darzustellen.

Algorithmus Nr. 1


WÀhrend wir den Kasuar auf das Blatt legten, haben wir den ersten Layout-Algorithmus unauffÀllig beschrieben:

  • Bestimmen Sie die Koordinaten und GrĂ¶ĂŸen;
  • Wenden Sie sie auf UIView an.

Der Algorithmus funktioniert, ist aber ziemlich schwierig zu verwenden, daher werden wir ihn weiter vereinfachen.

Angenommen, unten ist eine Lösung fĂŒr ein lineares Gleichungssystem.



Das System der linearen Gleichungen ist insofern besonders, als viele Operationen darĂŒber definiert sind: Falten von Linien, Multiplizieren mit Konstanten usw. Diese Operationen werden lineare Transformationen genannt, und mit ihrer Hilfe wird das System auf eine beliebige Form reduziert.

Das Schöne an linearen Transformationen ist, dass sie reversibel sind. Dies bringt uns zu einer interessanten und eher subtilen Idee, mit der das gesamte moderne Layout beginnt.

Es soll eine Ansicht geben - ein Rechteck mit seinen Koordinaten und seiner GrĂ¶ĂŸe. Wir wollen es so anordnen, dass das Zentrum mit dem gegebenen Punkt ĂŒbereinstimmt. Wir modellieren das Zentrum mit linearen Transformationen - der Koordinate der oberen linken Ecke + der halben Breite .



Wir haben das Zentrum durch lineare Transformation modelliert, es war nicht so: Es gab nur die Koordinaten des oberen linken Punktes, der Breite und der Höhe.

Ebenso können Sie jede andere EinrĂŒckung simulieren, z. B. 20 Punkte von der rechten Ecke.

Es ist die Idee linearer Transformationen, die es uns ermöglicht, verschiedene Satzsysteme zu erstellen.

Betrachten Sie ein elementares Beispiel. Wir schreiben ein System auf, mit dem wir die Koordinaten der mittleren und rechten Seite, die Breite und das VerhÀltnis zwischen Breite und Höhe festlegen. Wir lösen das System und bekommen die Antwort.



Wir kommen also zum zweiten Algorithmus.

Algorithmus Nr. 2


Die zweite Iteration des Algorithmus besteht aus folgenden Elementen:

  • ein lineares Gleichungssystem bilden;
  • wir lösen es;
  • Wenden Sie die Lösung auf UIView an.

Stellen Sie sich vor, wir befanden uns im 20. Jahrhundert, zu einer Zeit, als die ComputerausrĂŒstung noch in den Kinderschuhen steckte, und wir waren die ersten, die unser eigenes Layoutsystem entwickelten. Erfunden, verpackt, dem Benutzer ĂŒbergeben und er beginnt, es zu verwenden - fĂŒllt die Anfangsparameter aus und ĂŒbertrĂ€gt es auf unser System.



Es gibt ein Problem - dieses System hat keine einzige Lösung. Das Problem ist nicht außergewöhnlich, absolut alle Layout-Systeme stoßen darauf und wird als Fehlen einer Lösung bezeichnet .

Es gibt nicht so viele Auswege aus dieser Situation:

  • Sie können fallen - dies ist eine sehr hĂ€ufige Methode. Diejenigen, die mit MacOS arbeiten, wissen, dass NSLayoutConstraintManager genau das tut.
  • Gibt den Standardwert zurĂŒck . Im Kontext des Layouts können wir immer alle Nullen zurĂŒckgeben.
  • Eine bekanntere und heikelere Methode besteht darin, falsche Eingaben zu verhindern . Diese Methode wird von gĂ€ngigen Layoutsystemen verwendet, z. B. Yoga , bekannt als Flex Layout . Solche Systeme versuchen, eine Schnittstelle zu erstellen, die keine falschen Eingaben zulĂ€sst.
  • Es gibt einen anderen Weg, um absolut alle Probleme zu lösen - alles von Anfang an zu ĂŒberdenken und zunĂ€chst das Auftreten dieses Problems zu verhindern . Auto Layout ging diesen Weg.

Automatisches Layout ErklÀrung und Lösung des Problems


Wir haben ein rechteckiges Bild und um es eindeutig zu identifizieren, benötigen wir 4 Parameter:

  • Koordinaten der oberen linken Ecke;
  • Breite und Höhe.



Auto Layout ist sehr ausfĂŒhrlich. Im Vergleich zu einem linearen Gleichungssystem ist es viel schwieriger, alles damit auf dem Bildschirm zu platzieren. Daher werden wir den eindimensionalen Fall ohne Verlust der Allgemeinheit betrachten.



Alles ist sehr einfach: Der Raum ist eine gerade Linie, und alle Objekte, die darin platziert werden können, sind Punkte auf einer geraden Linie. Ein Wert: X = X P reicht aus, um die Position des Punktes zu bestimmen.

Betrachten Sie den Ansatz des automatischen Layouts. Es gibt einen Bereich, in dem EinschrÀnkungen festgelegt werden. Die Lösung, die wir bekommen wollen, ist X = X 0 und keine andere.

Es gibt ein Problem - wir haben keine Operationen mit EinschrĂ€nkungen definiert. Wir können nicht direkt aus dem Datensatz schließen, dass X = X 0 ist , wir können nichts multiplizieren oder irgendetwas hinzufĂŒgen. Dazu mĂŒssen wir die EinschrĂ€nkung in das umwandeln, mit dem wir arbeiten können - in ein System von Gleichungen und Ungleichungen.



Auto Layout transformiert ein System von Gleichungen und Ungleichungen wie folgt.

  • ZunĂ€chst werden zwei zusĂ€tzliche Variablen eingefĂŒhrt, die nicht negativ sind und voneinander abhĂ€ngen . Mindestens einer von ihnen ist gleich Null.
  • Die EinschrĂ€nkung selbst wird in die Notation X = X 0 + a + - a - konvertiert.

Punkt X 0   - Lösung des Systems: Wenn a + und a - gleich Null sind, ist dies wahr. Aber jeder andere Punkt auf dieser Linie wird eine Lösung sein.

Daher ist es notwendig, das Beste aus der ganzen Reihe von Lösungen zu finden. Zu diesem Zweck fĂŒhren wir eine Funktion ein - eine gewöhnliche Funktion, die eine Zahl zurĂŒckgibt, und wir können Zahlen vergleichen. Wir zeichnen ein Diagramm und stellen fest, dass die Lösung, die wir ursprĂŒnglich erhalten wollten, ein Minimum ist.

Ich habe ein lineares Programmierproblem . Genau das macht Auto Layout mit EinschrÀnkungen, die nicht nur in Form von Gleichheiten, sondern auch in Form von Ungleichungen vorliegen.

UngleichheitsbeschrÀnkungen


Bei UngleichheitsbeschrĂ€nkungen erfolgt die Transformation auf die gleiche Weise wie bei Gleichheiten: Zwei zusĂ€tzliche Variablen werden eingefĂŒhrt und all dies wird im System gesammelt. Nur die Funktion ist unterschiedlich und gleich a - .



Die obige Grafik zeigt, warum dies so ist - jeder Wert von a + mit a - = 0 (von X 0 bis + ∞ ) ist die optimale Lösung fĂŒr das Problem.

Versuchen wir, diese beiden EinschrÀnkungen von Gleichungen und Ungleichungen zu einer zu kombinieren. Da die EinschrÀnkungen nicht isoliert leben, werden sie zusammen auf das gesamte System angewendet.



FĂŒr jede EinschrĂ€nkung wird ein zusĂ€tzliches Variablenpaar eingefĂŒhrt und die Funktion kompiliert. Da wir möchten, dass alle diese EinschrĂ€nkungen gleichzeitig erfĂŒllt werden, ist die Funktion gleich der Summe aller Funktionen aus jeder EinschrĂ€nkung .

Wir sammeln die Funktion f und sehen, dass die Lösung X 1 ist . Wie wir erwartet hatten, EinschrÀnkungen. Wir kommen also zum dritten Algorithmus.

Algorithmus Nr. 3


Um etwas zu tun, brauchen Sie:

  • ein System linearer EinschrĂ€nkungen erstellen;
  • verwandeln Sie es in ein lineares Programmierproblem;
  • Lösen Sie das Problem auf eine bekannte Weise, z. B. die Simplex-Methode , die im automatischen Layout verwendet wird.
  • Wenden Sie die Lösung auf UIView an.

Dieser Algorithmus scheint ausreichend zu sein, aber betrachten Sie den folgenden Fall: Wir Ă€ndern den anfĂ€nglichen Satz von EinschrĂ€nkungen so, dass die zweite EinschrĂ€nkung jetzt X ≄ X 2 ist .



Welche Lösung erwarten wir?

  • X 1 ? In der Tat wird in der ersten EinschrĂ€nkung so geschrieben: X = X 1 , und diese Lösung widerspricht der zweiten EinschrĂ€nkung.
  • X 2 ? Es wird bereits einen Konflikt mit der ersten EinschrĂ€nkung geben.

Um aus der Situation herauszukommen, werden wir Transformationen durchfĂŒhren, die wir bereits zu tun wissen.

Das Diagramm der neuen FunktionalitĂ€t sieht anders aus: Jeder Punkt aus dem Intervall von X 1 bis X 2 ist die richtige gĂŒltige Lösung des Systems. Dies nennt man Unsicherheit .

Unsicherheit


Auto Layout verfĂŒgt ĂŒber einen Mechanismus zur Lösung solcher Probleme - PrioritĂ€ten . Ich erinnere Sie daran, dass Gelb eine hohe PrioritĂ€t und Blau eine niedrige PrioritĂ€t anzeigt.



EinschrĂ€nkungen konvertieren. Bitte beachten Sie, dass das resultierende System nur schwarz ist. Wir wissen, wie man damit arbeitet, und es gibt keine Informationen ĂŒber EinschrĂ€nkungen. Es liegt in den Funktionen, von denen es zwei geben wird. Das automatische Layout minimiert zuerst das erste und dann das zweite.

Bei linearen Programmierproblemen suchen wir nicht nach der Lösung selbst, sondern nach einer Reihe praktikabler Lösungen. NatĂŒrlich soll dieser Bereich nur ein Punkt sein, und das automatische Layout verhĂ€lt sich genauso. Erstens minimiert es die Funktion mit der höchsten PrioritĂ€t fĂŒr ( - ∞, + ∞) und erhĂ€lt am Ausgang eine DomĂ€ne möglicher Lösungen. Das automatische Layout löst das zweite lineare Programmierproblem bereits im erhaltenen Bereich zulĂ€ssiger Werte. Ein solcher Mechanismus wird als Hierarchie von EinschrĂ€nkungen bezeichnet und ergibt in diesem Problem den Punkt X 2 .

Algorithmus Nr. 4


  • Erstellen Sie eine Hierarchie linearer EinschrĂ€nkungen.
  • verwandeln Sie es in eine lineare Programmieraufgabe;
  • Lösen Sie nacheinander das Problem der linearen Programmierung - von der höchsten zur niedrigsten PrioritĂ€t.
  • Wenden Sie die Lösung auf UlView an.

Schauen wir uns noch einmal die vorherige Aufgabe an. Wir sind keine Mathematiker, sondern Ingenieure, und jeder Ingenieur sollte hier verwirrt sein.

Hier gibt es ein ernstes Problem - Unendlichkeit , und ich weiß nicht, was es ist.

Der Cassowary-Algorithmus unter der Haube von Auto Layout war kein vorhandener Mechanismus, der bequemerweise auf die Aufgabe Auto Layout fiel, sondern als Layout-Tool gedacht war, und er bot zu Beginn spezielle Mechanismen, um der Unendlichkeit zu entkommen. Hierzu wurden verschiedene Arten von BeschrÀnkungen erfunden:

  • Parameter sind die EinschrĂ€nkungen, mit denen wir gearbeitet haben. Sie werden im Original als Einstellungen bezeichnet, manchmal in der Apple-Dokumentation - optionale EinschrĂ€nkungen .
  • Anforderungen oder Anforderungen - EinschrĂ€nkungen mit PrioritĂ€t erforderlich .

Lassen Sie uns sehen, wie Anforderungen mit solchen PrioritÀten aus mathematischer Sicht transformiert werden.



Wir haben wieder eine gerade Linie mit zwei Punkten und die erste EinschrÀnkung ist X = X 1 . Auf der Folie ist es rot, dh diese EinschrÀnkung mit der erforderlichen PrioritÀt - wir nennen es eine Anforderung.

Auto Layout konvertiert es in ein System linearer Gleichungen, das eine Gleichung X = X 1 enthÀlt . Nichts mehr - keine linearen Programmieraufgaben, keine Optimierungen.

Ähnlich verhĂ€lt es sich mit Ungleichungen, die jedoch etwas komplizierter sind. Es wird eine zusĂ€tzliche Variable angezeigt, die Werte grĂ¶ĂŸer als 0 annehmen kann. FĂŒr Werte grĂ¶ĂŸer als 0 wird diese EinschrĂ€nkung erfĂŒllt. Bitte beachten Sie, dass hier keine linearen Programmieraufgaben und Optimierungen vorhanden sind.

Versuchen wir, all dies zu kombinieren, zwei Anforderungen zusammenzustellen und sie in ein System umzuwandeln. Ein aufmerksamer Leser stellte fest, dass wir zu demselben Thema gekommen sind, mit dem wir begonnen haben - die Anforderungen sollten konsistent sein .



Erforderliche EinschrĂ€nkungen oder Anforderungen sind ein sehr leistungsfĂ€higes Werkzeug, aber nicht das Hauptwerkzeug, sondern das Hilfswerkzeug. Es wurde speziell in Auto Layout eingefĂŒhrt, um das Problem der unendlichen Intervalle zu lösen. Es muss sorgfĂ€ltig verwendet werden.

Versuchen wir, alle Arten von EinschrÀnkungen, die wir getroffen haben, in einem System zu kombinieren. Angenommen, wir möchten das Problem nicht auf der gesamten Linie lösen, sondern nur zwischen X 0 und X 3 . Wenn wir all dies in ein System linearer Gleichungen und Ungleichungen umwandeln, erhalten wir Folgendes.



Im Vergleich zum vorherigen System wurden zwei zusĂ€tzliche Variablen hinzugefĂŒgt - c und d , die jedoch nicht in die Funktionale eingehen, da EinschrĂ€nkungen des erforderlichen Typs die Funktion in ihrer ursprĂŒnglichen Form nicht beeinflussen.

Es scheint, dass sich die Aufgabe nicht wesentlich geÀndert hat - wir minimieren das gleiche wie zuvor, aber der anfÀngliche Bereich akzeptabler Werte Àndert sich, jetzt ist er von X 0 bis X 3 .

Aus mathematischer Sicht sind Anforderungen - EinschrĂ€nkungen des erforderlichen Typs - die FĂ€higkeit, zusĂ€tzliche Gleichungen in das System einzufĂŒhren, ohne dessen Funktionen zu Ă€ndern.

Sie mĂŒssen dabei sehr vorsichtig sein, da ein ĂŒbermĂ€ĂŸiger Missbrauch der erforderlichen EinschrĂ€nkungen zu einem Problem ohne Lösungen fĂŒhrt und das automatische Layout damit nicht fertig wird.

Wir kommen zum letzten fĂŒnften Algorithmus.

Algorithmus Nr. 5


  • Definieren Sie die erforderlichen EinschrĂ€nkungen - Layoutanforderungen;
  • Erstellen Sie eine Hierarchie linearer EinschrĂ€nkungen.
  • alle EinschrĂ€nkungen in ein lineares Programmierproblem umwandeln;
  • das Problem der linearen Programmierung lösen;
  • Wenden Sie die Lösung auf UlView an.

Wir haben Cassowary untersucht - einen Algorithmus, der sich innerhalb des automatischen Layouts befindet. Bei seiner Implementierung ergeben sich jedoch verschiedene Funktionen.

IOS-Funktionen


In layoutSubviews () gibt es keine Berechnungen .

Wann werden sie produziert? Antwort: Immer und jederzeit wird das automatische Layout gezĂ€hlt. Die Berechnung erfolgt genau dann, wenn wir unserer Ansicht EinschrĂ€nkungen hinzufĂŒgen oder diese mithilfe moderner API-Methoden zum Arbeiten mit EinschrĂ€nkungen aktivieren.



Unsere Ansichten sind Rechtecke, aber das Problem ist, dass diese Informationen nicht im Cassowary enthalten sind, sondern zusĂ€tzlich dort eingebettet werden mĂŒssen. Wir haben einen Mechanismus zur EinfĂŒhrung zusĂ€tzlicher EinschrĂ€nkungen. Wenn wir fĂŒr jede Ansicht eine Reihe von EinschrĂ€nkungen mit positiver Breite und Höhe einfĂŒhren, erhalten wir am Ausgang immer Rechtecke. Aus diesem Grund können wir die automatische Layoutansicht mit negativen Abmessungen nicht nachholen.

Die zweite Funktion ist intrinsicContentSize - die intrinsische GrĂ¶ĂŸe, die fĂŒr jede Ansicht festgelegt werden kann.



Dies ist eine einfache Schnittstelle zum Erstellen von 4 zusĂ€tzlichen UngleichheitsbeschrĂ€nkungen, die in das System eingefĂŒgt werden. Dieser Mechanismus ist sehr praktisch und ermöglicht es Ihnen, die Anzahl der expliziten EinschrĂ€nkungen zu reduzieren, was die Verwendung des automatischen Layouts vereinfacht. Der letzte und dĂŒnnste Punkt, der oft vergessen wird, ist TranslateAutoresizingMaskIntoConstraints.



Dies ist eine KrĂŒcke, die in den Tagen von iOS 5 eingefĂŒhrt wurde, damit der alte Code nach dem Erscheinen von Auto Layout nicht kaputt geht.

Stellen Sie sich eine Situation vor: Wir legen EinschrĂ€nkungen fest. Innerhalb der Ansicht verwenden wir die Ansicht, die nichts ĂŒber EinschrĂ€nkungen weiß, alles, was auf Frames gesetzt ist, aber innerhalb der Ansicht die Ansicht, die seit langem in EinschrĂ€nkungen ĂŒbersetzt wurde.

Ich erinnere Sie daran, dass in der Auto-Layout-Aufgabe von Cassowary keine Frames enthalten sind, sondern nur EinschrÀnkungen.

Die GrĂ¶ĂŸe und Position der Ansicht, die in den Frames reduziert wurde, wird durch EinschrĂ€nkungen nicht vollstĂ€ndig bestimmt. Bei der Berechnung der GrĂ¶ĂŸe und Position aller anderen Ansichten werden falsche GrĂ¶ĂŸen berĂŒcksichtigt, obwohl wir nach dem automatischen Layout dort die richtigen Rahmen anwenden.

Um diese Situation zu vermeiden, wird fĂŒr jede Ansicht, die im Frame angeordnet ist, eine zusĂ€tzliche EinschrĂ€nkung angewendet, wenn der Wert der Variablen TranslateAutoresizingMaskIntoConstraints true ist. Diese EinschrĂ€nkungen können von Lauf zu Lauf variieren. Über dieses Set ist nur eines bekannt - sein Rahmen wird derjenige sein, der ĂŒbertragen wurde.

Die KompatibilitÀt zwischen altem Code ohne EinschrÀnkungen und neuem Code mit EinschrÀnkungen kann hÀufig durch den Missbrauch dieser Eigenschaft beeintrÀchtigt werden. Diese EinschrÀnkungen haben notwendigerweise die PrioritÀt von Anforderungen. Wenn wir also einer solchen Ansicht, die eine sehr hohe PrioritÀt hat, beispielsweise einer Anforderung, plötzlich EinschrÀnkungen auferlegen, können wir versehentlich ein nicht konsistentes System erstellen, das keine Lösungen hat.

Es ist wichtig zu wissen:

  • Wenn wir eine Ansicht aus dem Interface Builder erstellen, ist der Standardwert fĂŒr diese Eigenschaft false .
  • Wenn wir eine Ansicht direkt aus dem Code erstellen, ist dies der Fall .

Die Idee ist sehr einfach: Der alte Code, in dem die Ansicht erstellt wurde, wusste nichts ĂŒber das automatische Layout, und es musste so gestaltet werden, dass es funktioniert, wenn die Ansicht irgendwo an einem neuen Ort verwendet wird.

Praktische Tipps


Insgesamt wird es drei RĂ€te geben, die mit den wichtigsten beginnen.

Optimierung


Es ist wichtig, das Problem zu lokalisieren.

Haben Sie jemals das Problem der Optimierung des Bildschirms gehabt, der im automatischen Layout dargestellt ist? Höchstwahrscheinlich nicht, hÀufiger hatten Sie das Problem, das Layout von Zellen in einer Tabelle oder einer Sammlungsansicht zu optimieren.

Das automatische Layout ist so optimiert, dass jeder Bildschirm und jede BenutzeroberflÀche erstellt werden kann. Es ist jedoch ein Problem, 50 oder 100 gleichzeitig zu erstellen. Schauen wir uns das Experiment an, um es zu lokalisieren und zu optimieren. Die Zahlen stammen aus einem Artikel, in dem Cassowary erstmals beschrieben wurde.


Die Aufgabe ist folgende: Wir erstellen nacheinander eine Ansichtskette und verbinden jede nachfolgende mit der vorherigen. So wurde eine Folge von 1000 Elementen erstellt. Nach dem Messen verschiedener Operationen wird die Zeit in Millisekunden angezeigt. Die Werte sind ziemlich groß, da Auto Layout an der Kreuzung der 80er und 90er Jahre erfunden wurde.

Durch das Sammeln einer solchen Kette können Sie wie folgt vorgehen:

  • FĂŒgen Sie nacheinander eine EinschrĂ€nkung hinzu und entscheiden Sie jedes Mal. Dies dauert 38 Sekunden.
  • Sie können alle EinschrĂ€nkungen auf einmal hinzufĂŒgen und erst dann das System lösen. Diese Lösung ist effizienter. Nach alten Daten steigt der Wirkungsgrad um 70%, bei der derzeitigen Implementierung auf modernen GerĂ€ten werden es jedoch nur 20% sein. Eine qualitativ einmalige HinzufĂŒgung von BeschrĂ€nkungen wird jedoch immer effektiver sein.
  • Wenn die gesamte Kette zusammengebaut ist, können Sie eine weitere EinschrĂ€nkung hinzufĂŒgen . Wie aus der Tabelle ersichtlich ist, ist diese Operation ziemlich billig.
  • Das Interessanteste: Wenn wir keine neuen EinschrĂ€nkungen hinzufĂŒgen, sondern eine Konstante in einer der vorhandenen Ă€ndern, ist dies eine GrĂ¶ĂŸenordnung effektiver als das Löschen oder Erstellen einer neuen EinschrĂ€nkung.

Die ersten beiden Punkte können als primÀre Berechnung der Schnittstellen beschrieben werden, die letzten beiden - als nÀchste.

Berechnung der primÀren Schnittstelle


Hier können Sie die Methoden zum HinzufĂŒgen von MasseneinschrĂ€nkungen zur Optimierung verwenden:

  • NSLayoutConstraints.activate (_ :) - Sammeln Sie beim Erstellen einer Ansicht alle EinschrĂ€nkungen nacheinander in einem Array, zwischenspeichern Sie sie und fĂŒgen Sie sie erst dann hinzu.
  • Oder erstellen Sie Zellen im Interface Builder. Er wird alles fĂŒr uns tun und zusĂ€tzliche Optimierungen durchfĂŒhren, was oft bequem ist.

Nachfolgende Schnittstellenberechnungen


Das HinzufĂŒgen oder Ändern von EinschrĂ€nkungen ist eine komplexe Operation. Es ist daher besser , die EinschrĂ€nkungen nicht zu Ă€ndern, sondern nur die Konstanten in vorhandenen EinschrĂ€nkungen zu Ă€ndern . :

  • UIView — . view , Auto Layout. , , view, .
  • — IntrinsicContentSize. , , .
  • . , , .

, WWDC 2018S220 High Performance Auto Layout . — Apple , .



, constraints.



required , — , , . .

, .

:

  • , . ( loader) — .
  • , . , .




, , .

constraint required, . , , , . , .

— , . , — . - , , . Auto Layout , .

, . . , , , . layout, , , . .



— , Auto Layout, , .

, required, , . :

  • , .
  • , , .

, , , .

, . , , , . , — . .

— . , , , — , — required -.

NĂŒtzliche Links:

Solving Linear Arithmetic Constraints for User Interface Applications
The Cassowary Linear Constraint Solving Algorithm
Constraints as s Design Pattern
Auto Layout Guide by Apple
WWDC 2018 Session 220 High Performance Auto Layout
UILabel API Auto Layout —
. Medium

, AppsConf 2019 . , AppsConf , 22 23 . - , .

Source: https://habr.com/ru/post/de437584/


All Articles