เป็นไปได้หรือไม่ที่ UIStackView จะเลื่อนดู?


210

สมมติว่าฉันได้เพิ่มมุมมองเพิ่มเติมใน UIStackView ซึ่งสามารถแสดงได้ฉันจะUIStackViewเลื่อนได้อย่างไร


เหตุใดคุณจึงไม่ใช้มุมมองเลื่อนที่มีมุมมองสแต็ก (หรือหลายรายการ) สำหรับเนื้อหา
Wain

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

วิธีฝัง UIStackView ใน UIScrollView ใน iOS github.com/onmyway133/blog/issues/324
onmyway133

เกี่ยวกับคำถามที่สำคัญนี้ใน iOS ในความเป็นจริงมีสองวิธี (และสองเท่านั้น) ที่จะทำ - เหล่านั้นเป็นวิธีเดียวที่จะทำและคุณจะต้องปฏิบัติตามหนึ่งในสองขั้นตอนแน่นอน คำตอบของฉันด้านล่างมีการอัพเดทอยู่เสมอ
Fattie

ใช่. คุณต้องมี UIView ระดับกลางเป็นมุมมองเนื้อหาของ UIScrollView จากนั้นให้วาง UIStackView เป็นมุมมองย่อยของมุมมองเนื้อหา raywenderlich.com/…
poGUIst

คำตอบ:


577

ในกรณีที่ทุกคนกำลังมองหาวิธีการแก้ปัญหาโดยไม่ต้องใช้รหัสฉันได้สร้างตัวอย่างเพื่อทำสิ่งนี้อย่างสมบูรณ์ในกระดานเรื่องราวโดยใช้เค้าโครงอัตโนมัติ

คุณจะได้รับจากGitHub

โดยทั่วไปเพื่อสร้างตัวอย่าง (สำหรับการเลื่อนแนวตั้ง):

  1. สร้างUIScrollViewและตั้งข้อ จำกัด
  2. เพิ่มUIStackViewไปที่UIScrollView
  3. ตั้งข้อ จำกัด : Leading, Trailing,TopและBottomควรจะเท่ากับคนจากUIScrollView
  4. ตั้งค่าWidthข้อ จำกัด ที่เท่าเทียมกันระหว่างUIStackViewและUIScrollViewและ
  5. ตั้งค่าแกน = แนวตั้ง, การจัดแนว = เติม, การกระจาย = ระยะห่างเท่ากันและระยะห่าง = 0 บน UIStackView
  6. เพิ่มจำนวน UIViewsไปUIStackView
  7. วิ่ง

แลกเปลี่ยนWidthสำหรับHeightในขั้นตอนที่ 4 และชุดAxis= Horizontalในขั้นตอนที่ 5 จะได้รับ UIStackView แนวนอน


55
ขอบคุณ! "4. ตั้งค่าข้อจำกัดความกว้างเท่ากันระหว่าง UIStackView และ UIScrollView" เป็นกุญแจสำคัญ;)
ว่าง

19
หมายเลข 6 ก็มีความสำคัญเช่นกัน ต้องการที่จะเพิ่มมุมมองทั้งหมดในรหัส แต่แล้วเค้าโครงอัตโนมัติแสดงข้อ จำกัด ที่ขาดหายไปใน IB
ก่อน

11
สวัสดีดูเหมือนว่าโซลูชันนี้ใช้ไม่ได้กับการเลื่อนในแนวนอน ในขั้นตอนที่ 4 แทนที่จะตั้งค่าความกว้างเท่ากันฉันถือว่าการตั้งความสูงเท่ากันและ Axis = แนวนอน ฉันลองและไม่ทำงาน
Seto Elkahfi

5
การเพิ่มข้อ จำกัด เพื่อให้ stackview และ scrollview มีความกว้างเท่ากันจะลบคำเตือนออกจากตัวสร้างอินเตอร์เฟส แต่การเลื่อนจะถูกปิดใช้งาน การเลื่อนเกิดขึ้นเมื่อมุมมองเนื้อหาภายใน scrollview มีขนาดใหญ่กว่า scrollview!
Jason Moore

