Есть ли лучший способ определить правильный размер для UITableViewCell?

У меня есть ячейка UITableView, размер которой будет изменяться в зависимости от содержимого (возможно, несколько строк текста).

Поскольку выясняется, что heightForRowAtIndexPath вызывается до, я размещаю ячейку, я просто угадываю правильную высоту, вызывая [NSString sizeWithFont] в моей текстовой строке. Есть ли лучший способ установить высоту после, когда я разместил текст в ячейке и точно знаю, какого размера он должен быть?


person drewh    schedule 07.11.2008    source источник


Ответы (3)


Это будет звучать глупо, но ... эээ ... "расположите ячейку перед выходом из heightForRowAtIndexPath";)

А если серьезно - операционная система вызывает это только в том случае, если это будет необходимо (например: она собирается создать ячейку и отобразить ее на экране), поэтому ее размещение и подготовка к отображению не являются потраченными впустую усилиями.

Обратите внимание: с точки зрения логики вам не нужно разрабатывать макет отдельно. Просто позвоните в свою [самоподготовкуLayoutForCellAtIndex: index] в подпрограмме heightForRowAtIndexPath.

Если данные статические, вы можете создать таблицу высот и кэшировать информацию.

if (0 == heightTable[index]) {
    heightTable[index] = [self prepLayoutForCellAtIndex:index];
}
return (heightTable[index]);

Черт возьми, даже если данные изменяются, вы можете либо пересчитать значение таблицы в методе, который изменяет данные, либо сбросить до 0, чтобы оно было пересчитано в следующий раз, когда это понадобится.

person Olie    schedule 07.11.2008

Обычно я использую следующее:

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath: (NSIndexPath *) indexPath {
UITableViewCell *cell = [self tableView: tableView cellForRowAtIndexPath: indexPath];
return cell.bounds.size.height;

}

Обратите внимание, что я использую это для таблиц, где я заранее кэширую кучу строк, а не для тех, у которых много ячеек. Однако для таких вещей, как таблицы настроек, где всего несколько строк, но, скорее всего, очень разного размера, он работает хорошо. Для больших столов я делаю что-то вроде того, что предложила Оли.

person Ben Gottlieb    schedule 07.11.2008

Если вы посмотрите на SMS.app в качестве примера, Apple сохраняет высоту строки ячейки в базе данных sqlite SMS.app.

person catlan    schedule 07.11.2008