autolayout - สร้างความสูงในการดูเมื่อเทียบกับความสูงครึ่งผู้ควบคุม


136

มีการเข้าสู่การชำระเงินอัตโนมัติเมื่อเร็ว ๆ นี้และฉันติดอยู่กับสิ่งที่ดูเหมือนว่าเป็นปัญหาเล็กน้อย ฉันมีมุมมองที่ฉันต้องการนั่งที่ด้านบนของหน้าจอและใช้เวลาครึ่งหนึ่งของความสูงของหน้าจอ ง่ายก่อนที่จะทำการชำระอัตโนมัติ - เพียงแค่เสียบเข้าที่และบอกให้ขยายในแนวตั้งเมื่อผู้ควบคุมปรับขนาด

ตอนนี้ฉันทำไม่ได้สำหรับชีวิตของฉันดูวิธีการทำ นี่คือสิ่งที่ฉันได้รับเมื่อพยายามตั้งค่า:

autolayout blues

ข้อ จำกัด พื้นที่ด้านล่างถูกตั้งค่าเป็น "เท่ากับ 284" ซึ่งแน่นอนและไร้ประโยชน์อย่างยิ่งกับฉันเมื่อฉันเปลี่ยนเป็นเค้าโครง iPhone4 เนื่องจากมันช่วยให้มีพื้นที่ 284 จุดที่ด้านล่างของหน้าจอและทำให้มุมมองลดลงอีกครึ่ง ขนาดของหน้าจอ และไม่มีวิธีการตั้งค่าที่ จำกัด ให้เท่ากับเศษส่วนบางส่วนของความสูงของมุมมองอื่น ๆ ..

หลังจากดิ้นรนไประยะหนึ่งแล้ววิธีเดียวที่ฉันสามารถคิดได้ว่าทำเช่นนี้คือการแนะนำมุมมองอื่นที่อยู่ใต้มุมมองนี้ตรึงความสูงของพวกเขาอย่างเท่าเทียมกันให้พวกเขานั่งด้านบนและด้านล่างซึ่งกันและกันแล้วตั้งมุมมองที่สอง .. ซึ่งดูเหมือนน่าเกลียดเล็กน้อย!

ฉันขาดอะไรบางอย่างที่ชัดเจนหรือไม่ ..


1
ฉันไม่คิดว่ามันน่าเกลียด แต่เป็นเคล็ดลับที่ฉลาดเพื่อให้ได้สิ่งที่คุณต้องการโดยใช้ IB ฉันทำสิ่งนี้แล้วและเมื่อคุณใช้ชื่อองค์ประกอบที่เหมาะสมคุณสามารถทำให้ชัดเจนว่าเกิดอะไรขึ้น คุณสามารถมีองค์ประกอบที่สามในตำแหน่งที่แตกต่างกันหรือกึ่งกลางเปลี่ยนขนาดตามการแสดงย่อยทั้งสองนี้
Jelle

คำตอบ:


167

ตอนนี้สามารถทำได้ใน IB ตั้งแต่ [อย่างน้อย] Xcode 5.1.1 แม้ว่าบางครั้งฉันก็ต้องเข้าใจว่ามันง่ายจริง ๆ :

ขั้นแรกให้สร้างข้อ จำกัด การจัดเรียงบนสุดพื้นฐาน (คุณจะต้องตั้งค่าข้อ จำกัด ด้านล่างซ้ายและขวาเช่นปกติ) จากนั้นเลือกข้อ จำกัด และไปที่ตัวตรวจสอบแอตทริบิวต์ :

การสาธิตขั้นตอนข้างต้น

จากนั้นคุณสามารถปรับตัวคูณ หากคุณต้องการให้ 50% ของมุมมองระดับสูงเหลือไว้1เพราะมันจะถูกจัดเรียงตามกึ่งกลางของซุปเปอร์ นี่เป็นวิธีที่ยอดเยี่ยมในการสร้างมุมมองที่เป็นเปอร์เซ็นต์เช่นกัน (เช่น 25% ของมุมมองระดับสูง)