6
หากต้องการอธิบายรายละเอียดในจุดที่ 6 หากมุมมองแบบสแต็กไม่มีองค์ประกอบ แต่มีข้อ จำกัด ทั้งหมดคุณจะได้รับ "การเลื่อนดูต้องการข้อ จำกัด สำหรับตำแหน่งหรือความสูง Y" เพียงเพิ่มป้ายกำกับในมุมมองสแต็กทำให้คำเตือนนี้หายไป!
Faisal Memon

45

แอปเปิ้ลออโต้คู่มือการจัดรวมทั้งส่วนในการทํางานกับเลื่อนชม ตัวอย่างบางส่วนที่เกี่ยวข้อง:

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

นอกจากนี้:

โครงร่างของคุณต้องกำหนดขนาดของมุมมองเนื้อหาทั้งหมด (ยกเว้นที่กำหนดไว้ในขั้นตอนที่ 5 และ 6) …เมื่อมุมมองเนื้อหาสูงกว่ามุมมองเลื่อนมุมมองเลื่อนจะเปิดใช้งานการเลื่อนแนวตั้ง เมื่อมุมมองเนื้อหากว้างกว่ามุมมองเลื่อนมุมมองเลื่อนจะเปิดใช้งานการเลื่อนแนวนอน

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

// Pin the edges of the stack view to the edges of the scroll view that contains it
stackView.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
stackView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
stackView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor).isActive = true
stackView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true

// Set the width of the stack view to the width of the scroll view for vertical scrolling
stackView.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true

1
ขอขอบคุณ แต่การละเว้นข้อจำกัดความสูง (เพื่ออนุญาตให้เลื่อนแนวตั้ง) ทำให้เกิดข้อผิดพลาดนี้ในกระดานเรื่องราว: Need constraints for: Y position or height.ข้อผิดพลาดนี้จะหายไปถ้าคุณตั้งค่าทั้งความกว้างและความสูงสำหรับข้อ จำกัด ของมุมมองสแต็ก รหัสนี้ยังใช้ได้กับคุณหรือไม่?
Crashalot

@Crashalot เพื่อกำจัดข้อผิดพลาดที่คุณต้องเพิ่มมุมมองย่อยให้กับมุมมองสแต็ก; ดูคำตอบของฉันด้านล่าง
pkamb

16

ข้อ จำกัด ในคำตอบที่ได้รับการโหวตสูงสุดที่นี่ใช้ได้สำหรับฉันและฉันวางภาพของข้อ จำกัด ด้านล่างตามที่สร้างไว้ในกระดานเรื่องราวของฉัน

ฉันตีสองประเด็นแม้ว่าคนอื่นควรระวัง:

  1. หลังจากเพิ่มข้อ จำกัด Need constraints for: X position or widthที่คล้ายกับผู้ที่อยู่ในในคำตอบที่ได้รับการยอมรับผมได้รับข้อผิดพลาด สิ่งนี้ได้รับการแก้ไขโดยการเพิ่ม UILabel เป็นมุมมองย่อยของมุมมองสแต็ก

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

  2. ตอนแรกฉันพยายามเพิ่มUIButtonsใน UIStackView ปุ่มและมุมมองที่จะโหลด แต่มุมมองเลื่อนจะไม่เลื่อน สิ่งนี้ได้รับการแก้ไขโดยการเพิ่มUILabelsไปที่มุมมองสแต็กแทนที่จะเป็นปุ่ม การใช้ข้อ จำกัด เดียวกันลำดับชั้นมุมมองนี้กับ UILabels เลื่อน แต่ UIButtons ไม่ได้

    ฉันสับสนโดยปัญหานี้เป็น UIButtons ไม่ดูเหมือนจะมี IntrinsicContentSize (ใช้โดยกอง View) หากใครรู้ว่าทำไมปุ่มไม่ทำงานฉันชอบที่จะรู้ว่าทำไม

นี่คือลำดับชั้นการดูและข้อ จำกัด ของฉันสำหรับการอ้างอิง:

ข้อ จำกัด สำหรับมุมมองสแต็กในมุมมองเลื่อน [1]


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

15

ในฐานะที่เป็น Eik กล่าวUIStackViewและUIScrollViewเล่นด้วยกันอย่างเห็นที่นี่

