Constraints (констрейнты) для label с изменяющимся количеством строк


#1

Схема 1:

1Label жестко привязан по левому краю и верху, 2Label выровнен относительно 1Label и привязан к нему по высоте, 3Label выравнен по верху относительно 1Label и расстоянием до него, 4Label привязан по левому краю к 1Label и по верху к 3Label, 5Label привязан по левому краю к 1Label и по верху к 4Label. 3Label и 4Label получают содержимое текста из бэкэнда и соответственно меняют свои размеры (высоту) в зависимости от наполненности текстом. Все остальные Label размеры не меняют.
Задача состоит в том, когда содержимое 3Label и 4Label не достаточно большое и они находятся выше 2Label (схема 1), то таблица привязывалась по высоте к 2Label скажем на 10 поинтов.

Схема 2:

Когда же содержимое 3Label и 4Label большое и они уходят ниже 2Label (схема 2), то таблица привязывалась по высоте к 5Label на те же 10 поинтов. То есть по сути нужно 2 условия по констрейнтам для таблицы в зависимости от того какой из двух лейблов находится ниже, если ниже 2Label, то к нему, если 5Label ниже, то к нему.


Как сделать чтобы при изменении текста в UILabel изменялся размер и UIView и UILabel?
#2

А если для 2Label и 5Label выставить нижние констрейнты >= от минимального расстояния?


#3

.sizeToFit() применяете к лейблам какие хотите растягивать; констрейтами закрепляете только границы, т.е. например, привязываете верхний и нижний край куда надо, высоту не трогаете. Есстественно колличество строк либо 0, либо сколько надо - всё должно работать.


#4

Так уже пробовал, не работает


#5

К какому лейблу тогда привязать таблицу?


#6

Значит что-то неправильно привязали констрейтами - например таблицу зафиксировали. У меня всё работает: лейблы стоят внизу таблицы и автоматом растягивают вью, при увеличении строк.


#7

видимо к тому, который с большей вероятностью окажется ближе к таблице.

Попробуйте для начала убрать все ограничения. Для растягивающихся лейблов добавить всего 2: привязать верх 1 и 3 к границе вью, низ к к верху 2 и 4 соотвественно. И забить 1 и 3 многострочным текстом. Посмотреть, что происходит. Далее к слеюдующим лейблам назначить такие же ограничения - так и найдёте, где что не двигается )


#8

Пробуйте еще раз, только сперва все свои лейблы оберните во View контейнер, если еще не обернут.
После заполнения всех лейблов, вызовите у контейнера layoutIfNeeded().


#9

Спасибо. Попробую оба варианта


#10

@RexHunt как корректно выставить констрейнты у контейнера, в который я все лейблы обернул? Ведь если выставить констрейнты по вертикали или задать высоту, то контейнер не будет растягиваться


#11

все по 0, высоту не ставить.


#12

@RexHunt То есть, я все лейблы оборачиваю во view, внутри этого view расставляю все констрейнты для лейблов, view ограничиваю относительно Superview по 0 на все 4 стороны, а таблицу привязываю верхним кострейнтом к view с лейблами, связываю view с лейблами со соответствующим файлом и записываю в viewDidLoad функцию viewLabel.layoutIfNeeded()?


#13

Все верно, только не забудьте поставить нижние констрейнты для 2Label и 5Label >=.
А viewLabel.layoutIfNeeded() вызывать будете сразу после установки текста в лейблы, когда они растянутся.


#14

@RexHunt Вроде простая вещь, но не идет.
Еще раз. Если я нижний констрейнт у viewLabel ставлю 0 относительно Superview, то он растягивается на всю область экрана и не дает показаться tableView, даже если я ставлю viewLabel.layoutIfNeeded() после получения данных для 3Label и 4Label