การสาธิตขั้นตอนที่สองข้างต้น


ดี :) ฉันคิดว่าโพสต์นี้ควรทำเครื่องหมายว่าเป็นคำตอบที่ยอมรับแล้ว :) ผู้พัฒนา iOS มักชอบโซลูชันตัวสร้างส่วนต่อ
ประสาน

@ hqt ขอบคุณ ฉันคิดว่าเมื่อคำตอบที่ยอมรับถูกเขียนวิธีนี้ไม่สามารถใช้ได้ บางครั้งผู้ถามไม่กลับมาถามคำถามหรือดูแลเพื่อเปลี่ยนคำตอบที่ยอมรับ แต่ในที่สุดฉันก็อยู่ที่นี่เพื่อช่วยเหลือดีใจที่ทำ!
Firo

3
ฉันสับสนเล็กน้อย ฉันลองสิ่งนี้ แต่มันแค่จัดมุมมองให้อยู่ตรงกลางกับผู้ควบคุมมันไม่ปรับความสูงของมุมมอง
Dean

@Dean คุณจะต้องตรวจสอบให้แน่ใจว่าFirst Itemเป็นView.Topไม่ได้View.Center Yไม่ได้มิฉะนั้นจะเป็นเพียงแค่ศูนย์กลาง คุณจะต้องตรวจสอบให้แน่ใจว่ามีการตั้งข้อ จำกัด อื่น ๆ อย่างเหมาะสมเพื่อจัดการกับขอบอื่น ๆ ของมุมมอง
Firo

1
View.Top เท่ากับ Superview.Center ตัวคูณ Y 1 ทำให้คุณไม่มีส่วนสูง คำตอบนี้ไม่สมบูรณ์ สิ่งที่คุณต้องทำคือคิดถึงสิ่งที่คุณกำลังพูดและคุณจะเห็นว่ามันเป็นเส้นตรงข้ามศูนย์! ฉันจะแก้ไขคำตอบนี้เพื่อให้ชัดเจนว่าข้อ จำกัด อื่น ๆ ที่คุณกำลังพูดถึงคืออะไร
smileBot

184

โซลูชันสตอรีบอร์ดที่คุณสามารถกำหนดอัตราส่วนที่แน่นอนระหว่างมุมมองใด ๆ :

ตั้งค่าข้อ จำกัด ความสูงเท่ากัน

ขณะนี้:

แก้ไขตัวคูณของข้อ จำกัด

กำไร!!!

ผลลัพธ์

PS โปรดทราบด้วยว่าวิธีนี้ใช้ได้กับมุมมองในระดับการซ้อนที่แตกต่างกันและ (ใช้ได้อย่างชัดเจน) สำหรับความกว้าง

บางครั้ง PPS อาจมีประโยชน์ในการ "ย้อนกลับรายการแรกและรายการที่สอง" ของข้อ จำกัด หรือตั้งค่าตัวคูณย้อนกลับ (ตัวอย่าง 2 แทน 0.5) (แต่วิธีการเหล่านี้ไม่มีประโยชน์หากคุณไม่เข้าใจว่ามุมมองเกี่ยวข้องกันอย่างไร)


1
ขั้นตอนที่ 2 ดูเหมือนจะไม่เหมาะกับฉัน ฉันไม่สามารถเลือกอะไรก็ได้ในแผงควบคุมยกเว้นการสลับ 'ข้อ จำกัด ถึงระยะขอบ' ฉันกำลังพยายามกำหนดความกว้างของ UIImageView ใน UITableViewCell เป็น 50% ของมุมมองเนื้อหา
DrMickeyLauer

