วิธีเพิ่มช่องว่างชั้นนำเพื่อดูเพิ่มใน UIStackView


130

นี่คือการตั้งค่าของฉัน: ฉันมีUIScrollViewขอบที่นำหน้าด้านบนและขอบทดลองตั้งค่าเป็น 0 ข้างในนี้ฉันเพิ่มUIStackViewด้วยข้อ จำกัด นี้:

stackView.centerYAnchor.constraintEqualToAnchor(selectedContactsScrollView.centerYAnchor).active = true  
stackView.leadingAnchor.constraintEqualToAnchor(selectedContactsScrollView.leadingAnchor).active = true

ภายในมุมมองสแต็กฉันเพิ่มมุมมองบางส่วน
ปัญหาของฉันคือเนื่องจากข้อ จำกัด มุมมองแรกที่เพิ่มในมุมมองสแต็กจะมีขอบนำหน้า = 0

ฉันจะเพิ่มช่องว่างภายในมุมมองแรกได้อย่างไร โดยไม่ต้องปรับข้อ จำกัด มุมมองการเลื่อน


2
คุณจะเปลี่ยนคำตอบที่ยอมรับหรือไม่ คำตอบของ Tolga ดูเหมือนจะดีกว่ามาก
น้ำผึ้ง

คำตอบ:


27

โซลูชันที่คุณระบุไม่ได้เพิ่มช่องว่างภายในสำหรับมุมมองของคุณใน UIStackView ของคุณ (ตามที่คุณต้องการในคำถาม) แต่จะเพิ่มส่วนนำสำหรับ UIStackView

วิธีแก้ปัญหาคือการเพิ่ม UIStackView อื่นภายใน UIStackView เดิมของคุณและนำไปสู่ ​​UIStackVIew ใหม่นี้ จากนั้นเพิ่มมุมมองของคุณใน UIStackView ใหม่นี้

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


379

เมื่อisLayoutMarginsRelativeArrangementคุณสมบัติเป็นจริงมุมมองสแต็กจะจัดวางมุมมองที่จัดเรียงโดยสัมพันธ์กับระยะขอบโครงร่าง

stackView.layoutMargins = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)
stackView.isLayoutMarginsRelativeArrangement = true

แต่จะส่งผลต่อมุมมองที่จัดเรียงทั้งหมดภายในไปยังมุมมองสแต็ก หากคุณต้องการช่องว่างภายในสำหรับมุมมองที่จัดเรียงเพียงมุมมองเดียวคุณต้องใช้ซ้อนกันUIStackView


2
isLayoutMarginsRelativeArrangementเป็น getter, layoutMarginsRelativeArrangementหมาถูก ฉันไม่สามารถแก้ไขคำตอบได้
maross

5
@maross ไม่มีความแตกต่างระหว่างฟังก์ชัน getter และ setter ใน Swift แต่คุณพูดถูกคนที่พัฒนาด้วย Objective-C ควรใช้layoutMarginsRelativeArrangementแทน เอกสารอย่างเป็นทางการ: developer.apple.com/reference/uikit/uistackview/…
Tolga Okur

3
สำหรับ Objective-C:stackView.layoutMargins = UIEdgeInsetsMake(0, 20, 0, 20); [stackView setLayoutMarginsRelativeArrangement:YES];
Snouto

4
ก.พ. 2019 ตอนเที่ยงคืนนั่งอยู่ที่สำนักงาน - คำตอบเหล่านี้ทำให้ฉันมีแรงที่จะก้าวต่อไป ขอบคุณ @tolpp
nefarianblack

158

ฉันพบว่าข้อ จำกัด ใช้ไม่ได้ใน Stack View หรือดูค่อนข้างแปลก

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

stackview ภายใน stackview

ในการตั้งค่าระยะขอบโครงร่างสำหรับมุมมองทั้งหมดภายใน stackview ให้เลือก:

Stack View > Size Inspector > Layout Margins > Fixed

หมายเหตุ: "Fixed"ตัวเลือกเดิมเรียกว่า"Explicit"ดังที่เห็นในภาพหน้าจอ

จากนั้นเพิ่มช่องว่างภายในของคุณ:

สตอรี่บอร์ด


23
หนึ่งในสิ่งที่ Apple ซ่อนไว้ ฉันเกลียดที่ Xcode ตรงข้ามกับความดีเป็นมิตรและใช้งานง่าย ขอบคุณ
เป็ด

Xcode หยุดทำงานเมื่อฉันเปลี่ยนระยะขอบของโครงร่างที่ชัดเจนเหล่านั้น ส่งข้อผิดพลาด แต่พวกเขาตอบว่ามันซ้ำกัน
mvandillen

