ฉันรู้ว่าห่วงโซ่การจัดวางอัตโนมัติประกอบด้วยกระบวนการที่แตกต่างกัน 3 ประการ
- อัปเดตข้อ จำกัด
- มุมมองเค้าโครง (นี่คือที่ที่เราได้รับการคำนวณเฟรม)
- แสดง
อะไรไม่ได้โดยสิ้นเชิงชัดเจนกับผมคือความแตกต่างระหว่างภายในและ-setNeedsLayout
-setNeedsUpdateConstraints
จาก Apple Docs:
เรียกวิธีนี้ในเธรดหลักของแอปพลิเคชันของคุณเมื่อคุณต้องการปรับเค้าโครงของมุมมองย่อย วิธีนี้จะทำการบันทึกคำขอและส่งคืนทันที เนื่องจากวิธีนี้ไม่ได้บังคับให้มีการอัปเดตทันที แต่รอรอบการอัปเดตครั้งต่อไปคุณสามารถใช้วิธีนี้เพื่อทำให้เค้าโครงของมุมมองหลายมุมเป็นโมฆะก่อนที่มุมมองเหล่านั้นจะได้รับการอัปเดต ลักษณะการทำงานนี้ช่วยให้คุณสามารถรวมการปรับปรุงเค้าโครงทั้งหมดของคุณเข้ากับรอบการอัปเดตเดียวซึ่งมักจะดีกว่าสำหรับประสิทธิภาพ
เมื่อคุณสมบัติของมุมมองที่กำหนดเองของคุณเปลี่ยนไปในแบบที่จะส่งผลกระทบต่อข้อ จำกัด คุณสามารถเรียกวิธีนี้เพื่อระบุว่าข้อ จำกัด จำเป็นต้องได้รับการปรับปรุงในบางจุดในอนาคต จากนั้นระบบจะเรียกใช้ updateConstraints โดยเป็นส่วนหนึ่งของเค้าโครงผังปกติ การอัปเดตข้อ จำกัด ทั้งหมดในครั้งเดียวก่อนที่จะมีความจำเป็นต้องมั่นใจว่าคุณไม่จำเป็นต้องคำนวณข้อ จำกัด โดยไม่จำเป็นเมื่อมีการเปลี่ยนแปลงหลายอย่างในมุมมองของคุณระหว่างการส่งผ่านเลย์เอาต์
เมื่อฉันต้องการทำให้มุมมองเคลื่อนไหวหลังจากแก้ไขข้อ จำกัด และทำให้การเปลี่ยนแปลงที่ฉันมักจะเรียกเช่น:
[UIView animateWithDuration:1.0f delay:0.0f usingSpringWithDamping:0.5f initialSpringVelocity:1 options:UIViewAnimationOptionCurveEaseInOut animations:^{
[self.modifConstrView setNeedsUpdateConstraints];
[self.modifConstrView layoutIfNeeded];
} completion:NULL];
ฉันพบว่าถ้าฉันใช้-setNeedsLayout
แทน-setNeedsUpdateConstraints
ทุกอย่างทำงานตามที่คาดไว้ แต่ถ้าฉันเปลี่ยน-layoutIfNeeded
ด้วย-updateConstraintsIfNeeded
ภาพเคลื่อนไหวจะไม่เกิดขึ้น
ฉันพยายามสรุปเอง:
-updateConstraintsIfNeeded
อัปเดตข้อ จำกัด เท่านั้น แต่ไม่ได้บังคับให้เค้าโครงเข้าสู่กระบวนการดังนั้นเฟรมดั้งเดิมจึงยังคงอยู่-setNeedsLayout
-updateContraints
วิธีการโทรด้วย
ดังนั้นเมื่อไรที่จะใช้หนึ่งแทนอีกอัน? และเกี่ยวกับวิธีการจัดวางฉันต้องโทรหาพวกเขาในมุมมองที่มีการเปลี่ยนแปลงในข้อ จำกัด หรือในมุมมองหลัก