กุญแจสำคัญคือการUIStackViewจัดการความสูง / ความกว้างของตัวแปรสำหรับเนื้อหาที่แตกต่างและUIScrollViewจากนั้นทำงานได้ดีในการเลื่อน / กำยำเนื้อหานั้น:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    scrollView.contentSize = CGSize(width: stackView.frame.width, height: stackView.frame.height)       
}

2
ไม่จำเป็นต้องรวมการจัดวางด้วยตนเองและการจัดวางอัตโนมัติเพื่ออนุญาตให้มีมุมมองแบบสแต็กที่เลื่อนได้ คุณเพียงต้องการจำกัดความกว้างและ / หรือความสูงของมุมมองสแต็ก ดูคำตอบของฉันสำหรับรายละเอียดและลิงค์ไปยังเอกสาร Apple ที่เกี่ยวข้อง
titaniumdecoy

ตัวอย่าง GitHub ทำงานได้อย่างสมบูรณ์และชัดเจนมาก ขอบคุณสำหรับการแบ่งปัน.
Behr

stackView.translatesAutoresizingMaskIntoConstraints = false นี่เป็นการหลอกลวงในกรณีของฉัน
Howl Jenkins

10

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

ในการสรุปฝังของUIStackViewคุณUIScrollViewและตั้งค่าข้อ จำกัด ของสมอUIStackViewให้ตรงกับUIScrollView:

stackView.leadingAnchor.constraintEqualToAnchor(scrollView.leadingAnchor).active = true
stackView.trailingAnchor.constraintEqualToAnchor(scrollView.trailingAnchor).active = true
stackView.bottomAnchor.constraintEqualToAnchor(scrollView.bottomAnchor).active = true
stackView.topAnchor.constraintEqualToAnchor(scrollView.topAnchor).active = true
stackView.widthAnchor.constraintEqualToAnchor(scrollView.widthAnchor).active = true

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

10
พวกเขาไม่ได้ซ้ำกันจริงๆในกรณีนี้ อีกคำถามหนึ่งถามว่าจะทำอย่างไรโดยทางโปรแกรมในขณะที่คำถามนี้ไม่ได้ ที่จริงคำตอบที่ดีที่สุดสำหรับคำถามนี้ให้วิธีการ GUI เพื่อให้บรรลุผล อย่างไรก็ตามโซลูชันเชิงโปรแกรมอาจมีประโยชน์ต่อผู้ใช้บางคน
Dalmazio

9

ทันสมัยสำหรับปี 2563

กระดานเรื่องราว 100% หรือรหัส 100%


นี่คือคำอธิบายที่ง่ายที่สุดที่เป็นไปได้:

  1. มีฉากเต็มหน้าจอว่างเปล่า

  2. เพิ่มมุมมองเลื่อน ควบคุมการลากจากมุมมองเลื่อนไปที่มุมมองพื้นฐานเพิ่มซ้ายขวาบนล่างทั้งหมดเป็นศูนย์

  3. เพิ่มมุมมองสแต็กในมุมมองเลื่อน ควบคุมการลากจากมุมมองสแต็กไปยังมุมมองเลื่อนเพิ่มซ้ายขวาบนล่างทั้งหมดเป็นศูนย์

  4. วางสองหรือสามป้ายภายในมุมมองสแต็ก

เพื่อความชัดเจนให้ทำให้สีพื้นหลังของฉลากเป็นสีแดง ตั้งความสูงของฉลากเป็น 100

  1. ตอนนี้ตั้งค่าความกว้างของแต่ละ UILabel:

    น่าแปลกที่การควบคุมการลากจากUILabelไปยังมุมมองเลื่อนไม่ไปที่มุมมองสแต็คและเลือกความกว้างเท่ากัน

ทำซ้ำ:

อย่าควบคุมการลากจาก UILabel ไปยังผู้ปกครองของ UILabel - ไปที่ปู่ย่าตายาย (กล่าวอีกนัยหนึ่งไปจนถึงมุมมองเลื่อนอย่าไปที่มุมมองสแต็ก)

มันง่ายมาก นั่นเป็นความลับ

เคล็ดลับความลับ - ข้อผิดพลาดของ Apple:

มันจะไม่ทำงานกับไอเท็มเดียวเท่านั้น! เพิ่มป้ายกำกับเล็กน้อยเพื่อให้การสาธิตทำงานได้

