使用自动布局

时间:2016-08-15 03:25:41

标签: ios swift uiscrollview autolayout

这是一个关于某些有用的东西的快速问题,但可以写得更好。我有一个UIScrollView和一个列在里面的对象列表,一个在另一个之下。一切都在viewDidLoad()期间完成,对象的放置使用Auto Layout。我这样做是为了将contentSize的{​​{1}}高度设置为适当的值。

UIScrollView

它有效,但任意值1.59显然是由我尝试了几个可能的值来决定的。 在这种情况下计算contentSize的正确方法是什么?我正在以编程方式执行所有操作。 搜索网并没有让我得到任何简单明了的答案,所以虽然这可能是一个有点重复的问题但我决定重新制定它。

5 个答案:

答案 0 :(得分:2)

虽然我终于要解决这个问题并让事情奏效。 我注意到我在网上找到的所有相关答案都是针对故事板用户的。但是没有什么可以通过编程方式完成,我可以把手放在上面。

所以我决定制作一个非常简单的演示应用程序来展示如何实现这一目标。我希望在某些时候对某人有用。

以下是在GitHub上获取它的地址: https://github.com/zaxonus/AutoLayScroll

答案 1 :(得分:2)

你需要做的就是确保第一个子视图的顶部锚点被约束到滚动视图的顶部锚点,而最后一个子视图的底部锚点被约束到滚动视图的底部锚点

答案 2 :(得分:1)

我还以编程方式使用约束来动态修改UIScrollView的contentSize。我几乎遵循Shrikant的指示,但是对于步骤2.1,我将centerX设置为scrollViews.centerX而不是设置前导和尾随边距(不知道为什么前者有效,而后者没有)。然后作为最后一步,在添加最终子视图后,我执行了以下操作:

contentView.layoutIfNeeded() //set a frame based on constraints
scrollView.contentSize = CGSize(width: contentView.frame.width, height: contentView.frame.height)

希望这有助于将来的某些人。

答案 3 :(得分:1)

如果您不想使用情节提要,而只是使用约束,则可以按照此处的指南进行操作

https://redflowerinc.com/implement-uiscrollview-using-constraints-no-need-to-use-content-size/

使用可以使用底部锚点并将您的视图固定到滚动视图。通过使用约束,您不需要使用内容大小。

答案 4 :(得分:0)

这是 Apple 的官方指南,对我有用。

https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/AutolayoutPG/WorkingwithScrollViews.html

为了支持滚动视图,系统会根据约束所在的位置以不同的方式解释约束。

  • 滚动视图和滚动视图外的对象之间的任何约束都附加到滚动视图的框架上,就像任何其他视图一样。
  • 对于滚动视图与其内容之间的约束,行为因受约束的属性而异:
    • 滚动视图的边缘或边距与其内容之间的约束附加到滚动视图的内容区域。
    • 高度、宽度或中心之间的约束附加到滚动视图的框架。
  • 您还可以在滚动视图的内容和滚动视图外部的对象之间使用约束来为滚动视图的内容提供固定位置,使该内容看起来漂浮在滚动视图上。

对于大多数常见的布局任务,如果您使用虚拟视图或布局组来包含滚动视图的内容,那么逻辑就会变得容易得多。在 Interface Builder 中工作时,一般方法如下所示:

  1. 将滚动视图添加到场景中。
  2. 绘制约束以定义滚动视图的大小和位置,正常。
  3. 向滚动视图添加视图。将视图的 Xcode 特定标签设置为内容视图。
  4. 将内容视图的顶部、底部、前缘和后缘固定到滚动视图的相应边缘。内容视图现在定义了滚动视图的内容区域。
<块引用>

此时内容视图没有固定大小。它可以拉伸和增长以适应您放置在其中的任何视图和控件。

  1. (可选)要禁用水平滚动,请将内容视图的宽度设置为等于滚动视图的宽度。内容视图现在水平填充滚动视图。
  2. (可选)要禁用垂直滚动,请将内容视图的高度设置为等于滚动视图的高度。内容视图现在水平填充滚动视图。
  3. 在内容视图中布置滚动视图的内容。使用约束将内容正常定位在内容视图中。
<块引用>

重要

您的布局必须完全定义内容视图的大小(步骤 5 和 6 中定义的除外)。要根据内容的内在大小设置高度,您必须有一个不间断的约束和视图链,从内容视图的顶部边缘延伸到其底部边缘。同样,要设置宽度,您必须拥有从内容视图的前缘到后缘的完整约束和视图链。

如果您的内容没有固有的内容大小,则必须向内容视图或内容添加适当的大小限制。

当内容视图比滚动视图高时,滚动视图启用垂直滚动。当内容视图比滚动视图宽时,滚动视图启用水平滚动。否则,默认情况下禁用滚动。