为啥在 UIScrollView 中放置视图时需要 6 个约束?

Posted

技术标签:

【中文标题】为啥在 UIScrollView 中放置视图时需要 6 个约束?【英文标题】:Why do I need 6 constraints when placing a view inside a UIScrollView?为什么在 UIScrollView 中放置视图时需要 6 个约束? 【发布时间】:2013-10-30 17:00:34 【问题描述】:

每当我向 UIScrollView 添加子视图时,我必须添加 6 个约束而不是 4 个。

如何重现问题:

    创建一个新的单一视图应用程序。 在情节提要中,添加一个填满整个屏幕的 UIScrollView。 添加其缺少的约束(这应该向超级视图添加 4 个约束,例如“Top Space to: Superview)。 添加一个新的 UIView 作为 UIScrollView 的子视图。调整大小,使其成为一个小矩形。 选择在此框上添加缺少的约束。

您会注意到它添加了 6 个约束:

4 用于尾随/前导/顶部/底部到超级视图 1 表示宽度 1 表示高度

如果您尝试删除宽度或高度约束,所有约束都会变为橙色。视图应该能够通过其尾随和前导约束来确定其宽度。同样,视图应该能够通过其顶部和底部约束来确定其高度。

那么为什么这 6 个都需要呢?

注意:如果您使用 UIView 而不是 UIScrollView 尝试相同的操作,那么一切都会按预期进行。

【问题讨论】:

【参考方案1】:

这是因为 UIScrollView 的内容大小也必须由约束决定。如果不包括最后 2 个约束,则内容大小不知道它应该有多大。

实际上,一个 UIScrollView 需要 8 个约束:

假设您有一个带有单个按钮的滚动视图(或任何其他具有固有大小的视图)。

您将需要以下约束:

4 用于定位滚动视图的框架。 4 用于确定滚动视图的内容大小。

前四个的例子是:

H:|[scrollView]|
V:|[scrollView]|

(这只是设置滚动视图的框架,使其占据整个屏幕。)

最后四个的例子是:

H:|-10-[button]-10-|
V:|-10-[button]-10-|

(请注意,这些行中的每一行都创建了 2 个约束。)

假设按钮的固有大小为 50。有了这些约束,我们只需将滚动视图的内容大小设置为 70x70。

更多信息可以found here。

Apple 还在ios SDK Release Notes for iOS 6 中发布了一些关于滚动视图和自动布局行为的信息。在那里,他们描述了如何让它与“纯自动布局方法”和“混合方法”一起工作。

【讨论】:

以上是关于为啥在 UIScrollView 中放置视图时需要 6 个约束?的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollVIew 中的 UIView 不更新视图

UIScrollView 花费太多时间

如何使用自动布局约束在单个屏幕中放置两个视图

为啥我不能在 uitableview 单元格中放置一个 nsarray

为啥我不能在类声明中放置“使用”声明?

linux中放置的文件为啥找不到了?