UILabel не переносится при начальной загрузке в TableViewCell

Я создаю приложение на основе чата, которое использует UITableView для хранения всех сообщений в беседе. Чтобы создать пузырь чата, у меня есть представление-оболочка (wrapView), которое ограничено верхней, нижней, правой и левой частью TableViewCell. В качестве подвида у меня есть UILabel, который содержит отправленное сообщение. Я использовал preferredMaxLayoutWidth для UILabel, чтобы текст внутри метки не выходил за пределы родительского представления. Количество строк для UILabel также установлено равным 0. Я установил следующие параметры в функции cellForRowAtIndexPath:

// Get the cell
let cell = tableView.dequeueReusableCellWithIdentifier("LeftBubbleText") as! LeftTextTableViewCell

// Set the message
cell.messageLabel.text = message

// Set the message label's max width
cell.messageLabel.preferredMaxLayoutWidth = cell.wrapView.frame.width - 16

Когда разговор загружается впервые, текст внутри UILabel не переносится должным образом. Он усекается в конце представления оболочки. Но когда ячейка прокручивается за пределы экрана, а затем снова появляется, текст прекрасно оборачивается после повторного использования ячейки.

Как я могу убедиться, что текст внутри UILabel правильно обернут при начальной загрузке, а не только при повторном использовании ячейки?


person Mike Walker    schedule 24.04.2015    source источник


Ответы (1)


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

Вы должны использовать dequeueReusableCellWithIdentifier:forIndexPath для удаления ваших ячеек из очереди

person Rory McKinnel    schedule 24.04.2015
comment
Большое спасибо за помощь. Я не понимал, что использование deqeueReusableCellWithIdentifier приводит к тому, что класс размера не связан с ячейкой. Я также добавил cell.wrapView.frame = CGRect(x: cell.wrapView.frame.origin.x, y: cell.wrapView.frame.origin.y, width: enoteThreadTableView.frame.width - 96, height: 36) сразу после вызова удаления из очереди, что решило мою первоначальную проблему. Поскольку представление оболочки ограничено как левой (50), так и правой (46) ячейкой, это сделало размер представления правильным при первой загрузке. - person Mike Walker; 25.04.2015