我最近在隐藏时遇到了自动布局错误UIStackView
。UIViews
我没有创建一堆书本和包装纸堆,而是选择为自己的parentStackView
商店和想要隐藏/取消隐藏的孩子创建商店。
@IBOutlet weak var parentStackView: UIStackView!
@IBOutlet var stackViewNumber1: UIStackView!
@IBOutlet var stackViewNumber2: UIStackView!
在情节提要中,这是我的parentStack的样子:
它有4个孩子,每个孩子里面都有很多堆栈视图。隐藏堆栈视图时,如果UI元素也是堆栈视图,则会看到一系列自动布局错误。我选择隐藏而不是隐藏。
在我的示例中,parentStackViews
包含4个元素的数组:顶部堆栈视图,StackViewNumber1,堆栈视图编号2和停止按钮。它们的索引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)
// Then animate it
UIView.animate(withDuration: 0.25,
delay: 0,
usingSpringWithDamping: 2.0,
initialSpringVelocity: 10.0,
options: [.curveEaseOut],
animations: {
self.view.layoutIfNeeded()
},
completion: nil)
我发现这要比限制记录,摆弄优先顺序等要容易得多。
如果您有默认情况下想要隐藏的内容,则可以将其放在情节提要上,然后将其删除viewDidLoad
并进行更新,而无需使用动画view.layoutIfNeeded()
。