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:
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.
Update Model: layout engine view , views. the layout engine view.
. Views, , setNeedsLayout() superview, layout pass runloop.
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 .