简答:
ScrollView 约束
Leading >= 0, Trailing >= 0, Top >= 0, Bottom >= 0
Center X and Center Y
StackView 约束
Leading = 0, Trailing = 0, Top = 0, Bottom = 0
StackView width = ScrollView width (priority low :250)
StackView height = ScrollView height
长答案
首先,你的结构很好,我们有:
UIScrollView
UIStackView (horizontal)
Subviews
所以,要达到目标,我们应该:
- 居中
UIScrollView
- 设置
UIScrollView的contentSize等于固有内容
UIStackView 的大小
这是怎么做的:
第一步:将 UIScrollView 的框架居中
CenterY 和 CenterX 约束用于使UIScrollView 的框架居中
Leading Space >= 0, Trailling Space >= 0, Top Space >= 0, Bottom Space >= 0 用于防止UIScrollView的frame超过父view的frame
我使用占位符固有大小来不显示与 UIScrollView 的 contentSize 相关的错误(因为我们还没有子视图所以 contentSize)。
现在,我们UIScrollView的框架就OK了,进行下一步:)
第2步:添加横向UIStackView
- Top、Bottom、Leading、Trailing 约束用于修复
UIStackView 框架
- 用于计算等高和等宽
UIScrollView 的 contentSize
PS。 UIStackView的frame有任何变化,改变UIScrollView的contentSize
第 3 步:添加子视图
因为我们在UIStackView 中使用了Fill Distribution,所以所有subviews 必须具有内在的内容大小(或高度和宽度约束(非首选))。
例如,如果我们使用Fill Equally,只有一个具有内在内容大小(或高度和宽度约束(非首选))的subview 足够,其他子视图大小将等于这个。
例如:我将添加 3 个标签(请删除 UIScrollView 的占位符固有大小)
它有效!不,不,还没有尝试添加第四个和五个标签:)
为什么?
为了理解,我们将通过两个示例计算视图的每个元素的框架:
父视图大小:200、200
第一个标签内在内容大小:120、50
第二个标签固有内容大小:150、50
第一个例子(仅UIStackView中的第一个标签)
-
UIStackView 内在内容大小 = 120, 50
-
UIScrollView contentSize = 120, 50
-
UIScrollView 帧 = 40, 75, 120, 50
所有帧都OK
第二个例子(带有两个标签)
-
UIScrollView 帧 = 0, 0, 200, 50
-
UIScrollView contentSize = 200, 50
-
UIStackView 内在内容大小 = 200, 50
所以,UIStackView 无法正确显示两个标签(因为UIStackView 的宽度低于两个标签的宽度),并且我们没有滚动,因为UIStackView 约束宽度是等于 UIScrollView 的宽度。
当 UIStackView 固有内容大小小于最大 UIScrollView 帧时,它可以工作。
为了解决这个问题,我们将宽度约束的优先级更改为低于UIStackView 固有内容大小优先级值的值,一切正常:)
希望对您有所帮助。
Code source