使用UIStackView集中单一视图

时间:2015-07-19 19:23:53

标签: ios ios9 uistackview

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

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

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

我很想理解为什么UIStackView会像那样。

1 个答案:

答案 0 :(得分:9)

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

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

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

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

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

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