繁体   English   中英

以编程方式更改约束

[英]Changing Constraints Programmatically

我有一个用户窗体,其中一堆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之间会有多少个复选框。 因此,需要以编程方式更改标签2和标签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];

但无济于事。

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

现在,可以通过编程将constraint.constant值更改为您想要的任何值,而无需添加它。

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

在此处输入图片说明

我将这样定义垂直约束(我假设您会像上面一样在情节提要中执行此操作,但是我正在显示VFL示例,因为这是描述整套垂直约束的简洁而精确的方式):

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

注意,在快照中,我为那些容器“组”视图提供了一个非零高度和灰色背景,因此您可以看到它们,但是希望这可以说明这个想法。 具有占位符视图,该占位符视图将在各个标签下方包含控件,并赋予零高度但低(250)优先级(或者像您一样,在运行时忽略它们)。

然后,您可以以编程方式将所需的任何控件添加为它们各自的组视图的子视图,从而相应地设置其约束,例如

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

并且由于那些优先级高于组框的零高度限制,因此将相应地调整结果视图的大小,例如:

在此处输入图片说明

您可以使用UIStackView (如果定位到iOS 9及更高版本)来完成非常相似的操作,但是如果使用简单的约束,这就是我要解决的方法。

这样一来,您就不必再为“标签1”和“标签2”之间的魔术空间进行编码了,例如,如果您在将来的某个日期更改字体(或者更好地支持用户使用),该空间将无效。 -在“设置”应用中指定的字体大小)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM