ฉันเพิ่งต่อสู้กับข้อผิดพลาดการจัดวางอัตโนมัติเมื่อซ่อนไฟล์UIStackView. แทนที่จะเก็บหนังสือและห่อสแต็คจำนวนUIViewsมากฉันเลือกที่จะสร้างทางออกสำหรับparentStackViewร้านค้าของฉันและร้านค้าสำหรับเด็กที่ฉันต้องการซ่อน / เลิกซ่อน
@IBOutlet weak var parentStackView: UIStackView!
@IBOutlet var stackViewNumber1: UIStackView!
@IBOutlet var stackViewNumber2: UIStackView!
ในสตอรีบอร์ดนี่คือลักษณะของ parentStack ของฉัน:

มีลูก 4 คนและเด็ก ๆ แต่ละคนมีมุมมองซ้อนกันอยู่ข้างใน เมื่อคุณซ่อนมุมมองแบบสแต็กหากมีองค์ประกอบ UI ที่เป็นมุมมองแบบสแต็กเช่นกันคุณจะเห็นข้อผิดพลาดของการจัดวางอัตโนมัติ แทนที่จะซ่อนฉันเลือกที่จะลบออก
ในตัวอย่างของฉันparentStackViewsมีอาร์เรย์ของ 4 องค์ประกอบ ได้แก่ Top Stack View, StackViewNumber1, Stack View Number 2 และ Stop Button ดัชนีของพวกเขาarrangedSubviewsคือ 0, 1, 2 และ 3 ตามลำดับ เมื่อฉันต้องการซ่อนหนึ่งฉันเพียงแค่ลบออกจากparentStackView's arrangedSubviewsอาร์เรย์ เนื่องจากมันไม่ได้อ่อนแอมันจึงยังคงอยู่ในหน่วยความจำและคุณสามารถใส่กลับไปที่ดัชนีที่คุณต้องการได้ในภายหลัง ฉันไม่ได้เริ่มต้นใหม่ดังนั้นมันจึงแฮงค์เอาท์จนกว่าจะจำเป็น แต่ไม่ได้ขยายหน่วยความจำ
โดยพื้นฐานแล้วคุณสามารถ ...
1) ลาก IBOutlets สำหรับสแต็กหลักของคุณและเด็ก ๆ ที่คุณต้องการซ่อน / เลิกซ่อนไปที่กระดานเรื่องราว
2) เมื่อคุณต้องการซ่อนให้ลบสแต็กที่คุณต้องการซ่อนจากparentStackView's arrangedSubviewsอาร์เรย์
3) โทรด้วยself.view.layoutIfNeeded()UIView.animateWithDuration
หมายเหตุสอง stackViews weakที่ผ่านมาไม่ได้ คุณต้องเก็บไว้รอบ ๆ เมื่อคุณเลิกซ่อน
สมมติว่าฉันต้องการซ่อน stackViewNumber2:
parentStackView.removeArrangedSubview(stackViewNumber2)
stackViewNumber2.removeFromSuperview()
จากนั้นทำให้เคลื่อนไหว:
UIView.animate(withDuration: 0.25,
delay: 0,
usingSpringWithDamping: 2.0,
initialSpringVelocity: 10.0,
options: [.curveEaseOut],
animations: {
self.view.layoutIfNeeded()
},
completion: nil)
หากคุณต้องการ "ยกเลิกการซ่อน" ในstackViewNumber2ภายหลังคุณสามารถแทรกลงในparentStackView arrangedSubViewsดัชนีที่ต้องการและทำให้การอัปเดตเคลื่อนไหวได้
parentStackView.removeArrangedSubview(stackViewNumber1)
stackViewNumber1.removeFromSuperview()
parentStackView.insertArrangedSubview(stackViewNumber2, at: 1)
UIView.animate(withDuration: 0.25,
delay: 0,
usingSpringWithDamping: 2.0,
initialSpringVelocity: 10.0,
options: [.curveEaseOut],
animations: {
self.view.layoutIfNeeded()
},
completion: nil)
ฉันพบว่ามันง่ายกว่าการทำบัญชีตามข้อ จำกัด การจัดลำดับความสำคัญ ฯลฯ
หากคุณมีสิ่งที่คุณต้องการซ่อนไว้โดยค่าเริ่มต้นคุณก็สามารถวางมันออกมาบนกระดานและลบในและอัปเดตได้โดยไม่ต้องใช้การเคลื่อนไหวviewDidLoadview.layoutIfNeeded()