Как я могу расположить два UILabels так, чтобы один автоматически изменялся, а другой занимал оставшееся место?

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

Опция «Упорядочить > Заполнить контейнер по вертикали» в Инспекторе размеров аналогична тому, что мне нужно для левой метки, но я хочу, чтобы она занимала только пространство, не нужное правой метке.

Пример

Если я добавлю ограничение к конечному пробелу на левой метке (см. третье ограничение ниже), результат будет почти таким, как мне нужно, но вместо того, чтобы правая метка давала необходимое пространство, левая метка занимает необходимое пространство (см. финальное изображение).

Ограничения

Пример 2


person Nathan Van Dyken    schedule 05.04.2018    source источник
comment
Вы можете сделать это программно, сначала добавив правую метку с замыкающим якорем и без (или с максимальной) привязкой ширины (используйте sizeToFit, чтобы содержимое метки стало ее внутренней шириной), а затем вычислив ее ширину в layoutSubviews и используя эту ширину как (отрицательную ) константа для привязки ширины левой метки. При программном подходе вы можете лучше учитывать крайние случаи, связанные с шириной метки и изменением положения. Это в основном то, что API сжатия и объятий делает за кулисами, но я предпочитаю управлять этим вручную, потому что никаких сюрпризов не будет.   -  person liquid    schedule 05.04.2018


Ответы (2)


Я думаю, это проще, чем вы могли ожидать...

Ограничьте «LeftLabel» в начале, ограничьте «RightLabel» в конце, ограничьте горизонтальное расстояние между ними до >= 8, а затем назначьте «LeftLabel» приоритет сопротивления сжатию содержимого Low (250).

Это говорит автоматическому макету расширять каждую метку на основе ее текстового содержимого, но если расстояние между ними оказывается меньше 8, пусть «RightLabel» расширяется до своего текста, но расширяет «LeftLabel» только до точки, в которой он 8 баллов от "RightLabel".

введите здесь описание изображения

Выбрана левая метка:

введите здесь описание изображения

Результаты:

введите здесь описание изображения

person DonMag    schedule 05.04.2018

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

|-[leftLabel]-[rightLabel]-|

Если текст в правой метке слишком длинный, это может привести к тому, что ширина левой метки станет равной 0. Установите ограничение ширины левой метки с помощью >= ширины, чтобы решить проблему.

person Sean Kladek    schedule 05.04.2018