Размер UIView, чтобы дискретные значения, используя AutoLayout

Короткая версия выглядит так: мне нужно, чтобы у моего UIView была ширина 50, если места достаточно, или 0, если его нет. Как я могу это сделать?


Теперь для длинной версии:

У меня есть UIView со значком, за которым следует метка, в идеале вид всегда будет выглядеть |-icon-label-|

Однако иногда этикетка слишком длинная и что-то должно дать. Вместо того, чтобы изменять размер / обрезать текст или изменять размер значка, мне нужно, чтобы значок полностью исчез (например, установив его размер на ноль).

Я надеялся, что смогу достичь этого путем:

  1. Установка сопротивления горизонтальной компрессии для иконки на значение ниже стандартного (скажем, 700 вместо)
  2. Установка необязательного высокого приоритета для ограничения ширины иконки (скажем, ширина =50, приоритет =900)
  3. Установка более низкого приоритета для ограничения ширины иконки (ширина =0, приоритет =800)

С этой настройкой я надеялся, что ограничение #2 сломается, когда метка станет длиннее, и что ограничение #3 будет использовано как подходящий запасной вариант. Однако, по-видимому, это не так, как работает autolayout: представление значков просто изменяется (уменьшается), но не исчезает полностью. Другими словами. ограничение № 3 просто игнорируется.

Должен быть разумный способ сделать это? Что мне не хватает?

1 ответ

Решение

Короче говоря: вам придется программно изменить ширину для автоматического размещения на основе ширины метки.

Немного длиннее версия:

Установить только одно ограничение на iconШирина и сохранить ссылку на него:

let iconWidthConstraint = icon.widthAnchor.constraint(equalToConstant: 50)
iconWidthConstraint.isActive = true

И затем, когда вы извлекаете текст и устанавливаете его на метку, вы должны будете определить, icon должен быть скрыт, и если да, просто измените его константу на ноль. Так что-то вроде:

label.text = yourText
if label.intrinsicContentSize.width + 50 < containerView.bounds.width {
    iconWidthConstraint.constant = 50
} else {
    iconWidthConstraint.constant = 0
}

Здесь я предполагаю, что containerView это супервизор label а также iconи что это уже было учтено в иерархии и выложено (на данный момент мы должны знать, containerView.bounds).

Другие вопросы по тегам