UITableView 删除行减少表格行高

Posted

技术标签:

【中文标题】UITableView 删除行减少表格行高【英文标题】:UITableView deleting row reduced table row height 【发布时间】:2015-09-02 14:30:30 【问题描述】:

当我从我的表格视图中删除一行时,剩余的行高会减少大约 20 点/像素/无论 Apple 表格行的测量单位。当我第一次显示表格时,该行适合内容 - 我配置内容这样:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = (UITableViewCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) 
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    

    // Set up the cell...
    [self configureCell:cell atIndexPath:indexPath];

    return cell;


- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath 

    Favorite *thisFavorite = [self.arrResults objectAtIndex:[indexPath row]];

    NSMutableAttributedString* strAtttributedText;

    // Define general attributes for the entire text
    NSDictionary *attribs = @
                              NSForegroundColorAttributeName: cell.textLabel.textColor,
                              NSFontAttributeName: cell.textLabel.font
                              ;
    NSString* strCellText = [NSString stringWithFormat:@"%@\n%@\n%@", thisFavorite.favName, thisFavorite.favAddress, thisFavorite.favCity];


    //get location of first return TO DO - need to figure out how to return the range from the string above
    NSRange newLineRange = [strCellText rangeOfString: @"\n"];
    NSRange firstLineRange = NSMakeRange(0, newLineRange.location);
    NSRange restOfTextRange = NSMakeRange(newLineRange.location + 1, strCellText.length-newLineRange.location-1);

    strAtttributedText = [[NSMutableAttributedString alloc] initWithString:strCellText attributes:attribs];


    [strAtttributedText setAttributes:@NSForegroundColorAttributeName:MPL_BLUE range:firstLineRange];

    [strAtttributedText setAttributes:@NSForegroundColorAttributeName:MPL_LIGHTGRAY, NSFontAttributeName:TABLE_CELL_FONT range:restOfTextRange];

    cell.textLabel.attributedText = strAtttributedText;
    cell.textLabel.numberOfLines = 0;
    cell.textLabel.lineBreakMode = NSLineBreakByWordWrapping;


我正在以这种方式删除该行:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 

    if (editingStyle == UITableViewCellEditingStyleDelete) 

        Favorite* thisFavorite = [self.arrResults objectAtIndex:indexPath.row];

        [self.tableView beginUpdates];

        NSArray* arrIndexPaths = [NSArray arrayWithObjects:indexPath, nil];
        [self.tableView deleteRowsAtIndexPaths:arrIndexPaths withRowAnimation:UITableViewRowAnimationFade];
        [self.arrResults removeObjectAtIndex:indexPath.row];

        [self.tableView endUpdates];

        [self.myController deleteManagedObject:thisFavorite];

    

在此过程中我将在哪里管理单元格高度?

我可以从这里获取初始单元格框架(它们都是相同的内容样式 - 名称\n地址\n城市、州、zip):

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 

    self.cellSize = cell.frame;

我尝试在开始和结束编辑之间删除 self.tableview.rowHeight = self.cellSize.size.height 但它没有任何影响。

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

您应该实现此方法并为您的单元格返回一个恒定的高度(我在您发布的代码 sn-p 中没有看到它):

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

   return someConstantIntValue;

【讨论】:

做到了。但我仍然想知道,当第一次看到 tableview 时,单元格都调整到内容的高度,但是一旦你编辑一行,单元格的大小就会减小?

以上是关于UITableView 删除行减少表格行高的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 估计行高动态类型

表格行高 ios Swift

在 UITableView 中使用自动布局进行动态单元格布局和可变行高

在 UITableView 中使用自动布局进行动态单元格布局和可变行高

有没有办法让 UITableView 的估计行高实际上与准确的滚动位置一起工作?

滚动 uitableview 时更改特定的 uitableviewcell 行高