2016-11-29 4 views
0

У меня есть функция, когда пользователь нажимает на ячейку, ячейка расширяется, чтобы отображать больше меток. Высота пересчитывается во время расширения и основывается на размере моей самой первой метки или второй метки на ячейке в зависимости от того, что больше.Choppy label on UITableViewCell

Ниже мой код для вычисления высоты:

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

    if ([self.expandedCells containsObject:indexPath]) { 
     // Calculate the cell height based on the address details or branch name which ever is greater. 
     UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:17.0]; 
     BranchDetails *branchDetail = ((BranchDetails *)[self.branchDetails objectAtIndex:[indexPath row]]); 

     NSString *addressText = branchDetail.addressDetails; 
     CGSize addressLabelSize = [addressText boundingRectWithSize:CGSizeMake(tableView.frame.size.width, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:cellFont} context:nil].size; 

     NSString *branchNameText = branchDetail.branchName; 
     CGSize branchLabelSize = [branchNameText boundingRectWithSize:CGSizeMake(tableView.frame.size.width, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:cellFont} context:nil].size; 

     labelSize = (addressLabelSize.height > branchLabelSize.height) ? addressLabelSize : branchLabelSize; 
    } 
    else { 
     NSString *cellText = [self.branchList objectAtIndex:[indexPath row]]; 
     UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:17.0]; 

     labelSize = [cellText boundingRectWithSize:CGSizeMake(tableView.frame.size.width, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:cellFont} context:nil].size; 
    } 

    CGFloat cellHeight = labelSize.height + 20; 
    return [self.expandedCells containsObject:indexPath] ? cellHeight * 4 : cellHeight; 
} 

Choppy метка ячейки изображения: enter image description here

Я попытался добавить вид прокрутки при создании ячейки в cellForRowAtIndexPath поэтому пользователь может видеть все детали в ячейке. Код для прокрутки:

UIScrollView *scrollView=[[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, 320, 100)];    
[cell.contentView addSubview:scrollView]; 

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

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

+0

Вместо того, чтобы вычислять высоту, почему бы вам не использовать UIAutomaticDimensions для расширенной ячейки? Я предполагаю, что при нажатии на ячейку вы вставляете другую ячейку. – Rikh

ответ

0

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

Что-то вроде этого:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CGFloat rowHeight = 0; 

    if ([self.expandedCells containsObject:indexPath]) { 

    CGFloat totalHeight = 0; 

    YourCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 

    for(UIView *v in [cell.contentView subviews]) { 
     if([v isKindOfClass:[UILabel class]]) { 
     UILabel *lbl = (UILabel*)v; 
     totalHeight += lbl.frame.size.height; 
     } 
    } 
    rowHeight = totalHeight; 
    } 
    else { 
     rowHeight = 25; // a fixed height for unexpanded rows 
    } 

    return rowHeight; 
} 

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

+0

Я думал об этом как о опции, но пытался избежать повторения всех ярлыков для каждой ячейки, поскольку у меня могло быть большое количество ячеек в моем представлении таблицы. Это по-прежнему вариант, но для меня это будет окончательным вариантом. Спасибо @GeneCode! :) –

+0

Вы можете ограничить, на какую метку вы хотите получить высоту, используя номер тега. Например, вы можете установить связанные метки в tag = 1, а затем вы выполните if (lbl.tag == 1) totalHeight + = lbl.frame.size.height; – GeneCode