【问题标题】:Using UIStackView to center single view使用 UIStackView 使单个视图居中
【发布时间】:2015-10-08 21:33:50
【问题描述】:

我一直在尝试使用 UIStackView 在 IB 中设置一个简单的容器视图。我希望这个容器将其唯一排列的子视图居中并尊重子视图的内在内容大小。

不幸的是,对于所有可能的对齐和分布配置,子视图被拉伸以填充沿轴的宽度。

这看起来像是一个奇怪的边缘情况或错误,因为一旦我添加了第二个视图,一切都会按预期运行,并且两个子视图都保持其由内部内容大小方法定义的大小。

我很想知道为什么 UIStackView 会这样。

【问题讨论】:

标签: ios ios9 uistackview


【解决方案1】:

UIStackView 创建优先级为 1000(允许的最大优先级)的约束,即UILayoutPriorityRequired。如果可能,需要自动布局来满足这些约束。

您的“高”优先级约束(我猜是UILayoutPriorityDefaultHigh == 750)与堆栈视图所需的约束冲突,因此自动布局将忽略您的约束。

如果您将约束优先级设置为 1000,则自动布局将无法满足所有必需的约束。它将记录一个错误,并且会破坏其中一个约束。您无法选择它打破了哪个约束。

注意它只需要打破三个约束中的一个来解决系统,它可以打破三个冲突的约束中的任何一个。但是,打破三个相互冲突的约束中的任何一个都不会留下一个以您的视图为中心的系统。您的视图最终应该被拉伸或拥抱堆栈视图的一端,具体取决于哪个约束自动布局中断。并且未来版本的 iOS 可能会更改自动布局,从而打破不同的约束并更改布局。

尚不清楚您为什么要尝试使用堆栈视图来居中您的视图。如果您只有一个视图并且想要将其居中,请将其父视图设为普通的 UIView 而不是 UIStackView,并设置约束以使您的视图在父视图中居中。

如果您使用堆栈视图是因为有时您希望堆栈中有多个排列的子视图,那么除了内容视图之外,您还应该添加两个隐藏的间隔视图(轴的每一端一个) .在垫片之间创建等宽或等高约束。

【讨论】:

  • 谢谢!我被“Debug Hierarchy View”愚弄了,它在检查器中显示 76 作为约束的优先级。
  • 为什么我要使用堆栈视图进行居中?我一直在寻找可以完全在 IB 中设置的东西。
  • @RobertWijas IB 允许您定义 .CenterX.CenterY 约束,这将使视图居中。单击“对齐”按钮(IB 工作区右下角的第二个按钮)或按住控件从子视图拖动到其父视图,您将看到“中心”选项。也许我不明白你的评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多