ฉันเพิ่งต่อสู้กับข้อผิดพลาดการจัดวางอัตโนมัติเมื่อซ่อนไฟล์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)
ฉันพบว่ามันง่ายกว่าการทำบัญชีตามข้อ จำกัด การจัดลำดับความสำคัญ ฯลฯ
หากคุณมีสิ่งที่คุณต้องการซ่อนไว้โดยค่าเริ่มต้นคุณก็สามารถวางมันออกมาบนกระดานและลบในและอัปเดตได้โดยไม่ต้องใช้การเคลื่อนไหวviewDidLoad
view.layoutIfNeeded()