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


102

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

现在,我需要以UIView's编程方式更新该高度常数。

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


采取高度限制的出口并以
编程方式

您可以使用此链接此链接作为参考。
Amna Farhan

这是一种更新单个或多个约束的方法。stackoverflow.com/a/54171693/8861442
Sarath Kumar Rajendran,

Answers:


217

从“界面”构建器中选择高度约束,然后选择其高度。因此,当您想要更改视图的高度时,可以使用以下代码。

yourHeightConstraintOutlet.constant = someValue
yourView.layoutIfNeeded()

方法updateConstraints()是的实例方法UIView。以编程方式设置约束时,这将很有帮助。它更新视图的约束。有关更多详细信息,请单击此处


58
今天,我了解到可以将约束变成出口,从那里我可以做我想做的任何事情。谢谢
克里斯·米克尔森

@ParthAdroja,兄弟,您能看看我的问题stackoverflow.com/questions/46034278/… 吗?
May Phyu

我没有xib文件,如何在UIView中以编程方式设置yourHeightConstraint?
新闻播音员'18


我听说更改常量约束后应该调用layoutIfNeeded。为什么?有时我在viewWillLayoutSubviews和viewDidLayoutSubviews内部调用layoutIfNeeded。可以吗
助记符

104

如果您的视图具有多个约束,则无需创建多个出口的简单得多的方法是:

在界面构建器中,为您要修改标识符的每个约束提供条件:

在此处输入图片说明

然后,您可以在代码中修改多个约束,如下所示:

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

您可以为多个约束赋予相同的标识符,从而使您可以将约束分组在一起并一次修改所有约束。


这很好用,但是我发现只使用常规的插座集合对约束进行分组比较容易。例如,根据我正在使用的观点,有47个约束,但我只想在运行时更改6个约束,因此它的循环要小得多。这也不需要使字符串在两个不同位置之间保持同步。
加里Z

1
谢谢乔治给我的提示。这对我正在使用的某些当前布局确实有帮助。
吉姆·希尔豪斯

1
美丽
威廉·杨

嗨,我以相同的方式使用它,但是在if情况下它永远不会消失,并且我给出了相同的标识符。
罗布

我想知道是否可以命名约束。好答案!
ShadeToD

35

改变HeightConstraintWidthConstraint没有创造IBOutlet

注意:在情节提要或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 

2
有一种方法first(where: ...)可以立即使用,而不是filter+first
Vyachaslav Gerchicov '19

13

将约束作为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()
    }
}

9

您可以根据需要使用平滑的动画更新约束,请参见下面的代码块:

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

4

如果上述方法不起作用,请确保在Dispatch.main.async {}块中对其进行更新。然后,您不需要调用layoutIfNeeded()方法。


4

首先将Height约束连接到我们的viewcontroller中,以创建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

}

1

要更新布局约束,您只需要更新constant属性并在之后调用layoutIfNeeded。

myConstraint.constant = newValue
myView.layoutIfNeeded()

1
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()
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.