我在垂直滚动的 UIScrollView
内有一个 UIStackView
,并使用自动布局约束所有内容。滚动视图填充了Supperiew,堆栈视图填充了滚动视图,并且在堆栈视图中添加了各种元素。为了使其使用自动布局很好地播放并定义滚动视图的内容大小,您还必须指定堆栈视图的宽度。这是通过在堆栈视图上添加宽度约束来完成的,等于滚动视图的宽度。在这一点上没有任何模棱两可,它的行为完全按照要求。
现在,如果要添加边距,以使元素不会伸展到屏幕的最左侧和右边缘,则可以更改堆栈视图上的领先和尾随约束常数,以插入两侧的15pt例子。但是,您必须确保将相等的宽度约束常数更改为-30。而且效果很好,可以插入可滚动内容,仍然让您在屏幕的远处滑动滚动。
现在,iPhone X出现了,在景观中,15点填充是不够的,因为内容放在住房传感器下方。因此,您需要更新此信息以设置保证金以尊重安全区域布局利润率。您真的只想使用默认边距。您可以更改堆栈视图的领先和落后约束常数以使用视图的布局边距(尊重安全区域插图),但这将行不通,因为您相等的宽度约束常数不再是边缘的两倍,边距是动态的。现在。
因此,解决此问题的一种方法是为堆栈视图的前导和尾随和宽度约束创建IBOutlet
s,然后在布局余量更改时将它们全部调整(viewLayoutMarginsDidChange
)。但是我想知道是否有更好的方法,最好是在接口构建器中起作用的解决方案,无需代码。
我找到了一种完全在接口构建器中执行此操作的方法。而不是将堆栈视图嵌入滚动视图中,而是在滚动视图中添加一个UIView
作为内容视图。创建领先,尾随,顶部和底部约束都等于Supperiew,其常数为0,再加上与滚动视图相等的宽度约束。然后将堆栈视图嵌入此内容视图中。为堆栈视图创建领先和落后约束,等于Supperiew's Margin 2,加上顶部和底部。
,您的设置将是:
- view
-- scroll view
--- view
---- stack view
这将确保您可以在景观中在iPhone X上滚动,您可以在左右边缘滚动,滚动条放在屏幕的最右边缘,堆栈视图位于安全区域内。
¹我发现一个常数8增加了足够的填充以感觉正确。
纯接口构建器解决方案(比接受的更好):
- 添加一个虚拟
UIView
bellowUIScrollView
(下面,由于滚动视图的自动内容插图工作) - 将视图的高度设置为0px,领先和落后 Supperiew的领导和尾随带有保证金!(对边缘很重要)
- 从堆栈视图创建相等的宽度约束(这是 滚动浏览的内容视图)到虚拟视图,并更改stackView的领先和尾声以尊重边距
- 设置在滚动浏览上保留保证金
完成