使用UIStackView将单个视图居中

Rob*_*jas 6 ios ios9 uistackview

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

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

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

我很想知道为什么UIStackView表现得那样.

rob*_*off 9

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

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

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

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

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

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