จะเกิดอะไรขึ้นกับข้อ จำกัด เมื่อมุมมองถูกลบออก


109

คำถามที่ฉันมีนั้นง่ายมาก แต่ฉันไม่พบข้อมูลใด ๆ ในเอกสาร

จะเกิดอะไรขึ้นกับข้อ จำกัด ของโครงร่างเมื่อมุมมองถูกลบออกจากลำดับชั้นของมุมมอง (หรือย้ายไปยังมุมมองอื่น)

ตัวอย่างเช่นสมมติมีภาชนะCที่มี subviews และA Bคอนเทนเนอร์Cมีข้อ จำกัด บางประการ จากนั้นเราโทร[A removeFromSuperview]. เกิดอะไรขึ้นกับข้อ จำกัด สำหรับA?

แล้วอะไรจะเกิดขึ้นถ้าเราเพิ่มAไปCอีกครั้งหรือไม่

คำตอบ:


118

ข้อ จำกัด จะถูกลบออก หากคุณเพิ่ม A อีกครั้งคุณจะต้องสร้างข้อ จำกัด ใหม่หรือหากคุณบันทึกข้อ จำกัด ก่อนที่จะลบ A คุณสามารถเพิ่มกลับได้ เมื่อฉันทำสิ่งนี้ฉันจะบันทึกข้อ จำกัด เช่นนี้สำหรับมุมมองที่เรียกว่า view1:

self.portraitConstraints = [NSMutableArray new];
for (NSLayoutConstraint *con in self.view.constraints) {
    if (con.firstItem == self.view1 || con.secondItem == self.view1) {
       [self.portraitConstraints addObject:con];
    }
}

7
สามารถพบข้อเท็จจริงนี้ได้จากที่ไหนสักแห่งในเอกสารนี้หรือไม่? ฉันเชื่อคุณ แต่มันดูแปลกที่ความจริงไม่ได้กล่าวถึงที่ไหนเลย
Sulthan

2
เป็นเรื่องธรรมดาที่ข้อ จำกัด จะถูกลบออกไปพร้อมกับมุมมองจริงๆ หากพวกเขาไม่ได้เป็นระบบเค้าโครงจะสามารถประเมินได้อย่างไรในอนาคต
Mike Pollard

6
เพื่อให้ชัดเจนเท่าที่คำตอบนี้ดูเหมือนว่ามันจะยังคงมีประโยชน์อย่างมาก!
race_carr

1
@pnollet ฉันไม่รู้ว่าทำไมผู้โพสต์ในคำถามนั้นถึงทำในสิ่งที่เขาทำ ฉันได้บันทึกสิ่งนี้เพื่อตรวจสอบและเมื่อฉันลบมุมมองย่อยและตรวจสอบข้อ จำกัด ของซูเปอร์วิวข้อ จำกัด เหล่านั้นที่เกี่ยวข้องกับมุมมองย่อยที่ถูกลบจะหายไป
rdelmar

4
@ Firo ฉันแน่ใจว่าพวกเขาควรจะถูกลบดังนั้นหากพวกเขาไม่ได้อยู่ใน iOS 6 อาจเป็นข้อผิดพลาด BTW เอกสารสำหรับเมธอด removeFromSuperview ระบุว่า "การเรียกใช้เมธอดนี้จะลบข้อ จำกัด ใด ๆ ที่อ้างถึงมุมมองที่คุณกำลังลบหรือที่อ้างถึงมุมมองใด ๆ ในทรีย่อยของมุมมองที่คุณกำลังลบ"
rdelmar

41

เนื่องจากฉันมีคำถามนี้เช่นกันฉันจึงตรวจสอบเอกสารของ Apple สำหรับการเตะและปรากฎว่ามีการบันทึกว่าข้อ จำกัด นั้นถูกลบออก

เอกสารสำหรับวิธี UIView removeFromSuperview ฯ :

