เมื่อใช้การจัดวางอัตโนมัติในโค้ดการตั้งค่าเฟรมจะไม่ทำอะไรเลย ดังนั้นการที่คุณระบุความกว้าง 200 ในมุมมองด้านบนไม่ได้มีความหมายอะไรเลยเมื่อคุณกำหนดข้อ จำกัด เพื่อให้การตั้งค่าข้อ จำกัด ของมุมมองไม่คลุมเครือจำเป็นต้องมีสี่สิ่ง: ตำแหน่ง x ตำแหน่ง y ความกว้างและความสูงสำหรับสถานะใด ๆ
ขณะนี้ในโค้ดด้านบนคุณมีเพียงสอง (ความสูงเทียบกับซุปเปอร์วิวและตำแหน่ง y เทียบกับซูเปอร์วิว) นอกจากนี้คุณยังมีข้อ จำกัด ที่จำเป็นอีก 2 ข้อซึ่งอาจขัดแย้งกันได้ขึ้นอยู่กับวิธีการตั้งค่าข้อ จำกัด ของมุมมอง Superview หากซูเปอร์วิวต้องมีข้อ จำกัด ที่จำเป็นซึ่งระบุว่าความสูงเป็นค่าที่น้อยกว่า 748 คุณจะได้รับข้อยกเว้น "ข้อ จำกัด ที่ไม่น่าพอใจ"
การที่คุณตั้งค่าความกว้างของมุมมองก่อนกำหนดข้อ จำกัด ก็ไม่มีความหมาย จะไม่คำนึงถึงเฟรมเก่าด้วยซ้ำและจะคำนวณเฟรมใหม่ตามข้อ จำกัด ทั้งหมดที่ระบุไว้สำหรับมุมมองเหล่านั้น เมื่อจัดการกับ autolayout ในรหัสฉันมักจะเพียงแค่สร้างมุมมองใหม่โดยใช้หรือเพียงแค่initWithFrame:CGRectZero
init
ในการสร้างชุดข้อ จำกัด ที่จำเป็นสำหรับเค้าโครงที่คุณอธิบายด้วยวาจาในคำถามของคุณคุณจะต้องเพิ่มข้อ จำกัด ในแนวนอนเพื่อผูกความกว้างและตำแหน่ง x เพื่อให้ได้รูปแบบที่ระบุอย่างครบถ้วน:
[self.view addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"V:|-[myView(>=748)]-|"
options:NSLayoutFormatDirectionLeadingToTrailing
metrics:nil
views:NSDictionaryOfVariableBindings(myView)]];
[self.view addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"H:[myView(==200)]-|"
options:NSLayoutFormatDirectionLeadingToTrailing
metrics:nil
views:NSDictionaryOfVariableBindings(myView)]];
การอธิบายเค้าโครงนี้ด้วยวาจาอ่านดังนี้โดยเริ่มต้นด้วยข้อ จำกัด แนวตั้ง:
myView จะเติมความสูงของ superview ด้วยช่องว่างด้านบนและด้านล่างเท่ากับช่องว่างมาตรฐาน superview ของ myView มีความสูงขั้นต่ำ 748pts ความกว้างของ myView คือ 200pts และมีช่องว่างภายในเท่ากับพื้นที่มาตรฐานเทียบกับ superview
หากคุณต้องการเพียงแค่ต้องการให้มุมมองเติมเต็มความสูงของซูเปอร์วิวทั้งหมดโดยไม่จำกัดความสูงของซูเปอร์วิวคุณก็แค่ไม่ใส่(>=748)
พารามิเตอร์ในข้อความรูปแบบภาพ หากคุณคิดว่า(>=748)
ต้องใช้พารามิเตอร์เพื่อให้ความสูง - คุณไม่ได้อยู่ในกรณีนี้: การตรึงมุมมองไว้ที่ขอบของ superview โดยใช้ไวยากรณ์bar ( |
) หรือ bar ที่มีช่องว่าง ( |-
, -|
) คุณกำลังให้มุมมองของคุณเป็น y - ตำแหน่ง (ตรึงมุมมองบนขอบด้านเดียว) และตำแหน่ง y ที่มีความสูง (ตรึงมุมมองไว้ที่ขอบทั้งสองด้าน) ดังนั้นจึงเป็นไปตามข้อ จำกัด ของคุณสำหรับมุมมอง
เกี่ยวกับคำถามที่สองของคุณ:
การใช้NSDictionaryOfVariableBindings(self.myView)
(ถ้าคุณมีการตั้งค่าคุณสมบัติสำหรับ myView) และป้อนข้อมูลนั้นลงใน VFL ของคุณเพื่อใช้self.myView
ในข้อความ VFL ของคุณคุณอาจได้รับข้อยกเว้นเมื่อการจัดวางอัตโนมัติพยายามแยกวิเคราะห์ข้อความ VFL ของคุณ valueForKeyPath:
มันจะทำอย่างไรกับสัญกรณ์จุดในคีย์พจนานุกรมและระบบการพยายามที่จะใช้ ดูที่นี่สำหรับคำถามที่คล้ายกันและคำตอบ