界面构建器中没有固定高度,约束困境

时间:2014-07-01 15:15:14

标签: ios objective-c xcode interface-builder nslayoutconstraint

我试图创建的屏幕非常简单。我有两个UIView堆叠在一起。顶部的UIView,topView,高度为40px,下面的UIView,botView,占据了屏幕的其余部分。但是,有时topView不应该出现,我希望botView占据整个屏幕。

我尝试过的是在两个视图上设置宽度,前导/尾随空格。然后topView获得与顶部布局指南的距离,botView获得与底部布局指南的距离,然后是topView和botView之间的垂直间距的附加约束。但是这导致xcode对我大喊大叫,我还没有在其中一个视图上设置高度或y约束。当然,我不能设置高度约束,因为我不希望它们中的任何一个都是固定的高度。

我确信这里必须有一个优雅的约束解决方案,我似乎无法弄明白。想法?

3 个答案:

答案 0 :(得分:1)

如果topView的高度始终为40px,则为topView的高度添加约束。

对于botView,您可以保留当前约束,表明其顶部必须与topView的底部相关联。但是为底部视图添加另一个约束,优先级低于required,表示它应该距离超级视图顶部0px。这样,当您从包含视图中删除topView时,botViewtopView相关的约束将被删除,因此将满足较低优先级约束。

如果您想推回topView,请使用botView优先级重新创建topViewrequired远距离约束。

答案 1 :(得分:1)

有几种方法可以做到这一点。一个选项

在IB中列出您的观点。然后从顶部,底部,左侧和右侧引脚顶视图0 px。指定高度约束为40像素。要轻松执行此操作,请单击您的视图,然后在右下角单击看起来像|的按钮+ |。单击虚线红线以指定约束。见图:

enter image description here

对其他视图执行相同操作。不要为此视图指定高度,因为它的高度取决于其高度的40像素视图。接下来找到40 px视图的高度约束。您可以使用助理编辑器控制将插座拖动到视图控制器,就像使用UIButton或任何其他IB元素一样。当你想要隐藏你的40像素视图时,将变量常量属性设置为0.当你想再次显示它时,将它设置回40。

self.topViewHeightConstraint.constant = 0;

enter image description here

您可以选择的另一个选项是将顶视图0 px固定到顶部,左侧和右侧。不要提供底部约束,但将高度指定为40 px。对于底部视图添加添加0 px的左,右和底部约束。对于顶部约束,从顶部超级视图添加40 px的约束。再次为最近的顶部约束添加一个出口,当您希望视图更大时,将该约束设置为0.

答案 2 :(得分:0)

另一种选择:在IB中,为BOTVIEW添加到顶部布局指南约束的距离(它将是40 ...)然后单击并拖动此常量到VC以创建NSLayoutConstraint属性。see also here

现在,在隐藏topView的条件下,设置self.myConstraint.constant = 0;这将强制botView调整大小以满足从顶部为0的条件。

您可能必须清除当前的约束以消除错误,但这应该提供所需的行为。

就像Tom Ahh建议的“topView”一样,继续给它一个40的高度限制并将它固定在顶部,就像你已经在做的那样。