2
อัปเดต: ตัวสร้างส่วนต่อประสานที่เห็นได้ชัดไม่อนุญาตให้มุมมองเนื้อหาเป็นเป้าหมายที่ชัดเจนของข้อ จำกัด เลย์เอาต์อัตโนมัติใด ๆ ฉันต้องแทรกมุมมองย่อยจำลองเป็นลูกของมุมมองเนื้อหาเพื่อให้งานนี้
DrMickeyLauer

1
มันใช้งานได้สำหรับฉัน คุณต้องเลือกสองมุมมองในรายการไม่ใช่หน้าจอตัวสร้าง สำหรับเปอร์เซ็นต์แบ่งมุมมองที่เล็กลงด้วยมุมมองที่ใหญ่ขึ้นเพื่อรับค่าตัวคูณตัวอย่างเช่นมุมมองที่เล็กกว่า 25, มุมมองที่ใหญ่กว่า 135 - 25/135 = 0.185 ตั้งค่านี้เป็นค่าตัวคูณเพื่อรับมุมมองที่ x1 และ x2 = 25 แต่ปรับขนาดด้วย 6 และ 6 บวกที่มีขนาดใหญ่ขึ้นและอื่น ๆ
latenitecoder

1
สิ่งนี้ใช้งานได้สำหรับฉัน แต่โปรดทราบว่าฉันต้องเพิ่มข้อ จำกัด สามข้อที่กำหนดข้อ จำกัด ของมุมมองย่อยเป็น 0 ขอบคุณ
raddevus

นี่ควรเป็นคำตอบที่ยอมรับได้ ก่อนอื่นฉันลองตอบรับแล้ว มันไม่ทำงานแล้วฉันเลื่อนลงและฉันเห็นคำตอบนี้และมันก็ใช้ได้ ขอบคุณ!
Mihir Oza

31

หลังจากนั้นอีกเล็กน้อยฉันก็ทำตามสิ่งต่อไปนี้

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

- (void) viewWillAppear:(BOOL)animated
{

    NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:upperview
                                                                 attribute:NSLayoutAttributeHeight 
                                                                 relatedBy:0 
                                                                    toItem:self.view
                                                                 attribute:NSLayoutAttributeHeight
                                                                multiplier:.5 
                                                                  constant:0];
    [self.view addConstraint:constraint];

}

โดยพื้นฐานแล้วมันจะตั้งค่าทวีคูณของ 0.5 ต่อความสูงของ self.view ซึ่งทำหน้าที่เป็น upperview ฉันต้องตั้งค่าลำดับความสำคัญของข้อ จำกัด พื้นที่แนวตั้งด้านล่างใน IB ให้ต่ำกว่า 1,000 เพื่อหลีกเลี่ยงกลุ่มข้อความรันไทม์ที่เกี่ยวกับการทำลายข้อ จำกัด เช่นกัน

ดังนั้นหากทุกคนสามารถแสดงวิธีการทำสิ่งนี้ในเครื่องมือสร้างส่วนต่อประสานที่จะตอบคำถามของฉันได้ดีกว่ามิฉะนั้นฉันคิดว่านี่เป็นสิ่งที่ดีที่สุด (ตอนนี้) ???


3
ฉันคิดว่านี่ดีเท่าที่ได้รับตอนนี้ คงจะดีถ้า Apple ให้เราเข้าถึงค่าตัวคูณใน IB ดังนั้นจึงสามารถตั้งค่าได้เช่นเดียวกับค่าคงที่
rdelmar

3
สำหรับใครก็ตามที่ดูคำตอบนี้ตอนนี้ Xcode 5.1 จะช่วยให้คุณตั้งค่าตัวคูณได้ผ่านตัวสร้างส่วนต่อประสาน ตอนนี้ฉันสามารถกำหนดค่ามุมมองที่ครึ่งหนึ่งของความสูงของผู้ดูแลทั้งหมดผ่าน IB
Mark Krenek

9