คุณทำเสร็จแล้ว

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


วิธีการทางเลือก:

ในด้านบน: น่าประหลาดใจที่ตั้งค่าความกว้างของ UILabels เป็นความกว้างของมุมมองเลื่อน (ไม่ใช่มุมมองสแต็ก)

อีกวิธีหนึ่งคือ ...

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

ดังนั้นคุณมีสองทางเลือก:

  1. น่าแปลกที่ตั้งค่าความกว้างของแต่ละรายการในมุมมองสแต็กเป็นความกว้างของ grandparent scrollview ( ไม่ใช่พาเรนต์ stackview )

หรือ

  1. น่าแปลกที่ตั้งค่า "ความกว้างเท่ากัน" ของ stackview เป็น scrollview - แม้ว่าคุณจะมีขอบซ้ายและขวาของ stackview ที่ถูกตรึงอยู่กับ scrollview อยู่ดี

เพื่อให้ชัดเจนทำหนึ่งในวิธีเหล่านั้นอย่าทำทั้งสองอย่าง


8

การเลื่อนในแนวนอน (UIStackView ภายใน UIScrollView)

สำหรับการเลื่อนแนวนอน ก่อนอื่นสร้างUIStackViewและ a UIScrollViewและเพิ่มลงในมุมมองของคุณด้วยวิธีต่อไปนี้:

let scrollView = UIScrollView()
let stackView = UIStackView()

scrollView.addSubview(stackView)
view.addSubview(scrollView)

ความทรงจำที่จะตั้งtranslatesAutoresizingMaskIntoConstraintsไปfalseบนUIStackViewและUIScrollView:

stackView.translatesAutoresizingMaskIntoConstraints = false
scrollView.translatesAutoresizingMaskIntoConstraints = false

ในการทำให้ทุกอย่างทำงานได้อย่างUIStackViewถูกต้องจะต้องมีค่าเท่ากับUIScrollViewจุดยึด:

stackView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
stackView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor).isActive = true
stackView.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
stackView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true

แต่ความกว้างของสมอUIStackViewต้องเท่ากับหรือมากกว่าความกว้างของUIScrollViewสมอ:

stackView.widthAnchor.constraint(greaterThanOrEqualTo: scrollView.widthAnchor).isActive = true

ตอนนี้ยึดของคุณUIScrollViewตัวอย่างเช่น:

scrollView.heightAnchor.constraint(equalToConstant: 80).isActive = true
scrollView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true

scrollView.bottomAnchor.constraint(equalTo:view.safeAreaLayoutGuide.bottomAnchor).isActive = true
scrollView.leadingAnchor.constraint(equalTo:view.leadingAnchor).isActive = true
scrollView.trailingAnchor.constraint(equalTo:view.trailingAnchor).isActive = true 

ถัดไปฉันขอแนะนำให้ลองตั้งค่าต่อไปนี้สำหรับการUIStackViewจัดตำแหน่งและการกระจาย:

topicStackView.axis = .horizontal
topicStackView.distribution = .equalCentering
topicStackView.alignment = .center

topicStackView.spacing = 10

ในที่สุดคุณจะต้องใช้addArrangedSubview:วิธีนี้เพื่อเพิ่มการดูย่อยลงใน UIStackView ของคุณ

แทรกข้อความ

คุณสมบัติเพิ่มเติมอย่างหนึ่งที่คุณอาจพบว่ามีประโยชน์ก็คือเพราะสิ่งที่UIStackViewอยู่ภายในUIScrollViewคุณสามารถเข้าถึงส่วนแทรกข้อความเพื่อทำให้สิ่งต่าง ๆ ดูน่ารักขึ้น

let inset:CGFloat = 20
scrollView.contentInset.left = inset
scrollView.contentInset.right = inset

// remember if you're using insets then reduce the width of your stack view to match
stackView.widthAnchor.constraint(greaterThanOrEqualTo: topicScrollView.widthAnchor, constant: -inset*2).isActive = true

7

เพียงเพิ่มลงในviewdidload:

let insets = UIEdgeInsetsMake(20.0, 0.0, 0.0, 0.0)
scrollVIew.contentInset = insets
scrollVIew.scrollIndicatorInsets = insets

แหล่งที่มา: https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/LayoutUsingStackViews.html


