UIScrollView - 需要x位置/宽度的约束,需要y位置/高度的约束

17
我是一名有用的助手,可以为您翻译文本。
我有一个视图层次结构,看起来像这样(基于其他答案和苹果公司高级AutoLayout指南,用于使用UIScrollView):

enter image description here

ScrollView 的两个步骤如下:

  1. 设置 ScrollView 的 位置大小(frame)的约束:与设置其他视图的方式相同。
  2. 设置内容的约束:确保 ScrollView 的子视图与 ScrollView 的所有边缘(前导、尾随、顶部、底部)接触,如果你是在界面构建器中进行操作而不是编程。

在开始时,第一步运行良好并产生了以下结果:

enter image description here

enter image description here

没有出现意料之外的问题,对于位置和大小的设定都已经完成。现在我需要在Interface Builder中使用“Step 2”来定义内容的尺寸(内容高度和内容宽度)。
现在我会添加约束条件,将ScrollView的四个边缘都覆盖到。

enter image description here

突然间,ScrollView 不再知道它的位置和尺寸(帧)。

enter image description here

我查看了其他答案并按照各种步骤操作,但似乎无法解决此问题。很抱歉由于隐私问题无法发布Storyboard截图。

2个回答

19
  1. 将滚动视图的顶部、底部、前导和尾随约束设置为其父视图为0。

  2. 选择位于滚动视图内部的视图,并将其顶部、底部、前导和尾随约束设置为其父视图为0。

  3. 选择位于滚动视图内部的视图,进入尺寸检查器并将"Intrinsic size"设置为"Placeholder"。


@ChrisAllinson 当你将内在大小设置为“占位符”时,你告诉Xcode布局系统你的视图大小取决于其内容。 - nambatee

12
滚动视图起初可能有些棘手。您实际上有三个部分:
  1. 滚动视图的实际框架
  2. 包含在滚动视图中的子视图的实际框架
  3. 滚动视图的contentSize——即其应该向任何方向滚动的距离

所以,第一部分非常简单明了。

第二部分也似乎很简单,只是我们倾向于将子视图“固定”在其父视图的内侧边缘。对于滚动视图子视图而言,这些约束条件就定义了contentSize。您还需要确保子视图具有“大小”。

从仅有一个子视图开始,您可以:

  1. 将滚动视图的约束条件设置为“正常”。
  2. 设置子视图的大小 - 仅供演示目的,将其设置为100 x 100
  3. 将子视图的所有四个边缘钉在滚动视图的四个边缘上

运行应用程序。假设您设置了背景颜色,以便知道您正在查看什么,您应该会看到滚动视图定位和大小都符合您的期望……您应该看到100 x 100的子视图位于滚动视图的某个位置……而且您可能无法进行任何实际滚动。

如果您返回并将子视图更改为,例如,100 x 800,并仍然将其底部约束固定在滚动视图(即子视图的父视图)的底部,然后再次运行应用程序……您应该能够完全垂直滚动800pt高的子视图。

思考方式是:滚动视图的内容——无论是一个还是多个子视图——必须定义其自己的大小,这将定义可滚动区域(滚动视图的contentSize)。

希望这有意义!


谢谢。没有清晰地定义ScrollView的子视图(我的通用ContentView)的大小是导致问题的原因。我还必须清晰地定义该ContentView的所有子视图的大小。 - Fourth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接