Настройка разных макетов для одной ячейки в зависимости от ее содержимого - PullRequest
0 голосов
/ 26 мая 2020

В UITableViewCell у меня есть контейнер UIView, который содержит UIImageView вверху и UILabel внизу. Когда UILabel не содержит текста, я хочу удалить UILabel и изменить размер UImageView до нижней части моего контейнера UIView.

В моем TableViewCell у меня есть это:

        let x = imageViewPostPreview.bottomAnchor.constraint(equalTo: viewPreviewOverlay.topAnchor, constant: 0)

        if postText == "" {
            x.isActive = true
            imageViewPostPreview.layer.maskedCorners = [.layerMaxXMinYCorner, .layerMinXMinYCorner, .layerMaxXMaxYCorner, .layerMinXMaxYCorner]
            self.layoutSubviews()
            self.layoutIfNeeded()

        } else if postText != "" {
            x.isActive = false
            imageViewPostPreview.layer.maskedCorners = [.layerMaxXMinYCorner, .layerMinXMinYCorner]
            self.layoutSubviews()
            self.layoutIfNeeded()
            }
        }

Это фрагмент кода работает, когда загружается исходный UITableViewCell, но когда я прокручиваю свой UITableView, ячейка теряет исходный макет.

Как мне правильно настроить макет, чтобы макет оставался при прокрутке?

Изменить:

Исходная ячейка, которая верна:

enter image description here

После прокрутки неправильный макет:

enter image description here

Ответы [ 2 ]

0 голосов
/ 26 мая 2020

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

После этого вы установите tableView.rowHeight = UITableView.automaticDimension. Или вы также можете установить в методе делегата.

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

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "identifier", for: indexPath)
    let model = self.models[indexPath.row]
    cell.imageViewPostPreview.image = model.image ?? nil
    cell.postText.text = model.text ?? nil
    return cell
    }

Это должно работать без дальнейшей необходимости вычислять ограничения и вызывать макеты для обновления. Надеюсь это поможет! Вы также можете проверить это вопрос .

0 голосов
/ 26 мая 2020

Добавьте это в метод prepareToReuse

 override func prepareForReuse() {
    super.prepareForReuse()


  let x = imageViewPostPreview.bottomAnchor.constraint(equalTo: viewPreviewOverlay.topAnchor, constant: 0)

    if postText.isEmpty {
      x.isActive = true
      imageViewPostPreview.layer.maskedCorners = [.layerMaxXMinYCorner, .layerMinXMinYCorner, .layerMaxXMaxYCorner, .layerMinXMaxYCorner]


  } else  {
      x.isActive = false
      imageViewPostPreview.layer.maskedCorners = [.layerMaxXMinYCorner, .layerMinXMinYCorner]

      }

   self.layoutIfNeeded()
  }

Примечание: не вызывайте layoutSubview напрямую ... всегда пытайтесь вызвать layoutifNeeded или setNeeedsLayout

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