Tôi biết rằng về cơ bản chuỗi bố cục bao gồm 3 quá trình khác nhau.
- hạn chế cập nhật
- chế độ xem bố cục (đây là nơi chúng tôi nhận được tính toán của khung)
- trưng bày
Điều không hoàn toàn rõ ràng với tôi là sự khác biệt bên trong giữa -setNeedsLayout
và -setNeedsUpdateConstraints
. Từ Apple Docs:
Gọi phương thức này trên luồng chính của ứng dụng của bạn khi bạn muốn điều chỉnh bố cục của các khung nhìn của khung nhìn. Phương pháp này làm cho một ghi chú của yêu cầu và trả lại ngay lập tức. Bởi vì phương pháp này không bắt buộc cập nhật ngay lập tức, nhưng thay vào đó, chờ đợi chu kỳ cập nhật tiếp theo, bạn có thể sử dụng nó để vô hiệu hóa bố cục của nhiều chế độ xem trước khi bất kỳ chế độ xem nào được cập nhật. Hành vi này cho phép bạn hợp nhất tất cả các cập nhật bố cục của bạn thành một chu kỳ cập nhật, thường tốt hơn cho hiệu suất.
Khi một thuộc tính của chế độ xem tùy chỉnh của bạn thay đổi theo cách có thể tác động đến các ràng buộc, bạn có thể gọi phương thức này để chỉ ra rằng các ràng buộc cần được cập nhật tại một thời điểm nào đó trong tương lai. Sau đó, hệ thống sẽ gọi updateConstraint như một phần của bố cục thông thường. Cập nhật tất cả các ràng buộc cùng một lúc ngay trước khi chúng cần thiết đảm bảo rằng bạn không cần tính toán lại các ràng buộc khi nhiều thay đổi được thực hiện cho chế độ xem của bạn ở giữa các lần bố trí.
Khi tôi muốn tạo hiệu ứng cho một khung nhìn sau khi sửa đổi một ràng buộc và làm động các thay đổi tôi thường gọi ví dụ:
[UIView animateWithDuration:1.0f delay:0.0f usingSpringWithDamping:0.5f initialSpringVelocity:1 options:UIViewAnimationOptionCurveEaseInOut animations:^{
[self.modifConstrView setNeedsUpdateConstraints];
[self.modifConstrView layoutIfNeeded];
} completion:NULL];
Tôi đã phát hiện ra rằng nếu tôi sử dụng -setNeedsLayout
thay vì -setNeedsUpdateConstraints
làm việc tất cả mọi thứ như mong đợi, nhưng nếu tôi thay đổi -layoutIfNeeded
với -updateConstraintsIfNeeded
, các hình ảnh động sẽ không xảy ra.
Tôi đã cố gắng đưa ra kết luận của riêng mình:
-updateConstraintsIfNeeded
chỉ cập nhật các ràng buộc nhưng không buộc bố cục đi vào quy trình, do đó các khung ban đầu vẫn được giữ nguyên-setNeedsLayout
cuộc gọi cũng-updateContraints
phương thức
Vì vậy, khi nào là ok để sử dụng một thay vì khác? và về các phương thức bố trí, tôi có cần gọi chúng trên khung nhìn có sự thay đổi trong một ràng buộc hoặc trên khung nhìn cha không?