iOS:通过以编程方式添加约束作为唯一指示器获取 View 高度

标签 ios dynamic uiscrollview constraints programmatically-created

各位 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 a UIScrollView.

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

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

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

关于iOS:通过以编程方式添加约束作为唯一指示器获取 View 高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26261044/

相关文章:

javascript - overflow-y 在模态内的 safari 中不起作用

ios - Swift:只能在类成员上指定覆盖

iphone - 如何避免 iOS (MVC) 中同一模型对象的多个实例

iphone - iOS - 我们应该将图像保存为本地文件还是二进制数据(在 Core Data 对象中)?哪种方式更快?

asp.net - IIS URL动态重写方式

php - 级联下拉框

ios - 水平视差滚动 UIScrollView iOS

java - java中的函数作为私有(private)成员变量

objective-c - 在 iOS 5.1 中显示模态视图 Controller 后,UIScrollView 无法正常运行

ios - 在这个非常基本的 UIScrollView 中我做错了什么