ฉันมี UIView ซึ่งวางอยู่บนหน้าจอผ่านข้อ จำกัด หลายประการ ข้อ จำกัด บางอย่างเป็นของ Superview ส่วนข้อ จำกัด อื่น ๆ เป็นของบรรพบุรุษคนอื่น ๆ (เช่นอาจเป็นคุณสมบัติการดูของ UIViewController)
ฉันต้องการลบข้อ จำกัด เก่า ๆ เหล่านี้ทั้งหมดและวางไว้ที่ใหม่โดยใช้ข้อ จำกัด ใหม่
ฉันจะทำสิ่งนี้ได้อย่างไรโดยไม่ต้องสร้าง IBOutlet สำหรับทุกข้อ จำกัด และต้องจำว่ามุมมองใดเป็นเจ้าของข้อ จำกัด ดังกล่าว
ในการอธิบายอย่างละเอียดวิธีการที่ไร้เดียงสาคือการสร้าง IBOutlets จำนวนมากสำหรับข้อ จำกัด แต่ละข้อจากนั้นจะเกี่ยวข้องกับการเรียกรหัสเช่น:
[viewA removeConstraint:self.myViewsLeftConstraint];
[viewB removeConstraint:self.myViewsTopConstraint];
[viewB removeConstraint:self.myViewsBottomConstraint];
[self.view removeConstraint:self.myViewsRightConstraint];
ปัญหาเกี่ยวกับรหัสนี้คือแม้ในกรณีที่ง่ายที่สุดฉันจะต้องสร้าง IBOutlets 2 รายการ สำหรับเลย์เอาต์ที่ซับซ้อนสิ่งนี้สามารถเข้าถึง IBOutlets ที่ต้องการได้ 4 หรือ 8 รายการ นอกจากนี้ฉันต้องตรวจสอบให้แน่ใจว่าการเรียกร้องให้ลบข้อ จำกัด นั้นถูกเรียกใช้ในมุมมองที่เหมาะสม ตัวอย่างเช่นสมมติว่าเป็นเจ้าของโดยmyViewsLeftConstraint
viewA
ถ้าฉันเผลอโทร[self.view removeConstraint:self.myViewsLeftConstraint]
ไปจะไม่มีอะไรเกิดขึ้น
หมายเหตุ: method constraintsAffectingLayoutForAxisมีแนวโน้มที่ดี แต่มีไว้สำหรับการดีบักเท่านั้น
ปรับปรุง:หลายคำตอบที่ผมได้รับข้อตกลงกับself.constraints
, self.superview.constraints
หรือแตกต่างจากผู้ที่บาง โซลูชันเหล่านี้จะใช้ไม่ได้เนื่องจากวิธีการเหล่านั้นส่งคืนเฉพาะข้อ จำกัด ที่เป็นของมุมมองไม่ใช่ข้อ จำกัดที่มีผลต่อมุมมอง
เพื่อชี้แจงปัญหาด้วยวิธีแก้ปัญหาเหล่านี้ให้พิจารณาลำดับชั้นของมุมมองนี้:
- ปู่
- พ่อ
- ฉัน
- ลูกชาย
- ลูกสาว
- บราเดอร์
- ฉัน
- ลุง
- พ่อ
ลองนึกภาพว่าเราสร้างข้อ จำกัด ต่อไปนี้และแนบไว้กับบรรพบุรุษร่วมกันที่ใกล้ที่สุด:
- C0: ฉัน: ท็อปเดียวกับลูกชาย (เป็นของฉัน)
- C1: ฉัน: width = 100 (เป็นของฉัน)
- C2: ฉัน: สูงเท่าพี่ชาย (พ่อเป็นเจ้าของ)
- C3: ฉัน: ท็อปเดียวกับลุง (ปู่เป็นเจ้าของ)
- C4: ฉัน: เหลือเหมือนปู่ (ปู่เป็นเจ้าของ)
- C5: พี่ชาย: เหลือคนเดียวกับพ่อ (เป็นของพ่อ)
- C6: ลุง: ซ้ายเหมือนปู่ (ปู่เป็นเจ้าของ)
- C7: ลูกชาย: เหลือเหมือนลูกสาว (เป็นของฉัน)
ตอนนี้คิดว่าเราต้องการที่จะลบข้อ จำกัด Me
ที่มีผลต่อ วิธีแก้ปัญหาที่เหมาะสมควรลบออก[C0,C1,C2,C3,C4]
และไม่มีอะไรอื่น
ถ้าฉันใช้self.constraints
(ที่ตัวเองคือฉัน) ฉันจะได้รับ[C0,C1,C7]
เนื่องจากสิ่งเหล่านี้เป็นข้อ จำกัด เดียวที่ฉันเป็นเจ้าของ [C2,C3,C4]
เห็นได้ชัดว่ามันจะไม่พอที่จะลบนี้เพราะมันจะหายไป นอกจากนี้ยังเป็นการลบC7
โดยไม่จำเป็น
ถ้าฉันใช้self.superview.constraints
(ที่ตัวเองคือฉัน) ฉันจะได้รับ[C2,C5]
เนื่องจากสิ่งเหล่านี้เป็นข้อ จำกัด ของคุณพ่อ เห็นได้ชัดว่าเราไม่สามารถลบทั้งหมดเหล่านี้ตั้งแต่เป็นสมบูรณ์ไม่เกี่ยวข้องกับC5
Me
ถ้าผมใช้ผมจะได้รับgrandfather.constraints
[C3,C4,C6]
อีกครั้งเราไม่สามารถลบสิ่งเหล่านี้ทั้งหมดได้เนื่องจากC6
ควรจะยังคงอยู่
วิธีการบังคับแบบเดรัจฉานคือการวนซ้ำบรรพบุรุษของแต่ละมุมมอง (รวมถึงตัวมันเอง) และดูว่าfirstItem
หรือsecondItem
เป็นมุมมองนั้นเอง ถ้าเป็นเช่นนั้นให้ลบข้อ จำกัด นั้นออก สิ่งนี้จะนำไปสู่การแก้ปัญหาที่ถูกต้องการคืนค่า[C0,C1,C2,C3,C4]
และข้อ จำกัด เหล่านั้นเท่านั้น
อย่างไรก็ตามฉันหวังว่าจะมีวิธีแก้ปัญหาที่หรูหรากว่าการวนซ้ำรายชื่อบรรพบุรุษทั้งหมด