想象一下你并排有三个按钮的情况。您希望三个按钮填充可用宽度,并且是最小尺寸设置的完美正方形,并且它们之间有一定的空间。要进行此设置,您将拥有以下约束:
A:
1:1与A的比率
导致超级视图
宽度和高度> = 25
B:
A的宽度和高度相等
通往A:50
C:
A的宽度和高度相等
通向B:50
追踪到超级视图
现在假设可用宽度足够小,以便没有足够的水平空间,以确保按钮是一个完美的正方形,每个按钮之间有50个。而不是打破宽高比和宽度约束,而是希望减少按钮之间的空间量。我的问题是,你是怎么做到的?
我认为我只是将领先约束的关系改为小于或等于,但这会导致不等式约束歧义与这两个约束。我想也许我需要为leading指定一个最小值,所以我添加了另外两个设置为大于或等于10的前导约束。这并没有解决歧义。然后我添加了另一组前导约束,这个时间等于两个值之间的设定值,然后我降低了那些的优先级。这解决了模糊性,但是按钮之间的空间永远不会减少 - 它始终是我为约束设置的值,尽管它的优先级降低了。
为了获得这个,需要设置哪些约束?
答案 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
。