如何在运行时更改标签约束?

时间:2013-10-31 13:01:27

标签: ios objective-c autolayout

我有一个表格视图,里面有一个单元格。该单元格包含三个标签:标题标签和两个彼此相同的标签。有时,如果它们不包含数据并将“Header label”的“Top space to container”更改为“Center Y to container”,我需要隐藏下面的两个标签。当然,当两个标签包含数据时,还原约束。这是一个简单的演示项目的屏幕截图,仅用于展示这个想法:

enter image description here

更新 Max MacLeod的回答指向了正确的方向。诀窍是在隐藏第一个和第二个标签时向下推标头标签。因此,我们需要为第一个和第二个标签设置底部空间到容器视图,而不是为标题标签的容器视图创建顶部空间。隐藏/取消隐藏应该通过高度出口(第一个和第二个标签的高度约束)并将它们的常量值设置为零(并在取消隐藏时设置返回值)来完成。我还上传了source code example to Github

4 个答案:

答案 0 :(得分:34)

选择标题标签和其中一个较低标签,然后添加一个新的垂直空间约束,以反映它们之间的间隙。接下来,删除标题标签顶部空间到容器约束。也许你已经有了这个(从屏幕上看不到)。如果你这样做,那很好。

现在,为每个较低的标签创建两个高度约束。 IBOutlet给你班级的人。

然后,通过将每个高度限制constant设置为0.f,随时隐藏这两个下标签。

这将使它们不可见并降低上面的标题标签,使其现在在容器中垂直居中Y.

将再次执行这些步骤(对于评论来说太长了!)。顺序对IB很重要,首先必须添加新约束才能删除旧约束。暂时你会有一个多余的约束。这是因为IB不会允许含糊不清。因此,首先添加新的垂直空间约束。这将定义上标签的Y位置。然后,从上面的标签中删除多余的垂直空间到容器约束。现在,标签将使用相对于下部标签的垂直空间定位Y.接下来,为每个较低标签添加高度约束,并使用IBOutlet链接到该类。另外一件事,实际上你需要将低标签约束到具有底部空间约束的容器。当它们的高度减小到零时,它们将消失,并且上部标签将向下移动以占据Y中心位置。

要恢复,只需将constant设置回原始值。

这是一种比添加/删除约束更好的方法,这是一项重量级操作。请注意,您可能希望将两个较低的标签添加到“容器”视图中,以便它们可以显示/隐藏为一个。此外,它会整理代码,因为您确实希望垂直空间位于上标签和两个下标签之间,而不仅仅是一个。

另见我的回答AutoLayout with hidden UIViews?

答案 1 :(得分:7)

将要隐藏的标签放入视图中,一旦所有内容都具有正确的布局约束,向容器视图添加高度约束,并将约束连接到IBOutlet属性。

确保您的媒体资源为strong

在代码中你只需要将常量设置为0并激活它,隐藏内容,或者停用它来显示内容。 这比弄乱固定值还原它更好。 不要忘记之后致电layoutIfNeeded

@property (strong, nonatomic) IBOutlet UIView *myContainer;
@property (strong, nonatomic) IBOutlet NSLayoutConstraint *myContainerHeight; //should be strong!!
-(void) showContainer
{
    self.myContainerHeight.active = NO;
    self.myContainer.hidden = NO;
    [self.view layoutIfNeeded];
}
-(void) hideContainer
{
    self.myContainerHeight.active = YES;
    self.myContainerHeight.constant = 0.0f;
    self.myContainer.hidden = YES;
    [self.view layoutIfNeeded];
}

完成设置后,您可以通过将约束设置为0然后返回原始值来在IntefaceBuilder中对其进行测试。不要忘记检查其他约束优先级,所以当隐藏时根本没有冲突。测试它的其他方法是将其设置为0并将优先级设置为0,但是,您不应该忘记将其恢复到最高优先级。

答案 2 :(得分:0)

我自己也做了很多这样的事情。因此,为两个标签添加宽度约束。您可以在应用约束时更改常量值 - 只需保留对它的引用。在我的情况下,我有一个数组,我把我想要改变的约束。

如果要隐藏标签,请将c值更改为0 - 您也可以在动画块中执行此操作。显示更改值。

你也可以让顶部空间的宽度等于底部空间,所以当视图隐藏或显示你保持"组"以物品为中心。

请注意,您也可以添加或删除约束,但iOS的处理成本更高。

答案 3 :(得分:-3)

在Apple文档中,很少有人可以轻松理解和一些动手实例,但这是规则中例外的确切情况。

我个人觉得这个文件很容易理解,也很清楚。成为自动布局大师的最佳方式:)

https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/AutoLayoutinCode/AutoLayoutinCode.html

基本上,运行时意味着“以编程方式”。

所以问题的答案就在于:

https://stackoverflow.com/a/12623006/517119