我用谷歌搜索但没找到答案。所以我需要问一下。 我有一个主屏幕。当用户登录时,它将显示一个视图,如下图所示 现在,当用户退出并访问主页时,他将看到上面的布局,但没有中心框的布局。如果我将该布局设置为隐藏,则它现在显示如下。
我想将第三个布局移到上面一点点去除空白区域。
我使用故事板添加了约束。现在需要从编程中删除约束并添加一个约束,将布局设置为低于第一个布局..
答案 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
之后您可以使用addConstraint
或addConstraints
方法以相同方式添加新约束。
有关详情,请浏览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
:
然后在你的代码之间切换:
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 }