限制空间时减少元素之间的空间量

时间:2015-05-25 01:55:17

标签: ios autolayout nslayoutconstraint

想象一下你并排有三个按钮的情况。您希望三个按钮填充可用宽度,并且是最小尺寸设置的完美正方形,并且它们之间有一定的空间。要进行此设置,您将拥有以下约束:

A:
1:1与A的比率 导致超级视图
宽度和高度> = 25

B:
A的宽度和高度相等 通往A:50

C:
A的宽度和高度相等 通向B:50
追踪到超级视图

现在假设可用宽度足够小,以便没有足够的水平空间,以确保按钮是一个完美的正方形,每个按钮之间有50个。而不是打破宽高比和宽度约束,而是希望减少按钮之间的空间量。我的问题是,你是怎么做到的?

我认为我只是将领先约束的关系改为小于或等于,但这会导致不等式约束歧义与这两个约束。我想也许我需要为leading指定一个最小值,所以我添加了另外两个设置为大于或等于10的前导约束。这并没有解决歧义。然后我添加了另一组前导约束,这个时间等于两个值之间的设定值,然后我降低了那些的优先级。这解决了模糊性,但是按钮之间的空间永远不会减少 - 它始终是我为约束设置的值,尽管它的优先级降低了。

为了获得这个,需要设置哪些约束?

  • 在同一水平空间中并排显示三个按钮
  • 所有三个按钮都是完美的正方形
  • 按钮的最小尺寸(25x25)
  • 他们之间的一定空间 - 50
  • 当水平空间太小而无法确保所有约束都能满足时,它应该减少按钮之间的空间量。

3 个答案:

答案 0 :(得分:1)

您需要一个所需优先级的间距约束来表示允许的最小间距。例如,> = 10 @ 1000。

然后,您需要一个较低优先级的间距约束,用相等的方式表示所需的间距,例如== 50 @ 200。

但是,您有两个按钮间空格。这种模糊性的出现是因为当没有足够的空间来制作所需的距离时,自动布局不知道哪个会减少。

您可以设置不同的优先级来解决歧义,但是一个间距会崩溃而另一个间距保持在50,直到达到最小值,此时另一个间距也会减小。

我怀疑你希望两个空格始终相等。只有约束才能做到这一点。相反,您需要使用隐藏的间隔视图。所以,你会做类似的事情:

|-[buttonA][spacer1(>=10,==50@200)][buttonB(==buttonA)][spacer2(==spacer1)][buttonC(==buttonA)]-|

答案 1 :(得分:0)

尝试为每个按钮UIViewContentModeScaleAspectFit或IB调用它的内容模式。然后使用宽度而不是leading来控制空格。我猜想点击它们之间的空间会调用按钮的目标,因此在这种情况下使用这种方式使用三个常规UIViews,然后将按钮添加为它们的子视图。

答案 2 :(得分:0)

我最终决定避免间隔视图,并制定出一个解决方案来实现最终结果。而不是设置它,所以自动布局将计算出计算并自动减少按钮之间的空间,我决定以编程方式根据视图的宽度设置这些约束的constant。因此,确保按钮之间的空间对于大宽度而言是大的,对于小宽度则是小的。

为实现此目的,我只需为水平约束设置一个出口集合,然后在updateViewConstraints中循环约束并将constant设置为self.view.frame.size.width / 12