Уменьшите количество пространства между элементами, когда пространство ограничено

Представьте себе случай, когда у вас есть три кнопки рядом. Вы хотите, чтобы три кнопки заполнили доступную ширину и были идеальными квадратами с установленным минимальным размером и заданным расстоянием между ними. Чтобы настроить это, у вас должны быть следующие ограничения:

A:
Соотношение 1:1 к A
Ведущий к супервизору
Ширина и высота >= 25

B:
Равная ширина и высота A
Ведущий к A: 50

C:
Равная ширина и высота A
Ведущий к B: 50
Замыкающий до суперпредставления

Теперь представьте, что доступная ширина достаточно мала, так что не хватает горизонтального пространства, чтобы гарантировать, что кнопки представляют собой идеальный квадрат с 50 между каждой из них. Вместо того, чтобы нарушать соотношение сторон и ограничение ширины, вы хотели бы уменьшить расстояние между кнопками. Мой вопрос в том, как вы это делаете?

Я думал, что просто изменю отношение ведущих ограничений, чтобы оно было меньше или равно, но это приводит к неоднозначности ограничения неравенства с этими двумя ограничениями. Я подумал, что, возможно, мне нужно указать минимальное значение для интерлиньяжа, поэтому я добавил еще два ограничения интерлиньяжа, установленные на значение больше или равное 10. Это не устранило двусмысленность. Затем я добавил еще один набор ведущих ограничений, на этот раз равный установленному значению, которое находится между двумя значениями, затем я уменьшил их приоритет. Это разрешило двусмысленность, однако расстояние между кнопками никогда не уменьшается — это всегда значение, которое я установил для ограничения с ограничением equals, несмотря на его пониженный приоритет.

Какие ограничения необходимо установить для этого?

  • Три кнопки отображаются рядом в одном горизонтальном пространстве.
  • Все три кнопки идеальные квадраты
  • Минимальный размер кнопок (25x25)
  • Установленное количество пространства между ними - 50
  • Когда горизонтальное пространство слишком мало для обеспечения соблюдения всех ограничений, это должно уменьшить количество пространства между кнопками.

person Jordan H    schedule 25.05.2015    source источник


Ответы (3)


Вам нужно ограничение интервала с требуемым приоритетом, которое выражает минимально допустимый интервал. Например, >= 10 @1000.

Затем вам понадобится ограничение интервала с более низким приоритетом, которое выражает желаемый интервал равенством, например == 50 @200.

Однако у вас есть два межкнопочных пространства. Неопределенность возникает из-за того, что автоматическая компоновка не знает, что уменьшить, когда недостаточно места, чтобы сделать оба нужных расстояния.

Вы можете установить разные приоритеты, чтобы устранить неоднозначность, но тогда один интервал рухнет, а другой останется равным 50, пока не достигнет своего минимума, после чего другой тоже уменьшится.

Я подозреваю, что вы хотите, чтобы оба пространства всегда были равны. Нет прямого способа сделать это только с ограничениями. Вместо этого вам нужно использовать скрытые разделители. Итак, вы бы сделали что-то вроде:

|-[buttonA][spacer1(>=10,==50@200)][buttonB(==buttonA)][spacer2(==spacer1)][buttonC(==buttonA)]-|
person Ken Thomases    schedule 25.05.2015

Попробуйте сделать режим контента для каждой кнопки UIViewContentModeScaleAspectFit или как там его называет IB. Затем контролируйте пространство между ними, используя ширину вместо leading. Я предполагаю, что нажатие пробела между ними вызовет цель кнопки, поэтому в этом случае используйте три обычных UIView таким образом, а затем добавьте кнопки в качестве их подвидов.

person Elliot Alderson    schedule 25.05.2015

В конце концов я решил избегать просмотров разделителей и разработал решение для достижения конечного результата. Вместо того, чтобы настраивать его так, чтобы автоматическая компоновка вычисляла вычисления и автоматически уменьшала расстояние между кнопками, я решил программно установить constant этих ограничений на основе ширины представления. Таким образом, расстояние между кнопками было большим для большой ширины и маленьким для маленькой ширины.

Чтобы добиться этого, я просто установил выходную коллекцию для горизонтальных ограничений, затем в updateViewConstraints я зациклился на ограничениях и установил constant равным self.view.frame.size.width / 12.

person Jordan H    schedule 25.05.2015