使用 UIStackView 使单个视图居中

Using UIStackView to center single view

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

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

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

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

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

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

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

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

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

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