Обновления ограничения UITableViewCell происходят только после прокрутки - PullRequest
1 голос
/ 28 марта 2019

Я столкнулся с досадной ситуацией. Я нашел похожие вопросы, но ответы не помогли мне, поэтому я надеялся получить совет.

У меня есть пользовательский UITableViewCell, где я использую файл .xib. Я получаю некоторые данные, когда приложение загружается, и как только оно получено, я перезагружаю свой tableView. В ячейках отображается изображение и некоторые метки, и мне нужно, чтобы метки настраивали их размер в зависимости от ширины текста для содержимого в отдельной ячейке. Скажи, что у меня есть это для cellForRowAt indexPath:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    guard
        let cell = tableView.dequeueReusableCell(withIdentifier: MyCell.reuseIdentifier, for: indexPath) as? MyCell,
        indexPath.row < myDataArray.count
    else { return UITableViewCell() }

    let dataForCell = myDataArray[indexPath.row]
    cell.configure(with: dataForCell)
    cell.layoutIfNeeded()
    return cell
}

Теперь в моем файле MyCell.swift внутри метода configure(with:) я устанавливаю тексты меток, затем я также вызываю закрытый метод с именем setWidths(), который использует расширение, добавленное в UILabel, чтобы вернуть мне ширину метки после того, как текст установлен - я делаю некоторые основные вычисления, чтобы настроить ограничения меток, как я хочу.

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

Я знаю, что раньше сталкивался с подобными проблемами, но обычно вызов layoutIfNeeded() в ячейке устраняет проблему. Это не время.

Я знаю, что это связано с идеей повторного использования ячеек и выгрузки из них, но почему первая группа ячеек размещена не по тем же правилам? Это первые ячейки, которые видит пользователь, мне нужно, чтобы они были правильными!

У кого-нибудь есть советы для меня?

EDIT

Я думаю, что нацелился на проблему, однако я все еще не знаю, что делать. Я должен отрегулировать мою рассчитанную ширину метки в зависимости от того, с какой ячейкой ячеек. Я добавил несколько операторов печати, чтобы увидеть, меняется ли ширина ячейки, и это так. Внутри метода setWidths() я добавил print(self.frame.width) и при первой загрузке tableView он печатает 325.0 для каждой ячейки, но затем, когда я прокручиваю и выкладываю новые ячейки, он меняется на 414.0 (с использованием iPhone 8 Plus тренажер). Что вызывает изменение ширины кадра ячейки от первоначального макета до повторного использования ячейки?

1 Ответ

2 голосов
/ 28 марта 2019

Проблема здесь в том, что вы вычисляете свои размеры, когда ячейка еще не визуализируется, обновите свой метод configure, чтобы он брал ширину просмотра таблицы, например, cell.configure(with: DataForCell, width: tableview.frame.width), после этого используйте эту ширину для настройки ваших размеров и выясните, почемуоно меняется с 375 на 414, ответ таков: вы получаете ширину обычного iphone, когда представление отображается, оно меняется на плюс размер.

...