ไม่สามารถบอกคุณได้ว่าสิ่งนี้ช่วยให้ฉันประหยัดค่าใช้จ่าย Autoway + ScrollView มากแค่ไหน พบว่ายอดเยี่ยมบนลิงก์ Apple
อุทิศ

ทำอะไร จะเกิดอะไรขึ้นหากปราศจากสิ่งนี้
ฮันนี่

นี้จะวางเนื้อหามุมมองเลื่อนด้านล่างแถบสถานะ
turingtested

2

คุณสามารถลองใช้ScrollableStackView : https://github.com/gurhub/ScrollableStackView

มันเป็นห้องสมุดที่รองรับ Objective-C และ Swift มันสามารถใช้ได้ผ่านCocoaPods

โค้ดตัวอย่าง (Swift)

import ScrollableStackView

var scrollable = ScrollableStackView(frame: view.frame)
view.addSubview(scrollable)

// add your views with 
let rectangle = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 55))
rectangle.backgroundColor = UIColor.blue
scrollable.stackView.addArrangedSubview(rectangle)
// ...

โค้ดตัวอย่าง (Objective-C)

@import ScrollableStackView

ScrollableStackView *scrollable = [[ScrollableStackView alloc] initWithFrame:self.view.frame];
scrollable.stackView.distribution = UIStackViewDistributionFillProportionally;
scrollable.stackView.alignment = UIStackViewAlignmentCenter;
scrollable.stackView.axis = UILayoutConstraintAxisVertical;
[self.view addSubview:scrollable];

UIView *rectangle = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 55)];
[rectangle setBackgroundColor:[UIColor blueColor]];

// add your views with
[scrollable.stackView addArrangedSubview:rectangle]; 
// ...

สวัสดีปีเตอร์จริง ๆ แล้วเป็นความคิดที่ดี! ผลงานยินดีต้อนรับเสมอโปรดส่งคำขอดึงนี้ ดีที่สุด
mgyky

0

หากคุณมีข้อ จำกัด ในการจัดมุมมองสแต็กตรงกลางภายในมุมมองเลื่อนเพียงแค่ลบออก


0

ตัวอย่างสำหรับ stackview / scrollview แนวตั้ง (ใช้EasyPeasyสำหรับ autolayout):

let scrollView = UIScrollView()
self.view.addSubview(scrollView)
scrollView <- [
    Edges(),
    Width().like(self.view)
]

let stackView = UIStackView(arrangedSubviews: yourSubviews)
stackView.axis = .vertical
stackView.distribution = .fill    
stackView.spacing = 10
scrollView.addSubview(stackView)
stackView <- [
    Edges(),
    Width().like(self.view)
]

เพียงตรวจสอบให้แน่ใจว่าได้กำหนดความสูงของแต่ละมุมมองย่อยแล้ว!


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

  2. หลังจากนี้ทำให้ตัวควบคุมมุมมองเป็นอิสระ (เลือกจากตัวตรวจสอบคุณสมบัติ) และตั้งค่าความสูงและความกว้างตามขนาดเนื้อหาที่แท้จริงของมุมมองของคุณ (เลือกจากตัวตรวจสอบขนาด)

  3. หลังจากนี้ในตัวควบคุมมุมมองใส่มุมมองเลื่อนและนี่คือตรรกะซึ่งฉันได้พบว่าทำงานเกือบทุกครั้งใน iOS (มันอาจต้องผ่านเอกสารของมุมมองที่ชั้นที่หนึ่งสามารถรับผ่านคำสั่ง + คลิกที่ ชั้นเรียนนั้นหรือผ่าน googling)

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

ในขณะที่ทำงานกับมุมมองสแต็ก

  • ก่อนอื่นให้เริ่มจากบริเวณด้านล่าง (ขึ้นด้านล่าง) เช่นหากคุณมีป้ายชื่อฟิลด์ข้อความและรูปภาพในมุมมองของคุณให้กำหนดมุมมองเหล่านี้ก่อน

  • หลังจากนั้นปรับแต่งคุณสมบัติของมุมมองสแต็ก หากมุมมองที่ต้องการยังไม่บรรลุผลให้ใช้มุมมองสแต็กอื่น

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

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


0

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

