【问题标题】:Changing Constraints Programmatically以编程方式更改约束
【发布时间】:2016-02-09 05:02:41
【问题描述】:

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

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

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

问题是由于复选框组是从服务器检索的数据动态填充的,我不知道在 StoryBoard 设计时标签 2 和标签 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];

但无济于事。

【问题讨论】:

    标签: ios storyboard nslayoutconstraint


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢 .. 我已经尝试过这种方法但仍然没有解决问题,即 label4 不知何故被遮盖了。认为我需要提到所有这些标签和文本字段都在滚动视图中的事实。可能我还需要更新滚动视图的内容大小吗?
    • 是的,如果您想一次查看所有内容,应该这样做。或者您应该能够向下滚动以查看剩余内容。
    【解决方案2】:

    就我个人而言,我倾向于在“标签 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”之间编写神奇空格的业务,例如,如果您在未来某个日期更改字体(或者更好,支持使用设置应用程序中指定的用户提供的字体大小)。

    【讨论】:

    • 您好 Rob,感谢您提供出色的建议和图形解释!它工作得很好,现在我开始使用 VFL 而不是一次以编程方式添加一个约束。好东西 !! ..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多