19

我有一个表格视图和一个单元格。该单元格包含三个标签:标题标签和一个下方的两个标签。有时,如果它们不包含数据,我需要隐藏下面的这两个标签,并将“标题标签”的“顶部空间到容器”更改为“中心 Y 到容器”。当两个标签包含数据时,当然会恢复约束。这是一个简单的演示项目的截图,只是为了展示这个想法:

在此处输入图像描述

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

4

4 回答 4

34

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

现在,为每个较低的标签创建两个高度约束。IBOutlet那些给你的课。

constant然后,通过将每个高度约束设置为,在需要时隐藏这两个较低的标签0.f

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

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

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

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

另请参阅我的答案AutoLayout with hidden UIViews?

于 2013-10-31T13:17:21.610 回答
8

将要隐藏的标签放入视图中,一旦所有内容都具有正确的布局约束,向容器视图添加高度约束,并将约束连接到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];
}

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

于 2016-03-05T11:05:11.667 回答
0

我自己也在做类似的事情。因此,为两个标签添加宽度约束。您可以在应用约束时更改常量值 - 只需保留对它的引用。就我而言,我有一个数组,我将计划更改的约束放入其中。

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

您还可以使顶部空间的宽度等于底部空间的宽度,因此当视图隐藏或显示时,您可以保持“组”项目居中。

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

于 2013-10-31T13:30:43.847 回答
-3

当它取决于 Apple 文档时,您很少能找到易于理解和一些动手操作的示例,但这是规则中例外的确切情况。

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

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

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

所以你的问题的答案就在这里:

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

于 2013-10-31T13:16:59.973 回答