首页 文章

使用AutoLayout约束隐藏UIView

提问于
浏览
28

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

enter image description here

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

  • 橙色框根据内容定义其垂直高度,加上边距的一些顶部/底部偏移 . 因此,设置标签' text to nil will only ' shrink ' the view down to it' s内部边距,它的高度不会为0 .

  • 同样,三个方框之间的垂直间距意味着即使橙色框的高度为0,红色和黄色之间的间隙也将是所需的两倍 .

可能的解决方案

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

有更好的方法吗?

4 回答

  • 68

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

    enter image description here

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

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

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

  • 0

    在iOS 9中,您可以使用UIStackView . 旧版本还有polyfills:TZStackViewOAStackView

  • 13

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

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

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

  • 1

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

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

相关问题