如何以编程方式删除从故事板添加的约束?

时间:2014-12-31 12:00:20

标签: ios xcode-storyboard ios-autolayout

我用谷歌搜索但没找到答案。所以我需要问一下。 我有一个主屏幕。当用户登录时,它将显示一个视图,如下图所示 enter image description here 现在,当用户退出并访问主页时,他将看到上面的布局,但没有中心框的布局。如果我将该布局设置为隐藏,则它现在显示如下。 enter image description here

我想将第三个布局移到上面一点点去除空白区域。

我使用故事板添加了约束。现在需要从编程中删除约束并添加一个约束,将布局设置为低于第一个布局..

10 个答案:

答案 0 :(得分:30)

正如@Henit所提到的,您也可以为约束设置IBOutlet。

例如,

@property(weak, nonatomic) IBOutlet NSLayoutConstraint *viewHeight;

现在,您可以删除此约束:

[myView removeConstraint: viewHeight];

否则,如果您想要删除与您的视图相关的所有/多个约束,

[myView removeConstraints: constraintsArrayHere]; // custom array of constraints references
[myView removeConstraints: [myView constraints]]; //all constraints

之后您可以使用addConstraintaddConstraints方法以相同方式添加新约束。

有关详情,请浏览Apple文档here.

希望这有帮助。

答案 1 :(得分:23)

removeConstraints 将来会被弃用。

您可以使用以下替代

viewHeight.active = NO;

答案 2 :(得分:11)

在用户退出时,获取要隐藏的视图高度约束的IBOutlet。

@property(weak, nonatomic) IBOutlet NSLayoutConstraint *viewHeight;

NSLayoutConstraint 类中有一个属性常量。 您需要在用户登录/注销时进行设置。

viewHeight.constant = isLoggedIn ? 30.0 : 0.0;

希望这会有所帮助..

答案 3 :(得分:11)

要扩展@ Megamind的答案:您可以使用active的{​​{1}}属性。只需为这两种情况设置两种不同的约束,并根据登录状态仅激活其中一种情况。 在InterfaceBuilder中,NSLayoutConstraint属性奇怪地称为active

Login constraint Register constraint

然后在你的代码之间切换:

Installed
BTW,使用新的UIStackView可以为您的案例提供更优雅的解决方案,但这是另一个主题。

答案 4 :(得分:7)

从iOS 10+开始,它非常简单,您可以简单地遍历视图的所有约束并停用它。如果你,例如想要查找和删除视图的高度约束,您可以执行以下操作:

for constraint in constraints {
    guard constraint.firstAnchor == heightAnchor else { continue }
    constraint.isActive = false
    break
}

替代
它甚至是一个单行。如果你在视图中,你可以写:

constraints.first { $0.firstAnchor == heightAnchor }?.isActive = false

答案 5 :(得分:5)

Swift 4

@IBOutlet weak var viewHeight: NSLayoutConstraint!
viewHeight.isActive = false    

快乐编码:)

答案 6 :(得分:2)

你也可以用其他方式来做。在第三个布局和第一个布局之间添加一个垂直间距约束,该约束为30.然后在控制器中添加对约束的引用。

self.verticalSpacingFromThirdToFirstConstraint.constant = isLoggedIn ? 30.0 : 0.0

PS:在这种情况下,您不应该为中间视图添加高度约束。只需添加四个尾随,前导,顶部(到第一个布局)和底部(到第三个布局)。

答案 7 :(得分:1)

您可以为要隐藏的视图添加高度约束。 并在viewcontroller.h文件中为该高度约束添加NSlayoutHeightcontraint出口。然后,您可以在viewcontroller.m文件中的任何位置调用heightConstrain出口。将此代码添加到要隐藏此UIview

的位置
_heightconstrainOutlet.constant=0;

这将使高度变为零。因此,您的底部视图也将覆盖该区域。如果您的底部视图有高度约束和容器约束的底部空间?只需删除其中任何一个作为您的要求。谢谢

答案 8 :(得分:1)

如果您不能从界面构建器访问约束,则可以使用以下方法更新约束:

    let topConstraint = view.constraints.first(where: { $0.firstAttribute == .top })
    topConstraint?.constant = 20

“视图”在哪里是您要更新其约束的任何视图。 这种方法有一些缺点,因为您可能有多个与相关视图相关的顶部约束。

答案 9 :(得分:0)

我在一个tableView中有一个类似的问题,在一个单元格中有另一个tableView,随着单元的重用,对高度的限制越来越多。 为了解决这个问题,我做到了:

constraints.filter({$0.firstAnchor == heightAnchor }).forEach{ $0.isActive = false }