10

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

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

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

我很想了解为什么 UIStackView 会这样。

4

1 回答 1

14

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

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

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

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

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

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

于 2015-07-20T19:20:07.583 回答