2012-02-10 2 views
3

Я использую пользовательские ячейки в TableView.Пользовательская ячейка с переменной высотой

Высота ячейки вычисляется на основе NSString, загружаемой в UILabel ячейки. Размер вычисляется с использованием этой функции

(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; 
{ 
NSString *text = [self getTableViewRow:tableView index:indexPath]; 

CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f); 

CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap]; 

CGFloat height = MAX(size.height, 44.0f); 

return height + (CELL_CONTENT_MARGIN * 2) + 60; 

}

Размер рассчитывается правильно, но когда ячейка загружается в UITableView, строка имеет правильную высоту, но клетка не имеет.

Здесь я создаю мою клетку

//Com Custom Cell 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
static NSString *simpleTableIdentifier = @"CustomCellIdentifier"; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; 

if (cell == nil) 
{ 
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCellApresentacao" owner:self options:nil]; 

    if ([nib count] > 0) 
     cell = self.tvCell;  
    else 
     NSLog(@"Falhou a carregar o xib"); 
}  

NSInteger row = [indexPath row]; 

if(self.myTableView1 == tableView) 
    labelDescricaoApresentacao.text = [listData1 objectAtIndex:row]; 
else if (self.myTableView2 == tableView) 
    labelDescricaoApresentacao.text = [listData2 objectAtIndex:row]; 
else 
    labelDescricaoApresentacao.text = [listData3 objectAtIndex:row]; 

return cell; 
} 

я пытался изменить высоту ячейки в этом методе с использованием

cell.frame.size.height 

, но он по-прежнему didn't загружен правильный heigth.

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

ответ

4

Где вы установили cell.frame.size.height? Я рекомендовал бы пытаться поставить его здесь:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 
    cell.frame = CGRectMake(0,0,320.0f,30.0f); 
} 

Этот метод вызывается прямо перед отображением ячейки и является хорошим местом, чтобы делать какие-либо визуальные изменения в клетке.

+0

Если я поставил cell.frame.size.height = 30.0f, например, он дает ошибку «выражение не назначается» – bruno

+1

cell.frame = CGRectMake (0,0, ширина, высота) – NeverBe

+0

ах да, конечно , спасибо за исправление – picciano

0

Несмотря на то, что вы правильно устанавливаете высоту своей строки в heightForRowAtIndexPath, содержимое вашей ячейки всегда будет иметь фиксированную высоту, потому что вы загружаете свою ячейку из наконечника. Чтобы динамическое изменение высоты ячейки изменилось, вам необходимо будет создать свою ячейку и ее подпрограммы программно в cellForRowAtIndexPath, используя тот же расчет высоты, который вы используете в heightForRowAtIndexPath:

+0

Это было другое решение, которое я собирался попробовать ... – bruno

0

Я предполагаю, что вы не обрабатываете изменение размера ячейки должным образом.

Я не уверен, когда установлен фрейм ячейки, но я предполагаю, что он установлен ПОСЛЕ того, как вы вернете ячейку из вашего tableView: cellForRowAtIndexPath: метод, это означает, что ячейка создана или повторно использована, а THEN - это кадр установлен.

Что вы должны сделать, это переопределить метод setFrame: и после вызова super, модифицируя его подвидные кадры, чтобы они соответствовали новому размеру.

Вы также можете использовать авторезистирующие маски в своих подзонах в Interface Builder, чтобы они автоматически адаптировались к новому кадру.

2

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

Решение от picciano не работает в моем приложении.

Я использовал эту функцию делегата вместо этого, и она работает:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexpath{ 
     CGFloat *theCellHeight=xxx; 
     //determine here which section/row it is, and the desired height for it, put it in "theCellHeight" 
     return theCellHeight; 
} 

Надеется, что это помогло вам,

Примечания: Тем не менее, кажется, что нет никакого способа, чтобы получить ячейки содержания/ссылку, потому что cellAtIndexPath зависает приложение при вызове внутри этой функции. Таким образом, вы должны программно создать свою таблицу в массиве, а затем создать ее, чтобы она стала менее полезной.

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