我在垂直UIStackView中添加了一些rangedSubViews。 并且我想通过点击某些按钮来增加内部一个排列的子视图的高度。
尝试在子视图和主视图上添加layoutIfNeeded。 它不起作用。
我正在增加子视图的高度,如下所示:
addConstraints([self.heightAnchor.constraint(equalToConstant: 100)])
layoutIfNeeded()
sizeToFit()
layoutSubviews()
答案 0 :(得分:1)
我认为问题在于您正在尝试向视图添加新约束,但是您并未停用heightAnchor的现有约束。
您可以在添加新约束之前将现有高度约束的isActive属性设置为false,或者简单地将现有高度约束的常数设置为新值。
您可以给约束一个标识符,以后可以使用该标识符来获取该特定约束并更改其属性。
如果我是你,我将在代码中添加以下两个扩展名:
extension UIView {
func getConstraint(withIndentifier indentifier: String) -> NSLayoutConstraint? {
return self.constraints.filter { $0.identifier == indentifier }.first
}
}
extension NSLayoutConstraint {
func activate(withIdentifier identifier: String) {
self.identifier = identifier
self.isActive = true
}
}
示例用法:
// When you create the constraint:
subview.heightAnchor.constraint(equalToConstant: 100).activate(withIdentifier: "THE")
// When you want to change the constant:
if let filteredConstraint = subview.getConstraint(withIndentifier: "THE") {
filteredConstraint.constant = 500
}
如果要动画,只需在更改约束后立即添加以下代码:
UIView.animate(withDuration: 0.5) {
self.view.layoutIfNeeded()
}
我相信这可以解决问题,否则请通知我。
当您这样设置约束时:
self.myStackView.topAnchor.constraint(equalTo: someView.bottomAnchor , constant: 20).activate(withIdentifier: "topAnchor")
约束实际上既不属于myStackView
也不属于someView
,而是它们的超级视图。尽管matt's answer是正确的,但我个人更喜欢在评论中使用Kh_khan's answer:
self.myStackView.superView?.getConstraint(withIndentifier: "topAnchor")
让我知道它是否有效。