ตั้งค่าข้อจำกัดความกว้างเท่ากันระหว่าง UIStackView และ UIScrollView

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


0

หากใครที่กำลังมองหา scrollview ในแนวนอน

func createHorizontalStackViewsWithScroll() {

 self.view.addSubview(stackScrollView)
 stackScrollView.translatesAutoresizingMaskIntoConstraints = false
 stackScrollView.heightAnchor.constraint(equalToConstant: 85).isActive = true
 stackScrollView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor).isActive = true
 stackScrollView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor).isActive = true
 stackScrollView.bottomAnchor.constraint(equalTo: visualEffectViews.topAnchor).isActive = true
 stackScrollView.addSubview(stackView)

 stackView.translatesAutoresizingMaskIntoConstraints = false
 stackView.topAnchor.constraint(equalTo: stackScrollView.topAnchor).isActive = true
 stackView.leadingAnchor.constraint(equalTo: stackScrollView.leadingAnchor).isActive = true
 stackView.trailingAnchor.constraint(equalTo: stackScrollView.trailingAnchor).isActive = true
 stackView.bottomAnchor.constraint(equalTo: stackScrollView.bottomAnchor).isActive = true
 stackView.heightAnchor.constraint(equalTo: stackScrollView.heightAnchor).isActive = true

 stackView.distribution = .equalSpacing
 stackView.spacing = 5
 stackView.axis = .horizontal
 stackView.alignment = .fill


 for i in 0 ..< images.count {
 let photoView = UIButton.init(frame: CGRect(x: 0, y: 0, width: 85, height: 85))
 // set button image
 photoView.translatesAutoresizingMaskIntoConstraints = false
 photoView.heightAnchor.constraint(equalToConstant: photoView.frame.height).isActive = true
 photoView.widthAnchor.constraint(equalToConstant: photoView.frame.width).isActive = true

 stackView.addArrangedSubview(photoView)
 }
 stackView.setNeedsLayout()

 }

0

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

Scroll View.Leading = Superview.LeadingMargin
Scroll View.Trailing = Superview.TrailingMargin
Scroll View.Top = Superview.TopMargin
Bottom Layout Guide.Top = Scroll View.Bottom + 20.0
Stack View.Leading = Scroll View.Leading
Stack View.Trailing = Scroll View.Trailing
Stack View.Top = Scroll View.Top
Stack View.Bottom = Scroll View.Bottom
Stack View.Width = Scroll View.Width

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

รหัส: Stack View.Width = Scroll View.Widthเป็นกุญแจสำคัญ


0

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

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

นี่จะเป็นการสร้างวงวนไม่สิ้นสุด ฉันไม่คุ้นเคยกับUIScrollViewมันadjustedContentInsetมากนัก แต่จากบันทึกของฉันในlayoutSubviewsวิธีการของฉันฉันเห็นพฤติกรรมดังต่อไปนี้:

  • หนึ่งขยายหน้าต่าง
  • UIScrollView พยายามหดขอบเขต (เนื่องจากไม่จำเป็นต้องใช้พื้นที่ด้านล่างแถบเครื่องมือ)
  • UIStackView ดังต่อไปนี้
  • อย่างใดUIScrollViewไม่พอใจและตัดสินใจที่จะคืนค่าขอบเขตที่ใหญ่กว่า สิ่งนี้รู้สึกแปลกมากสำหรับฉันเนื่องจากสิ่งที่ฉันเห็นจากบันทึกคือUIScrollView.bounds.height == UIStackView.bounds.heightนี้รู้สึกแปลกมากกับผมตั้งแต่สิ่งที่ผมเห็นจากบันทึกว่า
  • UIStackView ดังต่อไปนี้
  • จากนั้นวนไปที่ขั้นตอนที่ 2

สำหรับฉันแล้วดูเหมือนว่าสองขั้นตอนจะแก้ไขปัญหาได้:

  • จัดไปUIStackView.topUIScrollView.topMargin
  • ตั้งค่าการcontentInsetAdjustmentBehavior.never

UIStackViewนี่ฉันกังวลกับมุมมองเลื่อนในแนวตั้งที่มีการเจริญเติบโตในแนวตั้ง สำหรับคู่แนวนอนให้เปลี่ยนรหัสตาม

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

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