Saya tahu bahwa rantai tata letak otomatis pada dasarnya terdiri dari 3 proses yang berbeda.
- memperbarui kendala
- tampilan tata letak (di sinilah kita mendapatkan perhitungan frame)
- tampilan
Yang tidak sepenuhnya jelas bagi saya adalah perbedaan batin antara -setNeedsLayout
dan -setNeedsUpdateConstraints
. Dari Apple Documents:
Panggil metode ini di utas utama aplikasi Anda ketika Anda ingin menyesuaikan tata letak subview tampilan. Metode ini mencatat permintaan dan segera kembali. Karena metode ini tidak memaksa pembaruan langsung, tetapi menunggu siklus pembaruan berikutnya, Anda dapat menggunakannya untuk membatalkan tata letak beberapa tampilan sebelum salah satu dari pandangan tersebut diperbarui. Perilaku ini memungkinkan Anda untuk menggabungkan semua pembaruan tata letak Anda ke satu siklus pembaruan, yang biasanya lebih baik untuk kinerja.
Ketika properti tampilan kustom Anda berubah dengan cara yang akan memengaruhi kendala, Anda dapat memanggil metode ini untuk menunjukkan bahwa kendala perlu diperbarui di beberapa titik di masa mendatang. Sistem kemudian akan memanggil updateConstraints sebagai bagian dari tata letak yang normal. Memperbarui kendala sekaligus sebelum mereka diperlukan memastikan bahwa Anda tidak perlu menghitung ulang kendala saat banyak perubahan dilakukan untuk tampilan Anda di antara lintasan tata letak.
Ketika saya ingin menghidupkan tampilan setelah memodifikasi batasan dan menghidupkan perubahan yang biasanya saya sebut misalnya:
[UIView animateWithDuration:1.0f delay:0.0f usingSpringWithDamping:0.5f initialSpringVelocity:1 options:UIViewAnimationOptionCurveEaseInOut animations:^{
[self.modifConstrView setNeedsUpdateConstraints];
[self.modifConstrView layoutIfNeeded];
} completion:NULL];
Saya mengetahui bahwa jika saya menggunakan -setNeedsLayout
alih-alih -setNeedsUpdateConstraints
semuanya berfungsi seperti yang diharapkan, tetapi jika saya ganti -layoutIfNeeded
dengan -updateConstraintsIfNeeded
, animasi tidak akan terjadi.
Saya sudah mencoba membuat kesimpulan sendiri:
-updateConstraintsIfNeeded
hanya memperbarui kendala tetapi tidak memaksa tata letak untuk masuk ke proses, sehingga bingkai asli masih dipertahankan-setNeedsLayout
panggilan juga-updateContraints
metode
Jadi kapan boleh menggunakan salah satu dari yang lain? dan tentang metode tata letak, apakah saya perlu memanggil mereka pada tampilan yang memiliki perubahan pada kendala atau pada tampilan induk?