Die Layout-Engine in Swift

Viele iOS-Entwickler denken nicht darüber nach, wie der Mechanismus zum Rendern von Elementen, Festlegen und Aktualisieren von Einschränkungen in Auto Layout funktioniert. In diesem Artikel versuche ich, das Innere der Layout Engine im Detail zu betrachten.





Der Layout-Pass

Übergeben des Layouts von - Hier umgeht die Auto Layout Engine die Hierarchie der Konzepte, verursacht jedoch die ViewWillLayoutSubviews-Methode bei allen viewController- und layoutSubviews-Methoden für alle Ansichten . Die layoutSubviews-Methode aktualisiert die Frame-Eigenschaft jeder Unteransicht





Wenn wir Einschränkungen hinzufügen, ändern oder löschen, werden sie nicht sofort aktualisiert. Es wäre ineffizient, das Layout neu zu berechnen und das Rendering bei jeder Änderung zu aktualisieren . Stattdessen planen Ihre Änderungen den Layoutmechanismus des Fensters, um Layoutaktualisierungen bei der nächsten Gelegenheit im Runloop auszulösen.





Ein typischer Layoutzyklus besteht aus mehreren Phasen:





  1. Auslöser: Sie ändern die Eingabe in der Layout-Engine. Dies kann das Hinzufügen oder Entfernen von Unteransichten, das Ändern der internen Inhaltsgröße, das Aktivieren / Deaktivieren von Einschränkungen oder das Ändern der Priorität oder der konstanten Einschränkung sein.





  2. Update Model: layout engine view , views. the layout engine view.



    . Views, , setNeedsLayout() superview, layout pass runloop.





  3. Deferred Layout Pass: the layout pass view hierarchy. constraints. , , layoutSubviews() view, subviews, , views .





, viewController, view layout engine :





  • layout engine updateViewConstraints, view updateConstraints.





  • the layout pass layout engine viewWillLayoutSubviews viewDidLayoutSubviews , layoutSubviews layout





Constraints

view hierarchy , constraint' , layout engine views. updateConstraintsIfNeeded view, constraints. view, constraints, layout engine updateConstraints, . setNeedsUpdateConstraints, . , the layout engine , updateConstraintsIfNeeded.





Views

- view. the layout engine view frames .





, layout, layoutSubviews () subviews layout engine.





setNeedsLayout layoutIfNeeded, layout pass view. , layout pass view :





  • setNeedsLayout: layout. layout view layout pass application run loop.





  • layoutIfNeeded: layoutSubviews , , layout engine subviews





:

  • , constraints . the layout engine , .





  • . constraints. view layout, , the layout engine.





  • setNeedsLayout, layout'a. layoutIfNeeded view frames .












All Articles