1

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

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

我目前试过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;以最适合您的方式发布。

谢谢!:)

4

1 回答 1

1

你说:

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

不,正如TN2154所说,滚动视图及其子视图之间的约束被“解释为滚动视图的内容大小”(强调添加)。contentSize这是一个福音,因为如果进行自动布局,您不再需要搞砸。只需为滚动视图的子视图设置约束,内容大小就会自行处理。这利用了标签的固有大小(并确保标签numberOfLines为零)。

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

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

于 2014-10-08T16:36:32.020 回答