Gần đây tôi đã phải vật lộn với lỗi bố cục tự động khi ẩn a UIStackView
. Thay vì thực hiện một loạt các ngăn xếp và giữ sách UIViews
, tôi đã chọn tạo một lối thoát cho parentStackView
các cửa hàng của tôi và cho những đứa trẻ mà tôi muốn giấu / bỏ ẩn.
@IBOutlet weak var parentStackView: UIStackView!
@IBOutlet var stackViewNumber1: UIStackView!
@IBOutlet var stackViewNumber2: UIStackView!
Trong bảng phân cảnh, đây là giao diện của parentStack của tôi:
Nó có 4 đứa trẻ và mỗi đứa trẻ đều có một loạt các khung nhìn ngăn xếp bên trong chúng. Khi bạn ẩn chế độ xem ngăn xếp, nếu nó cũng có các phần tử giao diện người dùng cũng là chế độ xem ngăn xếp, bạn sẽ thấy một loạt lỗi bố cục tự động. Thay vì ẩn, tôi đã chọn xóa chúng.
Trong ví dụ của tôi, parentStackViews
chứa một mảng gồm 4 phần tử: Top Stack View, StackViewNumber1, Stack View Number 2 và Stop Button. Các chỉ số của họ lần lượt arrangedSubviews
là 0, 1, 2 và 3. Khi tôi muốn ẩn một cái, tôi chỉ cần xóa nó khỏi parentStackView's
arrangedSubviews
mảng. Vì nó không yếu, nó sẽ tồn tại trong bộ nhớ và bạn chỉ cần đưa nó trở lại chỉ mục mong muốn của mình sau này. Tôi không khởi động lại nó, vì vậy nó chỉ hoạt động cho đến khi cần thiết, nhưng không làm tăng bộ nhớ.
Về cơ bản, bạn có thể ...
1) Kéo IBOutlets cho ngăn xếp cha mẹ của bạn và những phần tử con bạn muốn ẩn / hiện vào bảng phân cảnh.
2) Khi bạn muốn ẩn chúng, hãy xóa ngăn xếp bạn muốn ẩn khỏi parentStackView's
arrangedSubviews
mảng.
3) Gọi self.view.layoutIfNeeded()
với UIView.animateWithDuration
.
Lưu ý hai stackView cuối cùng không weak
. Bạn cần giữ chúng xung quanh khi bạn hiện chúng.
Giả sử tôi muốn ẩn stackViewNumber2:
parentStackView.removeArrangedSubview(stackViewNumber2)
stackViewNumber2.removeFromSuperview()
Sau đó tạo hoạt ảnh cho nó:
UIView.animate(withDuration: 0.25,
delay: 0,
usingSpringWithDamping: 2.0,
initialSpringVelocity: 10.0,
options: [.curveEaseOut],
animations: {
self.view.layoutIfNeeded()
},
completion: nil)
Nếu bạn muốn "bỏ ẩn" stackViewNumber2
sau này, bạn chỉ cần chèn nó vào parentStackView
arrangedSubViews
chỉ mục mong muốn và tạo hiệu ứng cho bản cập nhật.
parentStackView.removeArrangedSubview(stackViewNumber1)
stackViewNumber1.removeFromSuperview()
parentStackView.insertArrangedSubview(stackViewNumber2, at: 1)
// Then animate it
UIView.animate(withDuration: 0.25,
delay: 0,
usingSpringWithDamping: 2.0,
initialSpringVelocity: 10.0,
options: [.curveEaseOut],
animations: {
self.view.layoutIfNeeded()
},
completion: nil)
Tôi thấy rằng điều đó dễ dàng hơn rất nhiều so với việc ghi sổ sách theo các ràng buộc, tìm kiếm các ưu tiên, v.v.
Nếu bạn có thứ gì đó bạn muốn ẩn theo mặc định, bạn có thể chỉ cần đặt nó trên bảng phân cảnh và xóa nó viewDidLoad
và cập nhật mà không sử dụng hoạt ảnh view.layoutIfNeeded()
.