Как использовать динамическую c высоту UITableViewCell в автоматическом макете и перемещать другие виды вверх, когда вид снизу скрыт? - PullRequest
4 голосов
/ 18 января 2020

У меня есть UITableViewCell в xib и его выходы в соответствующем подклассе UITableViewCell. Я возвращаю высоту ячейки от

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) ->CGFloat {

return 400

}

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

Вот как я скрываю вид ячейки.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    .....
    cell.opetion4.isHidden = true
    cell.opetion3.isHidden = true

}

Это моя ячейка.

enter image description here

После скрытия 2 средних меток это выглядит следующим образом.

enter image description here

Но я хочу удалить это пустое место и хочу сместить нижнюю метку вверх следующим образом .

enter image description here

Ответы [ 3 ]

2 голосов
/ 18 января 2020

Сначала установите высоту от UITableViewCell до UITableView.automaticDimension

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return UITableView.automaticDimension
}

Вставьте все свои метки вопроса в UIStackView (по вертикали), исключая bottomLabel. Установите AutoLayoutConstraint между UIStackView и bottomLabel.

enter image description here

Установите для свойства numberOfLines UILabel s значение 0 (ноль).

enter image description here

Установите Распределение UIStackView как Fill

enter image description here

Затем в вашем методе tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell скрыть метки. И он будет автоматически обрабатывать пробелы между UILabel s

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath) as! MyCell

    cell.questionLabel1.text = labelOneText[indexPath.row]
    cell.questionLabel2.text = labelTwoText[indexPath.row]
    cell.questionLabel3.text = labelThreeText[indexPath.row]

    if labelOneText[indexPath.row] == "" {
        cell.questionLabel1.isHidden = true
    }

    if labelTwoText[indexPath.row] == "" {
        cell.questionLabel2.isHidden = true
    }

    if labelThreeText[indexPath.row] == "" {
        cell.questionLabel3.isHidden = true
    }

    return cell
}

Окончательный результат:

enter image description here

1 голос
/ 18 января 2020
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) ->CGFloat {

return UITableView.automaticDimension

}

сейчас в ячейке, поместите все ваши взгляды и сестер, которые вы хотите скрыть / показать в UIstackview (horizontal). теперь, если вы скрываете один вид, он будет скрыт, и его быстродействие также будет скрыто, чтобы не было пробелов, и не нужно было обрабатывать дополнительные ограничения. все это будет обработано stackview.

1 голос
/ 18 января 2020

Сначала я предлагаю вам установить UITableViewCell Высота на automatic dimensions. Прикрепите всех детей друг к другу, а последнего ребенка к uiview из сиб. Теперь скрывающий вид не регулирует размер ячейки, поэтому вам нужно играть с ограничением по высоте uiview, которое вы скрываете.

Сделайте ограничение высоты таким же сильным в IBOutlet, иначе оно достигнет sh, так как ячейки используются повторно, а constraint после однократной установки станет nil. Вы должны убедиться, что ограничение высоты изменяется в соответствии с требованием ячейки дисплея, это означает, что для каждого cell сохраняются некоторые datasource, которые решают показывать или скрывать представление каждый раз, когда вызывается метод cellforrowatIndexpath.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...