iOS:以编程方式添加约束作为唯一指标获取视图高度

时间:2014-10-08 15:43:42

标签: ios dynamic uiscrollview constraints programmatically-created

你好有iOS程序员。在创建应用程序时,我遇到了一个问题,我似乎无法找到答案。让我们说出来:

我正在创建一个带有UIScrollView的UIViewController,因为它是唯一的孩子。在这个视图中我有一个UIView,在其中有一个UIVabs列表,里面有UILabel。众所周知,您需要为UIScrollView指定contentSize。 问题是列表需要是动态的内容,因此我无法预先知道视图的高度。我正在添加具有约束的所有视图,其中高度设置为“> = 0”。 当我稍后尝试设置UIScrollView的高度时,我需要获得列表所在的UIView的高度,或者获取列表中最后一个视图的origin.y和height。这当然需要在向用户显示视图时准备就绪。

我目前尝试了view.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize),返回0; view.systemLayoutSizeFittingSize(UILayoutFittingExpandedSize),返回10000;和view.origin.y + view.frame.height,它也返回0.在我看来,约束尚未生效。

我已尝试从viewDidLoad()设置约束和UIScollView.contentSize。我还尝试在viewDidLoad中设置约束并在viewWillAppear中设置contentSize;这产生了相同的结果。在viewWillAppear中设置约束并在viewDidLoad中设置contentSize只会导致崩溃。

底线:如果我想获取view.height或类似的方法来返回正确的结果,我应该何时设置UIScrollView.contentSize,同时在时间准备好之前用户看到了视图吗?

是的,我正在Swift中创建这个应用程序,所以这种语言的答案是首选,但我能够从Objective-C转换为Swift;以最适合你的方式发帖。

谢谢! :)

1 个答案:

答案 0 :(得分:1)

你说:

  

众所周知,您需要为contentSize指定UIScrollView

不,正如TN2154所说,滚动视图及其子视图之间的约束被解释为滚动视图的内容大小" (重点补充)。这是一个福音,因为如果进行自动布局,您不再需要使用contentSize。只需为滚动视图的子视图设置约束,内容大小就可以自行处理。这利用了标签'内在大小(并确保标签' s numberOfLines为零)。

唯一的技巧是它有时无法找出标签的正确宽度(因为尾随约束是滚动视图的内容大小,它有时会使滚动视图成为水平滚动视图)。您可以通过手动设置preferredMaxLayoutWidth或在标签和滚动视图的超级视图之间设置宽度约束来解决此问题。

就个人而言,虽然我理解在滚动视图和标签之间添加UIView容器的倾向,但我建议丢失它们,除非您出于其他原因需要它们。恕我直言,它只是不必要地使约束复杂化。虽然它有毛茸茸的毛茸茸。显然,如果这些容器对你有其他实用性,那么继续保持它们(并且它们可以正常工作),但是如果你只是为了限制而这样做,你可以考虑消除它们