Основная настройка такова: у меня есть UITableView с двумя прото-ячейками, с которыми я работаю (подумайте о приложении для обмена сообщениями, где один тип ячейки показывает сообщения, которые вы отправляете, и другие, сообщения, которые вы получаете). Теперь, очевидно, длина сообщения может варьироваться от одной строки до еще 100 строк, поэтому мне нужны переменные высоты ячеек.iOS UITableView не может вычислить правильную высоту ячейки для каждой ячейки
Первая попытка:
tableView.estimatedRowHeight = 75
tableView.rowHeight = UITableViewAutomaticDimension
Я использовал estimatedRowHeight
в моем viewDidLoad()
. Это прекрасно работает и очень хорошо вычисляет высоты ячеек. Но поскольку это приложение для обмена сообщениями, мне нужно прокрутить таблицуView до конца на viewDidLoad()
и всякий раз, когда новое сообщение будет отправлено/отправлено. Но estimatedRowHeight
беспорядок с прокруткой tableView
донизу. Некоторые говорят, что это ошибка, некоторые говорят, что этого можно ожидать. Тем не менее, этот способ не будет работать для меня вообще.
Вторая попытка:
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
Я думал, чтобы вычислить высоту вручную так:
let measuerWidth = UIScreen.mainScreen().bounds
var w = measuerWidth.size.width // this is so that we can limit label width to screen width so the text is forced to go to multiple lines
// I probably should use my custom cell width here, but if I try to `dequeue` that cell it's frame contents are always `zero`. Is that a problem?
let lbl = UILabel(frame: CGRect.zeroRect)
lbl.text = chatMessages[indexPath.row][ChatRoomKeys.MESSAGE_TEXT] as? String
lbl.font = UIFont.systemFontOfSize(20)
lbl.numberOfLines = 0
lbl.lineBreakMode = NSLineBreakMode.ByWordWrapping
lbl.frame = CGRectMake(0, 0, w, 0)
lbl.sizeToFit()
return lbl.frame.height + 20
Этот способ работает почти идеально, однако на высоте клетки раз не то, что он должен быть. Значение иногда, если текст - одна строка плюс одно слово, одно слово не будет отображаться, потому что высота ячейки была только для одной строки.
Есть ли лучший способ рассчитать высоту ячейки?
UPDATE: Вот скриншот любопытное, что происходит
как вы можете видеть на этикетке заканчивается x
, но оригинальный текст увеличивается до y
.
UPDATE 2:
Это прото-клетки, которые я использую, нижняя клетка просто зеркало верхней.
Для попытки 1, что, если вы добавите «нижнюю часть вставки», чтобы прокрутить ее до конца? Кроме того, попытка 1 работает только в iOS8, поэтому, если вам нужен iOS7, вам нужен другой способ (не могу сказать, является ли Tryempt2 хорошей идеей, но это похоже на хороший старт) – Gasim
Хорошо, если он не будет работать под iOS 8, тогда нет в этом направлении. Однако это хороший подход. – someguy234
Ключ вычисляет 'CGRectMake (0, 0, w, 0)' width = 'w'. Я должен был вручную совать в инспекторе, чтобы выяснить, насколько ширина текстовой метки фактически занимает внутри ячейки. И 'w = (TABLE_WIDTH - (CELL_WIDTH - LABEL_WIDTH)' – someguy234