各位 iOS 程序员大家好。在创建一个应用程序时,我遇到了一个我似乎无法找到答案的问题。让我们来布置一下:
我正在创建一个带有 UIScrollView 的 UIViewController,因为它是唯一的 child 。在这个 View 中,我有一个 UIView,在其中有一个 UIViews 列表,里面有 UILabels。众所周知,您需要为 UIScrollView 指定一个 contentSize。 问题是列表需要随其内容动态变化,因此我无法事先知道 View 高度。我添加了所有具有高度设置为“>=0”的约束的 View 。 当我稍后尝试设置 UIScrollView 的高度时,我需要获取列表所在的 UIView 的高度,或者获取列表中最后一个 View 的 origin.y 和高度。这当然需要在向用户显示 View 时准备就绪。
我目前已经尝试过 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,同时准备好时间用户看到 View 了吗?
顺便说一句,我正在用 Swift 制作这个应用程序,所以最好用这种语言回答,但我能够从 Objective-C 翻译成 Swift;发布最适合您的内容。
谢谢! :)
最佳答案
你说:
As you all know you need to specify a
contentSize
for aUIScrollView
.
不,因为TN2154说, ScrollView 及其 subview 之间的约束被“解释为 ScrollView 的内容大小”(强调)。这是一个福音,因为如果进行自动布局,您不再需要弄乱 contentSize
。只需为 ScrollView 的 subview 设置约束,内容大小就会自行处理。这利用了标签的固有大小(并确保标签的 numberOfLines
为零)。
唯一的技巧是它有时无法计算出标签的正确宽度(因为尾部约束是 ScrollView 的内容大小,它有时会使 ScrollView 成为水平滚动的)。您可以通过手动设置 preferredMaxLayoutWidth
或在标签和 ScrollView 的 superview 之间设置宽度约束来解决这个问题。
就个人而言,虽然我理解在 ScrollView 和标签之间添加 UIView
容器的倾向,但我建议不要使用它们,除非您出于其他原因需要它们。恕我直言,它只会不必要地使约束复杂化。它的毛已经够多了。显然,如果这些容器为您提供其他用途,那么继续保留它们(它们会很好地工作),但如果您只是为了限制而这样做,您可能会考虑消除它们。
关于iOS:通过以编程方式添加约束作为唯一指示器获取 View 高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26261044/