使用AutoLayout约束隐藏UIView

时间:2015-02-03 14:41:47

标签: ios uiview autolayout nslayoutconstraint

我有时会想要从布局中删除子视图。它不仅应该被隐藏,而且不应该被认为是视图“流动”的一部分,可以这么说。一个例子:

enter image description here

我正在寻找一种以编程方式隐藏橙色视图的策略。框的布局及其内容是通过自动布局进行的。有两点需要注意:

  • 橙色框根据内容定义其垂直高度,以及边距的一些顶部/底部偏移。因此,将标签的文本设置为nil只会将视图“缩小”到其内部边距,它的高度不会为0.
  • 同样,三个方框之间的垂直间距意味着即使橙色框的高度为0,红色和黄色之间的间隙也将是所需的两倍。

可能的解决方案

我最好的建议是在橙色框中添加一个约束,将其高度设置为0.为此,我需要对橙色框内的所有垂直约束使用非必需的优先级。同时,容器应更新用于分隔框的约束的常量。我不太喜欢这种方法,因为橙色盒子类正在定义它的内部约束,并考虑到它的superview的行为。如果橙色框视图反而暴露了一个“崩溃”方法,它本身就会添加0高度约束,也许我可以忍受它。

有更好的方法吗?

4 个答案:

答案 0 :(得分:68)

您可以通过在较低优先级的黄色和红色视图之间添加额外约束,并调整代码中的优先级来实现此目的。

enter image description here

短虚线约束(orangeToRedCon是插座)的优先级为999(您无法将所需的优先级更改为非必需的,因此它不是1000的原因) 。长虚线约束(yellowToRedCon)的优先级为500,常量为20.在代码中,您可以隐藏橙色视图,并交换这些优先级,这将使黄色视图向上移动到您的任何值。 ; ve设置为yellowToRedCon的常量值。

-(void)changePriorities {
    self.yellowToRedCon.priority = 999;
    self.orangeToRedCon.priority = 500;
    [UIView animateWithDuration:.5 animations:^{
        self.orangeView.alpha = 0;
        [self.view layoutIfNeeded];
    }];
}

此方法不需要对橙色视图的高度进行任何更改。

答案 1 :(得分:13)

在iOS 9中,您可以使用UIStackView。 还有旧版本的填充:TZStackViewOAStackView

答案 2 :(得分:1)

您可以做的是将橙色视图的高度限制作为插座(以便能够访问它)。 然后像这样动画崩溃:

[UIView animateWithDuration:0.3 animations:^{
    orangeHeightConstraint.constant = 0;
    [self.view layoutIfNeeded]
}];

橙色视图必须具有红色视图的顶部约束和黄色视图的底部约束。 另外,请务必检查IB中的剪辑子视图或以编程方式[orangeView clipsToBounds]

答案 3 :(得分:0)

我会通过将子视图的所有“必要”空间作为子视图本身的一部分来解决这个问题。这条路,  1.红色视图高度=可见红色部分+底部空间  2.橙色视图高度=可见橙色部分+底部空间  3.黄色视图高度=可见黄色+底部空间

当您通过Autolayout将橙色视图高度设置为0时,它会自动将底部空间缩小为0。