如何在堆栈视图中水平居中 UISwitch?

How do I horizontally center a UISwitch in a stack view?

我正在使用 Interface Builder 创建应用程序。我想安排一组标签和相应的 UISwitch,以便所有标签都显示在屏幕的左半部分,而开关则在右侧。开关应与标签对齐。

为此,我尝试使用垂直堆栈视图,其中嵌入了多个水平堆栈视图(每 label/switch 对一个水平堆栈视图)。为了正确对齐标签和开关,我将它们中的每一个都设置在一个空白的 UIView 中,并将它们(开关和标签)居中放置在相应的 UIView 上。然后将堆栈视图设置为 "Center" 对齐和 "Fill Equally" 分布。

通过此设置,我获得了适当的视觉布局,但即使每个父视图都设置了 "User Interaction Enabled",也无法激活 UISwitch。如果我将开关直接移动到水平堆栈视图中(没有将其嵌入空白 UIView 中),它可以正常工作,但我无法按照我想要的方式将其居中。

我怎样才能拥有我想要的布局并且仍然具有功能性的 UISwitch?

我已经看到 this question,但是 none 的答案似乎可以解决我的问题。


重现:

  1. 创建一个新的视图控制器
  2. 添加垂直堆栈视图 (VSV)
  3. 将 VSV 的约束设置为与 View Controller 的根视图等高等宽,并且水平和垂直居中
  4. 将 VSV 的对齐设置为 "Center" 并将分布设置为 "Fill Equally"
  5. 向 VSV 添加 1+ 个水平堆栈视图 (HSV)
  6. 将每个 HSV 设置为 "Center" 对齐和 "Fill Equally" 分布
  7. 向每个 HSV 添加两个空白 UIView
  8. 对于每个 HSV,将其约束为与 VSV 的宽度相等
  9. 对于每个 HSV,将 UILabel 添加到第一个 UIView,将 UISwitch 添加到第二个 UIView
  10. 对于每个 UILabel 和 UISwitch,将其约束为在其父 UIView 上水平和垂直居中

当你运行应用程序时,布局是完美的。但是,可以与 none 的 UISwitch 进行交互,即使每个连续的父视图都启用了用户交互。

我在 Interface Builder 中的层次结构:

开关不起作用的内置应用程序:

您无法与开关交互的原因是包含它的空白视图最终高度为 0。限制该(空白)父视图的高度,使其不会调整为零,或将开关顶部和底部限制到父级(值为 0)。