การเรียกใช้วิธีนี้จะลบข้อ จำกัด ใด ๆ ที่อ้างถึงมุมมองที่คุณกำลังลบหรือที่อ้างถึงมุมมองใด ๆ ในแผนผังย่อยของมุมมองที่คุณกำลังลบ

ฉันไม่แน่ใจว่านี่เป็นเอกสารเมื่อปีที่แล้วหรือไม่เมื่อมีการโพสต์คำถามเดิม แต่ฉันคิดว่าฉันจะแบ่งปันข้อมูลนี้เผื่อว่าใครต้องการ ...


ขอบคุณมากสำหรับการเพิ่มสิ่งนี้โดยตรงจากเอกสาร
Esko918

3

อย่างไรก็ตามโปรดทราบว่าหากคุณมีมุมมองผู้ปกครองที่เป็นอิสระสองมุมมอง A และ B และมุมมองย่อย C โดยที่ C เป็นมุมมองย่อยของ A โดยมีข้อ จำกัด ที่เหมาะสมการเรียก [B addSubview: C] จะไม่ล้างข้อ จำกัด ใด ๆ ที่เกี่ยวข้องกับ A และ C และรูปแบบอัตโนมัติจะเริ่มทิ้งข้อยกเว้นเนื่องจากข้อ จำกัด เหล่านั้นไม่เกี่ยวข้องกับมุมมองในลำดับชั้นเดียวกันอีกต่อไป

คุณจะต้องเรียก [C removeFromSuperview] อย่างชัดเจนเพื่อลบข้อ จำกัด ก่อนที่จะเพิ่ม C ไปยัง B

นี่เป็นเรื่องจริงบน Mac OS X - ฉันไม่ได้ตรวจสอบ iOS


น่าสนใจ! คุณได้รับข้อมูลนี้มาจากไหน เอกสารสำหรับ addSubview ไม่ได้กล่าวถึงพฤติกรรมนี้ ฉันถามเพราะตอนนี้ฉันมีข้อยกเว้นบางครั้งเมื่อลบตัวควบคุมมุมมองที่ระบุว่า 'ไม่สามารถติดตั้งข้อ จำกัด ในมุมมอง' - สิ่งที่ฉันไม่ได้ทำ
JimmyB

2

ข้อ จำกัด จะถูกลบออกด้วยเมื่อคุณ [A removeFromSuperview]

พวกเขาถูกลืมและการเพิ่ม A ถึง C อีกครั้งจะไม่มีข้อ จำกัด


0

พวกเขาจะถูกลบออกไปด้วยคุณสามารถทำการทดสอบง่ายๆ เลือกมุมมอง SUBVIEW และสร้างต้นทุนที่ จำกัด SUBVIEW ให้เป็นไปตามการปรับขนาด Superview (เช่นติดกับขอบ superview) ในการทำเช่นนั้นคุณเพิ่ม SUBVIEW เป็นมุมมองย่อยใน CONTAINERVIEW นี้และเพิ่มเป็นข้อ จำกัด บางอย่างเช่นนั้น
: | - [SUBVIEW] - |
H: | - [SUBVIEW] - |
ควรเพิ่มข้อ จำกัด เหล่านี้ในซูเปอร์วิว SUBVIEW ดังนั้น CONTAINERVIEW
หากคุณลบ SUBVIEW โดยเพียงแค่ตรวจสอบข้อ จำกัด CONTAINERVIEW ทั้งหมดคุณจะเห็นว่าทั้งสองไม่อยู่อีกต่อไป


0

คำถามนี้สามารถพิสูจน์ได้ด้วยตัวสร้างอินเทอร์เฟซ เมื่อลากและวางUIViewบนViewControllerข้อ จำกัด ของการเพิ่มจากนั้นนำออกUIViewคุณจะเห็นข้อ จำกัด สีน้ำเงินหายไป


4
สตอรีบอร์ดไม่ได้พิสูจน์อะไรเลยว่าพฤติกรรมรันไทม์จะเกิดขึ้นได้อย่างไร สตอรี่บอร์ดทำอะไรก็ได้ตามต้องการ!
mxcl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.