Как реализовать функционал появления других элементов в UITableViewCell

swift
xcode
ios

#1

Всем привет!

Есть UITableViewCell. В ячейке на данный момент есть UITextView и кнопка.
Высота ячейки зависит от длины UITextView.
Скажем так, этот TextView - title ячейки.
При нажатии на кнопку, необходимо, чтобы там отобразилось -

По порядку:
UILabel
TextView
UILabel
TextView
UILabel
UILabel
UIButton

Самый первый UITextView, который был до нажатия на кнопку, необходимо скрыть.

Проблема заключается в том, что здесь и высота ячейки изменится. Она станет больше раза в 2-3. Но вот и не понятно когда добавлять все те элементы

Вот как выглядит ячейка до нажатия на кнопку.
image

Вот что с ней должно произойти.

image

Соответсвенно, в каждой ячейке UITextView может иметь разный текст. От этого его размер должен меняться.
Как такое реализовать?


#2

Тут получится смесь expandable view cell и приоритета констрейнтов.
Хотя если вам не нужна плавная анимация, тогда просто будет 2 view контейнера, у которых будет меняться нижний приоритет констрейнта. В принципе это должно работать.
При клике на кнопку, меняете у двух контейнеров свойство видимости на обратное и тут же меняете им приоритет нижних констрейнтов.

P.S. появилась идея проще: в ячейке родительский контейнер будет VerticalStackView, в нем будет два view контейнера и по нажатию на кнопку просто меняете у двух контейнеров свойство видимости на обратное. Вроде как тоже рабочий вариант и немного проще.


#3

Привет! Спасибо большое за ответ!
Правильно ли я понимаю, что:

  1. Необходимо создать два view контейнера - первый (до нажатия кнопки) и второй (после нажатия)
  2. Задать приоритет нижних констреинтов, где второй контейнер имеет низкий приоритет.
  3. Первоначально поставить проперти isHidden = true на второй контейнер.
  4. При нажатии на кнопку, прятать первый контейнер, показывать второй и менять приоритет констреинта.
  5. tableView.reloadData() для применения высоты ячейки.

#4

Все верно кроме 5, reloadData() делать не нужно.


#5

Понял, благодарю! Отпишу сюда по результатам.


#6

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


#7

Но как это реализовать?
У меня есть сейчас делегат CellButtonClick. На него подписал ViewController и в методе делегата буду реализовывать выше описанное.


#8

всю логику изменения отображения вам нужно делать в самой ячейке, а через делегат лишь передавать лишь само действие и номер ячейки.
Затем уже во ViewController’e вы через делегат получаете команду, в массиве ваших данных ищете нужную модель по номеру ячейки и меняете там свойство isExpanded = !isExpanded.
Перед этим нужно будет это свойство добавить в модель и по дефолту оно будет false.
Ну и при каждом построении ячейки, вы будете проверять это свойство, что бы отобразить нужный контейнер.


#9

Понял, благодарю! Обязательно опишусь по результатам.


#10

Без tableView.reloadData() высота ячейки не меняется.


#11

Вопрос -
На какой констреинт необходимо задать приорити? На самый нижний самого контейнера, или же на самый нижний элемент в контейнере?


#12

Делайте через VerticalStackView, тогда с констрейнтами работать не нужно.


#13

Получилось с констреинтами :slight_smile: Благодарю!


#14

Если есть желание упростить, то переделайте на StackView. Будет меньше мороки с констрейнтами.


#15

Здесь мне кажется проще кодом всё создать и удалить в зависимости от состояния и изменить высоту ячейки. Даже можно не удалять, просто уменьшить высоту ячейки и всё :slight_smile:

Самое просто в лоб: создать всё, что надо, с привязкой к верху и менять высоту ячейки просто ))


#16

Не пойдет, т.к. высота ячейки всегда динамическая.
Там же сказано что высота ставится в зависимости от заполненного текста.
И вашем случае, это не простое решение в лоб :slight_smile:


#17

Почему? Пока кнопка не нажата - высота зависит от текствью, остальные элементы ниже высоты строки. Как нажали кнопку - ячейка становится нужной нам высоты - тогда войдут все нижние элементы и их будет видно. У меня так в одном месте работает - тупо, но там всего 3 маленькие строки с дополнительной инфой и комментарий.


#18

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


#19

Необязательно. Нужно всего лишь в методе высоты ячейки парсить модель на нужный параметр (у меня на наличие комментария, а тут вообще можно ключ в ЮД записать) и возвращать нужную высоту. Тут то вообще 2 состояния: нет доп.инфы и есть доп.инфа (лейблы). Ничего сложного. Те растянуть сначала ячейку на максимум и накидать элементов. Потом изменять высоту - я же написал, что это самое простое в лоб. По мне лучше кодом всё создать и привязать.


#20

вот именно, от куда она будет браться