Я столкнулся с досадной ситуацией. Я нашел похожие вопросы, но ответы не помогли мне, поэтому я надеялся получить совет.
У меня есть пользовательский 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 тренажер). Что вызывает изменение ширины кадра ячейки от первоначального макета до повторного использования ячейки?