55

I have googled but not find out answer. So I need to ask. I have one home screen. When User is logged in it will display one view as like bellow enter image description here Now When User logged out and visiting home page he will see above layout but without center boxed layout. If I set That layout hidden it is now displaying as follows. enter image description here

I want to move third layout to little bit above to remove white space..

I added constraints using storyboard. Now need to remove constraints from programming and add one constraints that will set layout to bellow first layout..

4

10 回答 10

50

正如@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

然后稍后您可以使用addConstraintoraddConstraints方法以相同的方式添加新约束。

有关更多详细信息,请参阅此处的 Apple 文档

希望这可以帮助。

于 2014-12-31T13:08:28.587 回答
34

removeConstraints将来会被弃用。

您可以使用以下内容作为替代

viewHeight.active = NO;
于 2016-06-22T09:42:29.033 回答
18

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

登录约束注册约束

然后在您的代码中在两者之间切换:

- (void)setupRegistrationView
{        
    _loadingIndicatorTopConstraintLogin.active = NO;
    _loadingIndicatorTopConstraintRegister.active = YES;
}

- (void)setupLoginView
{        
    _loadingIndicatorTopConstraintLogin.active = YES;
    _loadingIndicatorTopConstraintRegister.active = NO;
}

顺便说一句,使用新的 UIStackView 可能会为您的案例提供更优雅的解决方案,但这是另一个主题。

于 2016-11-20T08:43:52.670 回答
16

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

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

选择

它甚至是单线。如果你在你的视野之内,你可以写:

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

第二种选择

不要使用故事板——它们是邪恶的,并且在未来(使用 SwiftUI)它们会过时。唯一的真相在于代码

于 2018-01-30T18:21:31.880 回答
15

斯威夫特 4

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

快乐编码:)

于 2018-09-21T15:39:50.750 回答
12

取用户注销时要隐藏的视图高度约束的IBOutlet。

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

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

viewHeight.constant = isLoggedIn ? 30.0 : 0.0;

希望这可以帮助..

于 2014-12-31T12:33:27.360 回答
2

You can do it in an other way too. Add a vertical spacing constraint between third layout and first layout which will be 30. Then add a reference to the constraint in the controller.

self.verticalSpacingFromThirdToFirstConstraint.constant = isLoggedIn ? 30.0 : 0.0

PS: You should not add a height constraint for the middle view in this case. Just add the four trailing, leading, top(to first layout) and bottom (to third layout).

于 2016-03-05T03:34:17.730 回答
1

如果您无法从界面构建器访问约束,您可以使用以下命令更新约束:

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

其中“视图”是您尝试更新其约束的任何视图。这种方法有一些缺点,因为您可能有多个与相关视图相关的顶级约束。

于 2020-02-12T09:23:20.013 回答
1

我在一个单元格中有另一个 tableView 的 tableView 遇到了类似的问题,当单元格被重用时,高度的约束正在堆积。为了解决这个问题,我做了:

constraints.filter({$0.firstAnchor == heightAnchor }).forEach{ $0.isActive = false }
于 2019-08-12T08:55:56.753 回答
1

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

_heightconstrainOutlet.constant=0;

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

于 2016-06-24T09:43:30.327 回答