UITableView里面的UIStackView高度限制问题

时间:2018-10-04 10:07:31

标签: ios uitableview autolayout uistackview

要求:

我们的应用程序具有一种模式,其中许多屏幕的顶部都具有多个UILabel,并且在其下方具有单个UITableView,该UILabel在出现时始终是页面上的最后一个元素,并一直扩展到屏幕底部。由于页面取决于特定于用户的数据,因此我们不预先知道需要显示多少标签。而且,在某些情况下,当UITableView中没有要显示的数据时,我们只想隐藏它即可。

我的实现(无效):

由于页面的动态性质,我认为将所有UILabel和UITableView包装在UIStackView中,然后在代码中操纵元素可见性(即isHidden属性)是可行的方法。我将UIStackView的所有角落固定到了SuperView的角落,除了底部约束,我使底部约束大于或等于UIStackView底部约束。这样做是为了确保在UITableView隐藏的情况下,UIStackView不会占据整个屏幕,因为这样做时,它倾向于将标签显示在屏幕中间。基本上,如果UITableView是可见的,则我希望UIStackView占据整个页面,否则,仅是显示标签所需的空间。

问题:

Sample application that demonstrates the issue Height constraint issue

AutoLayout在计算UITableView的高度时遇到问题。我可以想到两种解决方案:

  1. 将UIStackView底部常量更改为“等于”,而不是“大于或等于”。但是,通过这种方式,UIStackView将始终占据整个屏幕的高度,而不是隐藏UITableView时我想要的东西。
  2. 手动指定UITableView的高度限制。我不想这样做,因为我不知道从TableView顶部到屏幕底部所需的高度。我认为这在代码中并不太难,但是我希望有一个更优雅的解决方案。

有趣的观察结果

与UITableView不同,UILabel在高度限制方面似乎没有与UITableView相同的问题。我不是100%知道为什么会这样,但是我的猜测是UILabel提前知道了它们的高度(可能是通过internalContentSize()知道的),但是UITableView直到运行时才知道吗?

1 个答案:

答案 0 :(得分:1)

您可以结合建议的解决方案1和2:

将StackView底部约束设置为“等于”,然后以编程方式将其更改为“大于或等于”。

加载数据时,您需要update constraints才能根据接收到的数据设置值。