如何在运行时增加堆栈视图的特定子视图的高度?

时间:2019-07-18 21:00:45

标签: ios swift view stack

我在垂直UIStackView中添加了一些rangedSubViews。 并且我想通过点击某些按钮来增加内部一个排列的子视图的高度。

尝试在子视图和主视图上添加layoutIfNeeded。 它不起作用。

我正在增加子视图的高度,如下所示:

addConstraints([self.heightAnchor.constraint(equalToConstant: 100)])
layoutIfNeeded()
sizeToFit()
layoutSubviews()

1 个答案:

答案 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")

让我知道它是否有效。