2013-04-22 3 views
-1

Я пытаюсь рассчитать динамическую высоту ячейки в моем UITableView.Динамическая высота UITableViewCell для сложных ячеек

Мои ячейки очень сложны: это может быть дюжина ярлыков, uitextfield, кнопок и т. Д. На самом деле это как форма в ячейке (с UITableViewGroupedStyle, она действительно выглядит как форма!). Так что мне неважно, «sizeWithFont: withConstrainedSize: etc ...»

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

Теперь в моем UITableViewController я хочу установить правильную высоту для своих ячеек. Для этого мне нужно позвонить getHeight в мою камеру. Но ... Если я назову «cellForRowAtIndexPath» в моей «heightForRowAtIndexPath», он будет цитировать (потому что cellForRow ... требуется heightForRow .... для создания ячейки).

Я также попытался построить ячейку в моей ячейкеForRowAtIndexPath, получить ее высоту и сохранить ее в массиве, чтобы получить ее в heigtForRowAtIndexPath. Поскольку «heightForRowAtIndexPath» называется BEFORE «cellForRow ...», первый раз я возвращаю значение по умолчанию (CGFLOAT_MAX). Когда моя ячейка построена, я возвращаю ее высоту из моего массива. Но, чтобы позвонить ему во второй раз, мне нужно вызвать его вручную, поэтому, когда моя ячейка встроена в «CellForRow ...», я вызываю reloadData. Но ... (снова и снова) это все равно не работает ... На самом деле, иногда это работает (с UITableViewGroupedStyle), а иногда нет (withUITableViewPlainStyle, beacause это dosent, как значение по умолчанию CGFLOAT_MAX ...)

Это делает меня сумасшедшим!

Эта версия работает для UITableViewGroupedStyle:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    MFFormListCell *cell = [self.cellSizeMap objectForKey:indexPath]; 
    return cell; 

} 

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 

    MFFormListCell *cell = [self.cellSizeMap objectForKey:indexPath]; 
    if(!cell || ![cell isEqual:[NSNull null]]) { 
     [self.cellSizeMap setObject:[NSNull null] forKey:indexPath]; 
     cell = [tableView dequeueReusableCellWithIdentifier:@"FormListCell" forIndexPath:indexPath]; 
     [self.cellSizeMap setObject:cell forKey:indexPath]; 
    } 


    if([cell isEqual:[NSNull null]]) 
     return CGFLOAT_MAX;  //Valeur max pour que le système prennent en compte toutes les cellules à afficher 
    else 
     return [[cell getHeight] floatValue]; 


} 

Не спрашивайте о первом «если» в «heightForRowAtIndexPath:», это плохой трюк, чтобы избежать петли.

+0

показать ваш метод cellforrowatindexpath. Я хочу видеть ваш код .. –

+0

Я меняю его на много времени, поэтому его нет стабильной версии прямо сейчас. – QLag

ответ

0

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

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    return [_cellHeights objectAtIndex:indexPath.row]; 
} 
+0

Да, это именно то, что я сделал, и теперь это работает. Спасибо – QLag

Смежные вопросы