我有时会想要从布局中删除子视图。它不仅应该被隐藏,而且不应该被认为是视图“流动”的一部分,可以这么说。一个例子:
我正在寻找一种以编程方式隐藏橙色视图的策略。框的布局及其内容是通过自动布局进行的。有两点需要注意:
我最好的建议是在橙色框中添加一个约束,将其高度设置为0.为此,我需要对橙色框内的所有垂直约束使用非必需的优先级。同时,容器应更新用于分隔框的约束的常量。我不太喜欢这种方法,因为橙色盒子类正在定义它的内部约束,并考虑到它的superview的行为。如果橙色框视图反而暴露了一个“崩溃”方法,它本身就会添加0高度约束,也许我可以忍受它。
有更好的方法吗?
答案 0 :(得分:68)
您可以通过在较低优先级的黄色和红色视图之间添加额外约束,并调整代码中的优先级来实现此目的。
短虚线约束(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
。
还有旧版本的填充:TZStackView和OAStackView
答案 2 :(得分:1)
您可以做的是将橙色视图的高度限制作为插座(以便能够访问它)。 然后像这样动画崩溃:
[UIView animateWithDuration:0.3 animations:^{
orangeHeightConstraint.constant = 0;
[self.view layoutIfNeeded]
}];
橙色视图必须具有红色视图的顶部约束和黄色视图的底部约束。
另外,请务必检查IB中的剪辑子视图或以编程方式[orangeView clipsToBounds]
答案 3 :(得分:0)
我会通过将子视图的所有“必要”空间作为子视图本身的一部分来解决这个问题。这条路, 1.红色视图高度=可见红色部分+底部空间 2.橙色视图高度=可见橙色部分+底部空间 3.黄色视图高度=可见黄色+底部空间
当您通过Autolayout将橙色视图高度设置为0时,它会自动将底部空间缩小为0。