以编程方式更改约束

时间:2016-02-09 05:02:42

标签: ios storyboard nslayoutconstraint

我有一个用户表单,其中有一堆Label及其相应的文本字段或下拉列表或复选框组在Storyboard上垂直排列。像这样:

Label 1
   Text Field 1
Label 2
   Check Box Group
Label 3
   Drop Down Field
Label 4
   Text Field 4

在正常情况下,标签之间的约束设置为60垂直。

问题是,由于Check Box Group是从服务器检索到的数据动态填充的,我不知道在StoryBoard设计时Label 2和Label 3之间会有多少个复选框。因此需要以编程方式更改Label 2和Label 3之间的约束。

目前,我所做的是在它们之间设置约束60,但检查"在构建时删除"并以编程方式设置约束,具体取决于那里之间有多少个复选框。像这样:

[_superView addConstraint:[NSLayoutConstraint constraintWithItem:_Label3 attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:_Label2 attribute:NSLayoutAttributeBottom multiplier:1 constant:100]];

但由于某些原因,这不符合预期。尽管Label3正确放置在最后一个复选框之后,但我只能看到Label4的一半具有高度约束。我试过了:

[superView updateConstraints];
[superView layoutIfNeeded];

但无济于事。

2 个答案:

答案 0 :(得分:1)

您可以在情节提要中添加垂直间距约束,并在视图控制器中添加nslayoutconstraint iboutlet var,并将其连接到情节提要中的约束。

现在,constraint.constant值可以通过编程方式更改为您想要的任何值,而不是添加它。

答案 1 :(得分:1)

就个人而言,我倾向于在标签1","标签2"等之间没有任何限制。我会创建一个包含容器视图的视图将包含标签之间的各个字段:

enter image description here

我定义了这样的垂直约束(我假设你在故事板中这样做,就像我上面所做的那样,但是我显示了示例VFL,因为那是' sa描述整套垂直约束的简洁而精确的方法:

V:|-[label1]-[group1(0@250)]-[label2]-[group2(0@250)]-[label3]-[group3(0@250)]-[label4]-[group4(0@250)]-|"

注意,在我的快照中,我给了那些容器" group"查看非零高度和灰色背景,以便您可以看到它们,但希望这说明了这个想法。有占位符视图,它将包含各种标签下面的控件,并给出零高度但低(250)优先级(或者,就像你一样,让它在运行时省略它们)。

然后,您可以通过编程方式添加您想要的任何控件作为其各自组视图的子视图,并相应地设置其约束,例如。

V:|-[MoView]-[LarryView]-[CurlyView]-|

并且因为那些比组框的零高度限制更高的前提,所以结果视图将相应地调整大小,例如:

enter image description here

你可以使用UIStackView(如果定位iOS 9及更高版本)完成非常相似的事情,但如果使用简单约束,我就是这样做的。

这样,你就不再需要在#1;标签1和#34;之间编写神奇的空间。和#34;标签2",如果您在将来某个日期更改字体(或者更好,支持使用在“设置”应用中指定的用户提供的字体大小),它将变为无效。