使用约束来保持两个表视图相同的高度和相同的距离

上下文/我想要做什么

  • 我正在为iOS 7构build这个
  • 我正在使用StoryBoard
  • 我有两个UITableViews ,我想保持相同的高度和距离,以保持3.5和4英寸设备之间的视觉一致性
  • 所以从4英寸的屏幕转换到3.5英寸的屏幕,我想:
  • 桌子视图变短,但保持高度相等
  • 顶层表视图保持相同的y pos
  • 对于底部表格视图来移动它的位置,以保持顶部桌子视图的底部和底部桌子视图的顶部之间的相同距离。 和他们之间的差距一样

在这里输入图像说明

我所试过的

  • 在故事板中使用Pin图标我已经select了两个TableView,并将它们的高度设置为相等,并将此代码包含在视图控制器中:

[self.topTableView addConstraint:[NSLayoutConstraint constraintWithItem:self.bottomTableView attribute:NSLayoutAttributeBottom relatedBy:0 toItem:self.bottomTableView attribute:NSLayoutAttributeTop multiplier:1 constant:30]];

  • 如何保持相同的高度,同时保持相同的距离

更新

在这里输入图像说明

查看苹果公司build议的方法 (在“在视图之间创build相等间距”部分)。

编辑:苹果现在赞成堆栈视图用于此目的。 请参阅此WWDC 2013video的OS X和此iOS的WWDC 2015

他们不提出一个限制的解决scheme。 相反,他们build议在可见视图之间放置隐藏的“间隔视图”。

这背后的推理根植于约束系统的工作方式。 约束关系总是严格的在两个对象之间。 在间隔约束中,该关系必须在间隔的事物和X空间的事物之间。 而已。 没有空间让第三个关系使空间(本身是一个关系的结果)等于某个其他的价值。

另一方面,高度(和宽度)约束不是关系。 你可以用一个简单的常量来设置一个事物的高度,这个常量与其他任何东西都没有关系。 因此,有“空间”来指定与另一个对象的关系 – 例如,高度应该等于另一个高度(或宽度,或其他)。

所以,如果你发现自己想要以某种方式彼此相关的约束条件,那么请看高度和宽度而不是空格。 在你的特定的例子中,你可以用隐藏的UIView围绕你的UITableView ,设置它们的高度是相等的,它们的空间到邻居/容器为0或者其他一些低常量。

作为额外的奖励,这在IB中是可能的。 不需要自定义代码或子类。

顶部表格视图应该对超视图的顶部(或顶部布局约束),对底部表格视图的垂直间距约束和高度约束具有约束。 底部表格视图应该对超级视图底部有一个约束,顶部表格视图应该有一个等高度约束。 你需要的关键是使顶部表格视图的高度约束优先级小于1000,这样当屏幕高度发生变化时,一个不是强制的东西(<1000的高度约束)将成为调整的东西。 所有这些都可以在IB中设置。

编辑后:

实际上,顶部表格视图根本不需要高度限制。 因为我对superview的顶部和底部以及两个表视图之间有一个约束,所以你需要有一个约束使得表视图的高度相等。