如何以编程方式更新 UIView 的常量高度约束?

我有一个 UIView,我使用 Xcode Interface Builder 来设置约束。

现在我需要以编程方式更新 UIView实例的高度常数。

有一个类似于 myUIView.updateConstraints()的函数,但我不知道如何使用它。

203599 次浏览

要更新布局约束,只需更新常量属性,然后调用 layoutIfNeeded。

myConstraint.constant = newValue
myView.layoutIfNeeded()

将约束作为 IBOutlet 拖放到 VC 中。然后您可以更改它的关联值(和其他属性; 查看文档) :

@IBOutlet myConstraint : NSLayoutConstraint!
@IBOutlet myView : UIView!


func updateConstraints() {
// You should handle UI updates on the main queue, whenever possible
DispatchQueue.main.async {
self.myConstraint.constant = 10
self.myView.layoutIfNeeded()
}
}

从 Interface Builder 中选择高度限制,然后选择一个出口。因此,当您想要更改视图的高度时,可以使用下面的代码。

yourHeightConstraintOutlet.constant = someValue
yourView.layoutIfNeeded()

方法 updateConstraints()UIView的实例方法。在以编程方式设置约束时,它非常有用。它更新视图的约束。有关详细信息,请单击 给你

如果您有一个具有多个约束的视图,不需要创建多个出口的更简单的方法是:

在 Interface Builder 中,给出每个您希望修改标识符的约束:

enter image description here

然后在代码中你可以像这样修改多个约束:

for constraint in self.view.constraints {
if constraint.identifier == "myConstraint" {
constraint.constant = 50
}
}
myView.layoutIfNeeded()

您可以为多个约束提供相同的标识符,从而允许您将约束分组在一起并同时修改所有约束。

如果上面的方法不起作用,那么请确保在 Dispatch.main.sync {}块中更新它。那么不需要调用 layoutIfNeeded ()方法。

首先将 Height 约束连接到视图控制器,以创建 IBOutlet,如下面的代码所示

@IBOutlet weak var select_dateHeight: NSLayoutConstraint!

然后把下面的代码放在视图中做了加载或在任何操作中

self.select_dateHeight.constant = 0 // we can change the height value

如果它是在一个按钮点击

@IBAction func Feedback_button(_ sender: Any) {
self.select_dateHeight.constant = 0


}

在不创建 IBOutlet的情况下更改 HeightConstraintWidthConstraint

注意: 在 Storyboard 或 XIB 文件中分配高度或宽度约束。

您可以使用这个扩展来获取高度和宽度约束:

extension UIView {


var heightConstraint: NSLayoutConstraint? {
get {
return constraints.first(where: {
$0.firstAttribute == .height && $0.relation == .equal
})
}
set { setNeedsLayout() }
}


var widthConstraint: NSLayoutConstraint? {
get {
return constraints.first(where: {
$0.firstAttribute == .width && $0.relation == .equal
})
}
set { setNeedsLayout() }
}


}

你可使用:

yourView.heightConstraint?.constant = newValue
Create an IBOutlet of NSLayoutConstraint of yourView and update the constant value accordingly the condition specifies.


//Connect them from Interface
@IBOutlet viewHeight: NSLayoutConstraint!
@IBOutlet view: UIView!


private func updateViewHeight(height:Int){
guard let aView = view, aViewHeight = viewHeight else{
return
}
aViewHeight.constant = height
aView.layoutIfNeeded()
}

如果你愿意,你可以使用平滑的动画来更新你的约束条件,看看下面的代码块:

heightOrWidthConstraint.constant = 100
UIView.animate(withDuration: animateTime, animations:{
self.view.layoutIfNeeded()
})

如果你用动画更新你的约束,然后在 UIView.animate 中添加布局子视图..。
例如,

@IBOutlet viewHeight: NSLayoutConstraint!
@IBOutlet view: UIView!


private func updateViewHeight(height:Int){
guard let aView = view, aViewHeight = viewHeight else{
return
}
aViewHeight.constant = height
UIView.animateWithDuration(0.5, delay: 0) { [self] in
aView.layoutIfNeeded()
}
}