ง่ายกว่าเล็กน้อยกว่าและตรงไปตรงมามากกว่าวิธีการมากกว่าคำตอบของฟีโอดอร์โวลค็อก - กดปุ่มควบคุมค้างไว้แล้วคลิกที่มุมมองย่อย - ยังคงกดปุ่มคำสั่งค้างไว้ลากเคอร์เซอร์ไปที่ผู้ดูแลแล้วคลิกที่ผู้ควบคุม - เลือก "อัตราส่วนภาพ"

ป้อนคำอธิบายรูปภาพที่นี่

- จากนั้นคลิกตัวตรวจสอบขนาด - จากนั้นดับเบิลคลิกที่ข้อ จำกัด ป้อนคำอธิบายรูปภาพที่นี่

- ตรวจสอบให้แน่ใจว่าได้เลือก "ความสูง" สำหรับทั้งสองรายการ ป้อนคำอธิบายรูปภาพที่นี่

- จากนั้นเปลี่ยน "ตัวคูณ" เป็น 0.5 สำหรับครึ่งหน้าจอหรือเศษส่วนใด ๆ ของผู้กำกับที่คุณต้องการ ป้อนคำอธิบายรูปภาพที่นี่


วิธีที่ง่ายและรวดเร็ว! ขอบคุณเพื่อน
Abdullah Saeed

7

ฉันยังมีความเป็นไปได้อีกอย่างในรหัสในกรณีที่คุณมี 2 วิวที่ควรมีความสูงเท่ากัน: เพียงแค่ตั้งค่าความสูงของวิว 2 เป็นความสูงของวิว 1 (เคล็ดลับที่นี่ไม่ได้ตั้งค่าความสูงของวิว 1 อย่างชัดเจน)

    [self.view addConstraints:[NSLayoutConstraint
        constraintsWithVisualFormat:@"V:[topLayoutGuide]-0-[_view1]-0-[_view2(==_view1)]-0-[bottomLayoutGuide]"
                            options:0
                            metrics:nil
                              views:viewsDict]];

ไม่ทราบว่าคุณสามารถอ้างอิงมุมมองอื่นสำหรับความกว้าง / ความสูงเช่นนั้นได้ นี่คือคำตอบที่สะอาดที่สุดหากคุณใช้ภาษารูปแบบภาพอยู่แล้ว
loeschg

ตัวอย่าง @brainray มีการอธิบายไว้ที่developer.apple.com ที่นี่ด้วย
alecs.popa

0

คำตอบของ Mete เวอร์ชันที่รวดเร็ว:

    override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.



    upperView.translatesAutoresizingMaskIntoConstraints = false


    var constraint = NSLayoutConstraint(item: upperView,
                                        attribute: NSLayoutAttribute.top,
                                        relatedBy: NSLayoutRelation.equal,
                                        toItem: self.view,
                                        attribute: NSLayoutAttribute.top,
                                        multiplier: 1,
                                        constant: 0)

    self.view.addConstraint(constraint)


    constraint = NSLayoutConstraint(item: upperView,
                                    attribute: NSLayoutAttribute.height,
                                    relatedBy: NSLayoutRelation.equal,
                                    toItem: self.view,
                                    attribute: NSLayoutAttribute.height,
                                    multiplier: 0.5,
                                    constant: 0)

    self.view.addConstraint(constraint)


    constraint = NSLayoutConstraint(item: upperView,
                                    attribute: NSLayoutAttribute.leading,
                                    relatedBy: NSLayoutRelation.equal,
                                    toItem: self.view,
                                    attribute: NSLayoutAttribute.leading,
                                    multiplier: 1,
                                    constant: 0)

    self.view.addConstraint(constraint)


    constraint = NSLayoutConstraint(item: upperView,
                                    attribute: NSLayoutAttribute.trailing,
                                    relatedBy: NSLayoutRelation.equal,
                                    toItem: self.view,
                                    attribute: NSLayoutAttribute.trailing,
                                    multiplier: 1,
                                    constant: 0)

    self.view.addConstraint(constraint)


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