UISlider 在水平 UIStackView 中的高度

Posted

技术标签:

【中文标题】UISlider 在水平 UIStackView 中的高度【英文标题】:height of UISlider in a horizontal UIStackView 【发布时间】:2019-08-21 21:03:09 【问题描述】:

UIStackView 中的水平轴排列的子视图必须与UIStackView 的高度相同。但是,UISlider 并非如此。无论我为UIStackView 设置什么高度,堆栈视图中UISlider 的高度都会高出1px。

我将UIStackView 的高度设置为40,并且没有为UISlider 设置任何自动布局。

但是UISlider 的高度是 41,我预计是 40。

这有什么原因吗?有什么方法可以解决这个问题?

【问题讨论】:

【参考方案1】:

UISlider 的大小似乎做了一些奇怪的事情。

暂时忽略堆栈视图,如果您只是对UISlider 应用宽度和高度约束,它们将与运行时的实际 宽度和高度不匹配。你会得到一个额外的4-pts 宽度和一个额外的1-pt 高度。

但是...

如果您相对于滑块约束另一个视图,则另一个视图尊重滑块的约束,而不是滑块的渲染大小。

看看这个来自 Debug View Hierarchy 的图像捕获:

滑块有 width = 100 height = 40

但橙色矩形(滑块背景)实际上是 104 x 41 - 如果您在运行时 print(mySlider.frame),这就是您将得到的。

左标签有

trailing = slider.leading height = slider.height centerY = slider.centerY

右标签有

leading = slider.trailing height = slider.height centerY = slider.centerY

两个标签高度都正好是 40-pts - 这与 约束 相匹配。

还请注意,标签框重叠滑块背景2-pts,表明标签x-positioning再次匹配约束,而不是渲染滑块视图框架。

如果您在滑块嵌入UIStackView 时检查视图,您会看到(嗯,您已经看到)框架大小大于堆栈视图的框架。但是,滑块的框架将超出堆栈视图的实际框架...堆栈视图(及其其他排列的子视图)将继续尊重您给它的约束。

所有这些都是说......如果“尺寸不匹配”没有引起任何问题,我不会担心。

【讨论】:

以上是关于UISlider 在水平 UIStackView 中的高度的主要内容,如果未能解决你的问题,请参考以下文章

当其他元素太宽时,在水平 UIStackview 中看不到标签

如何在水平 UIStackView 中对齐两个标签的底部?

UIScrollView 内的水平 UIStackView 不滚动

水平 UIStackView 拉伸子视图

水平 UIStackView - 如何对齐里面的项目,以便一个向左浮动,另一个在中心?

iOS:多行 UILabel 与水平 UIStackView 中的另一个 UILabel 大小错误