นั่นคือสิ่งที่ฉันหาไม่เจอใน UI เปลี่ยนระยะขอบของเค้าโครงเป็น Explicit เพื่อดูเขตข้อมูลสำหรับระยะขอบของ Stack View
pkamb

13
ปัจจุบัน FYI XCode 9 เรียกสิ่งนี้ว่า "คงที่" แทน "Explicit"
Mel

นอกจากนี้ใน Xcode 9 ให้ยกเลิกการเลือก "ใช้คำแนะนำเค้าโครงพื้นที่ปลอดภัย" ในตัวตรวจสอบไฟล์ซึ่งในขณะที่เขียนยังคงทำให้เกิดปัญหามากมายใน IB และปฏิบัติตามคำแนะนำรูปแบบปกติสำหรับข้อ จำกัด ของคุณ
PJ_Finnegan

16

สิ่งที่ได้ผลสำหรับฉันคือการเพิ่มในสแต็กดู UIView อื่นที่เป็นเพียงตัวเว้นวรรค (อย่างน้อยก็ใช้งานได้กับ stackView.distribution = .Fill):

let spacerView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: 10))
stackView.addArrangedSubview(spacerView)
stackView.addArrangedSubview(viewThatNeedsSpaceBeforeIt)
stackView.addArrangedSubview(NextView)...

5

รวดเร็ว 3: คุณต้องตั้งค่าชดเชยโดย:

firstView.leadingAnchor.constraint(equalTo: parentView.leadingAnchor, constant: 200).isActive = true

ตรวจสอบให้แน่ใจว่าข้อ จำกัด นี้ถูกตั้งค่าหลังจากคุณ parentView.addArrangdSubView(firstView)


สิ่งนี้จะย้ายสแต็กทั้งหมดตามค่าคงที่ที่ระบุ
Zorayr

4

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

นอกจากนี้คุณยังสามารถตั้งค่าการจัดแนวของมุมมองสแต็กเป็น "กึ่งกลาง" จากนั้นคุณสามารถใช้ข้อ จำกัด Leading และ / หรือ Trailing เพื่อให้แต่ละรายการมีช่องว่างภายในทั้งสองด้านของตัวเอง


คุณสามารถให้ตัวอย่างโค้ดได้หรือไม่?
Zorayr

1

คำถามนี้มีคำตอบที่ดีอยู่แล้วข้อเสนอแนะหนึ่งข้อให้ใช้spacingคุณสมบัติเพื่อกำหนดระยะห่างระหว่างมุมมอง สำหรับมุมมองแรกและมุมมองสุดท้ายอาจมีสองตัวเลือก ได้แก่ ตั้งค่าอินเซ็ตตามที่ @tolpp แนะนำหรือเพิ่มข้อ จำกัด ที่แนบกับพาเรนต์ (stackview) พร้อมค่าคงที่เพื่อเพิ่มช่องว่างภายใน


1

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

ซึ่งสามารถทำได้ในตัวสร้างอินเทอร์เฟซและโดยใช้โปรแกรม


0

สิ่งที่เราทำคือเพิ่มส่วนประกอบโปร่งใส (เช่น UIButton / UIView) เป็นลูกแรกและลูกสุดท้ายของ UIStackView จากนั้นตั้งค่า จำกัด ความกว้างของเด็กที่มองไม่เห็นเหล่านี้เพื่อปรับระยะห่าง


-3

ดูเหมือนว่าวิธีแก้ปัญหานั้นค่อนข้างง่าย แทน:

stackView.leadingAnchor.constraintEqualToAnchor(selectedContactsScrollView.leadingAnchor).active = true

ฉันเพิ่งเขียน:

stackView.leadingAnchor.constraintEqualToAnchor(selectedContactsScrollView.leadingAnchor, constant: 15).active = true

1
จริงๆแล้วรหัสของคุณเพิ่มส่วนนำสำหรับ uistackview ภายใน urscrollview แต่จะไม่เพิ่มช่องว่างสำหรับมุมมองของคุณใน uistackview ของคุณ (ตามที่คำถามระบุ)
William Kinaan

ใช่ แต่ฉันไม่รู้ว่าคุณสามารถเพิ่มช่องว่างภายในได้หรือไม่สิ่งนี้จะได้ผลสำหรับฉัน
Adrian

เป็นความคิดแรกคุณสามารถดู uistackview อื่นแทรกมุมมอง uistack เดิมของคุณและเพิ่มช่องว่างให้กับมันได้ จากนั้นเพิ่มมุมมองของคุณใน uistackview ใหม่นี้ (คุณสามารถทำได้อย่างสมบูรณ์โดยตัวสร้างอินเทอร์เฟซไม่จำเป็นต้องเขียนโค้ด)
William Kinaan

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