如何为UILabel指定约束以保持UISegmentedControl的每个段下面的居中?

时间:2015-04-14 21:00:01

标签: ios xcode interface-builder autolayout

在我的iOS 8应用程序中,我有一个UISegmentedControl,可以伸展以适应设备屏幕的宽度。所以在iPad上它的像素宽度比在iPhone 6+上更宽,比iPhone 6更宽像素。

在UISegmentedControl的每个片段下方居中,我有一个UILabel。所以有5个段和5个UILabel。每个UILabel都有一个固定的宽度(由约束固定)。但是,如果显示尺寸增加,它们就会变得不受影响。

如何在Interface Builder中指定一个约束来强制每个UILabel在每个段下面居中?如果我可以让元素在显示尺寸缩放时保持按比例间隔,我会很高兴,但我也无法弄清楚如何做到这一点。

我所能看到的只是将中间UILabel直接置于中间段下方,方法是指定它与UISegmentedControl之间的中心X对齐。

我在所有UILabel之间以及外部UILabel和视图边缘之间指定了一个水平空间约束,并将所有这些约束设置为“大于或等于”。它们都具有相同的优先级,但奇怪的是,它们并非都按比例相互缩放。

由此产生的问题是,当设备屏幕的宽度增加时,每个UILabel之间的水平空间量不会平滑地缩放。如果我将所有内容对齐到位于其上的正确位置iPhone 5S的屏幕宽度,然后在iPad上它们的对齐方式都很不稳定,只有中间的一个与它的分段对齐。其余的人都偏离了中心。

似乎无法将总体显示宽度的百分比指定为约束 - 您只能按像素指定事物。 真的吗?!? !

显然,我可以使对象的 width 变得灵活,但因为它们是带有右对齐文本的文本标签,所以一切都搞砸了。

我肯定在这里遗漏了一些东西......因为自动布局的目的是让你的界面根据屏幕尺寸进行缩放,肯定有一种方法来指定约束作为任何给定视图或子视图的百分比 ... 肯定 !!!但是怎么样?我已经阅读了文档,但在我的生活中,我无法理解它。

BTW我确实看到过去,人们使用过像spacer viewsmultiple sets of constraints这样的粗暴黑客,但肯定是那些过时的答案,我只是忽略了一些非常明显的东西...... EM>右

1 个答案:

答案 0 :(得分:0)

您可以通过使标签的centerX约束等于superview.trailing乘以0.1,0.3,0.5,0.7和0.9且常量为0来实现此目的。要制定这些约束,请将5个标签添加到视图中。将最左边的一个垂直间距约束赋予分段控件。选择所有5个标签并给它们一个“垂直中心”对齐约束。现在控制 - 从每个标签拖动到屏幕的右侧,并选择“尾随空间到容器边距”约束。编辑这些尾随约束中的每一个看起来像这样(除了需要给出上面提到的值的乘数):

enter image description here

您必须反转第一个和第二个项目(您从第一个项目的下拉菜单中执行此操作),将Label.trailing更改为Label.Center X,并取消选中“相对于边距”框,然后纠正常数和乘数值。

此方法仅在分段控件在屏幕上一直延伸且边缘没有填充的情况下才有效。如果要填充边缘,则需要使用完全不同的方法。您需要在分段控件下创建5个UIViews - 将最左侧的左边缘与分段控件的左边缘对齐。将最右侧的右边缘与分段控件的右边缘对齐。为5个视图提供相等的宽度,并为每个视图提供0长度的水平间距约束。这将为您提供5个视图,模仿分段控件的宽度,每个视图的宽度与其中一个段相同(假设所有段都是相同的宽度 - 如果不是这样的话,那就搞砸了)。然后,您只需要将标签添加为这5个视图的子视图,并为它们提供centerX和centerY约束。