使用AutoLayout约束来隐藏UIView

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

在这里输入图像说明

我正在寻找一个策略,以编程方式隐藏橙色视图。 框的布局和内容是通过自动布局来实现的。 有两件事要注意:

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

可能的解决scheme

我最好的build议是为橙色框添加一个约束,将其高度设置为0.为此,我需要为橙色框内的所有垂直约束使用不需要的优先级。 同时,容器应该更新用于分隔框的约束的常量。 我不太喜欢这种方法,因为橙色盒子类正在定义它的内在约束,因为它的超级观点的行为。 也许我可以忍受它,如果橙色框视图,而不是暴露一个'崩溃'的方法,自己添加0高度约束。

有更好的方法吗?

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

在这里输入图像说明

短虚线约束(orangeToRedCon是sockets)的优先级为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]; }]; } 

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

在iOS 9中,您可以使用UIStackView 。 还有老版本的polyfills : TZStackView和OAStackView

你所能做的就是将橙色视图的高度限制作为出口(以便能够访问它)。 然后像这样使崩溃animation:

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

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

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

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