Размер UIView, чтобы дискретные значения, используя AutoLayout
Короткая версия выглядит так: мне нужно, чтобы у моего UIView была ширина 50, если места достаточно, или 0, если его нет. Как я могу это сделать?
Теперь для длинной версии:
У меня есть UIView со значком, за которым следует метка, в идеале вид всегда будет выглядеть |-icon-label-|
Однако иногда этикетка слишком длинная и что-то должно дать. Вместо того, чтобы изменять размер / обрезать текст или изменять размер значка, мне нужно, чтобы значок полностью исчез (например, установив его размер на ноль).
Я надеялся, что смогу достичь этого путем:
- Установка сопротивления горизонтальной компрессии для иконки на значение ниже стандартного (скажем, 700 вместо)
- Установка необязательного высокого приоритета для ограничения ширины иконки (скажем, ширина =50, приоритет =900)
- Установка более низкого приоритета для ограничения ширины иконки (ширина =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
).