Mesin Tata Letak di Swift

Banyak pengembang iOS tidak memikirkan tentang cara kerja mekanisme rendering elemen, pengaturan, dan pembaruan batasan di Tata Letak Otomatis. Pada artikel ini, saya mencoba melihat secara detail di dalam karya Layout Engine





Tata letak lulus

Meneruskan Layout The - ini adalah tempat Auto Layout Engine melewati hierarki konsep, tetapi menyebabkan metode ViewWillLayoutSubviews di semua metode viewController dan layoutSubviews untuk semua tampilan . Metode layoutSubviews memperbarui properti Frame dari setiap subview





Saat kami menambah, mengubah atau menghapus batasan, batasan tersebut tidak segera diperbarui. Akan tidak efisien untuk menghitung ulang tata letak dan memperbarui rendering pada setiap perubahan . Sebagai gantinya, perubahan Anda menjadwalkan mekanisme tata letak yang dimiliki oleh window untuk memicu pembaruan tata letak pada kesempatan berikutnya di runloop.





Siklus tata letak tipikal terdiri dari beberapa tahap:





  1. Pemicu: Anda mengubah input di mesin tata letak. Ini bisa berupa menambah atau menghapus subview, mengubah ukuran konten internal, mengaktifkan / menonaktifkan batasan, atau mengubah prioritas atau batasan konstan.





  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