Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS:以编程方式添加的约束作为唯一指标获取视图高度_Ios_Dynamic_Uiscrollview_Constraints_Programmatically Created - Fatal编程技术网

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

iOS:以编程方式添加的约束作为唯一指标获取视图高度,ios,dynamic,uiscrollview,constraints,programmatically-created,Ios,Dynamic,Uiscrollview,Constraints,Programmatically Created,大家好,iOS程序员们。在创建应用程序时,我遇到了一个似乎找不到答案的问题。让我们把它摆出来: 我正在创建一个UIViewController,其中UIScrollView是它的唯一子级。在这个视图中我有一个UIView,在这个视图中有一个UIView列表,其中有UILabel。大家都知道,需要为UIScrollView指定contentSize。 问题是列表需要随内容动态变化,因此我无法事先知道视图的高度。我正在添加高度设置为“>=0”的所有具有约束的视图。 当我稍后尝试设置UIScrollV

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

我正在创建一个UIViewController,其中UIScrollView是它的唯一子级。在这个视图中我有一个UIView,在这个视图中有一个UIView列表,其中有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中设置约束,并在ViewWillDisplay中设置contentSize;这产生了同样的结果。在ViewWillDisplay中设置约束,在viewDidLoad中设置contentSize只会导致崩溃

底线:如果我想获取view.height或类似的方法以返回正确的结果,同时在用户看到视图时准备好,我应该在什么时候设置UIScrollView.contentSize

顺便说一句,我正在用Swift制作这个应用程序,所以最好用这种语言回答,但我能够将Objective-C翻译成Swift;贴上最适合你的东西

谢谢!:)

你说:

大家都知道,需要为
UIScrollView
指定
contentSize

不,如前所述,滚动视图及其子视图之间的约束“解释为滚动视图的内容大小”(强调添加)。这是一个好消息,因为如果进行自动布局,您就不必再胡乱处理
contentSize
。只需为滚动视图的子视图设置约束,内容大小就会自行调整。这将利用标签的固有大小(并确保标签的
numberOfLines
为零)

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


就我个人而言,虽然我理解在滚动视图和标签之间添加
UIView
容器的倾向,但我建议将它们丢失,除非您出于其他原因需要它们。嗯,它只是不必要地使约束复杂化了。它的毛已经够多了。显然,如果这些容器为你提供了其他的实用工具,那么继续前进并保存它们(并且它们会很好地工作),但是如果你只是为了约束而这样做,你可以考虑消除它们。

你可以深入了解如何避免水平滚动的UISCLVIEW吗?我尝试为UIView设置一个特定的宽度约束(它们是必需的),但当这不起作用时,我尝试为UILabels设置preferredMaxLayoutWidth。当这不起作用时,我尝试手动设置sv.contentSize.width,但也没有效果。我做错了什么?您可以发布示例代码吗?使用自动布局时,不要尝试手动设置
frame
contentSize
。使用约束。要设置标签的宽度,可以使用
preferredMaxLayoutWidth
或使用constraint,如下所示。仅供参考,虽然我通常在IB中进行,但在代码中向您展示的唯一方法是以编程方式实现约束,我在本演示中做了这一点:在IB中更容易实现,但对我来说更难演示,就像我在上面的链接中所做的那样。或者,如果您太沉迷于此,打开“TranslatesAutoResizengMaskintoConstraints”,你可以做一切老一套的事情,比如玩宽度、手动计算高度等等。在这个过程中,你似乎失去了一点灵活性。我已经通过编程创建了所有约束,正如我提到的,我一开始尝试不触及框架或内容大小。这仍然没有成功。我真的希望避免启用translatesAutoresizingMaskIntoConstraints,因为高度不同的文本长度会使这成为一个困难和令人沮丧的过程。顺便说一句,我不知道这是否重要,但我正在使用Constraints with VisualFormat。经过20多个小时令人沮丧的工作,我终于明白了为什么它对我不起作用。原来我忘了在视觉y约束的末尾添加一个|!不过现在可以了,非常感谢您的帮助D