RowAnimation 使用不同高度的单元格看起来很奇怪

Posted

技术标签:

【中文标题】RowAnimation 使用不同高度的单元格看起来很奇怪【英文标题】:RowAnimation looks weird with different height cells 【发布时间】:2011-05-04 22:28:53 【问题描述】:

我在 UITableView 上为删除和插入设置动画时遇到了问题。事实是,我有不同的单元格高度,现在一些 44.0 一些 135.0。我将 uitableviewstyle 与不同的部分分组。每个部分的第一行是一个分组行。单击时,我删除了除分组行之外的该部分的所有行。但是,当动画(UITableViewRowAnimationTop)135px 高度的单元格时,该动画看起来很奇怪。我尝试将 self.tableview.cellheight 设置为 135 并注释掉 tableView:cellHeightForIndexPath-Method。动画效果很好。或者我在 tableView:cellHeightForIndexPath-Method 中将每个 cellheight 设置为 135。

看起来动画过程会检查部分中第一行的高度,然后将单元格的高度用于所有后续单元格的动画。

有人有想法吗?


- (void) showhideGroup:(int)group
   
    NSMutableArray *indexPaths = [[NSMutableArray alloc] init];
    
    MCGroup *handleGroup = [groups objectAtIndex:group];
    NSMutableArray *groupRows = [visibleGroupData objectForKey:handleGroup.title];
    
    [self.tableView beginUpdates];
    
    if (!handleGroup.hidden) 
        int row = 0;
        for(MobileFieldMapping *field in groupRows)
        
            if (![field.datatype matchesInsensitive:GROUPING_CELL]) 
            
                NSIndexPath *path = [NSIndexPath indexPathForRow:row inSection:group];
                [indexPaths addObject:path];
            
            row++;
        
        
        row = 0;
        for(NSIndexPath *index in indexPaths)
        
            [groupRows removeObjectAtIndex:index.row-row];
            row++;
        
        [self.tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationTop];
        handleGroup.hidden=YES;
    
    else 
    
        NSMutableArray *allGroupRows = [groupData objectForKey:handleGroup.title];
        
        int row = 0;
        for (MobileFieldMapping *field in allGroupRows) 
        
            if (![groupRows containsObject:field]) 
            
                NSIndexPath *path = [NSIndexPath indexPathForRow:row inSection:group];
                [indexPaths addObject:path];
                [groupRows insertObject:field atIndex:row];
            
            row++;
        
        
        [self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationTop];
        handleGroup.hidden=NO;
    
    [self.tableView endUpdates];


    [indexPaths release];


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
   
    UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
    
    if ([cell isKindOfClass:[FormCell class]]) 
    
        return [(FormCell*)cell height];
    
    
    return 44.0;

【问题讨论】:

你应该发布表格视图委托源代码。 好吧,没有人知道......似乎是这样 我已经完成了这项工作,所以我认为这是您代码中的错误。您需要发布完整的代码,或者(更好地)制作一个较小的问题示例。此外,您需要更具体地描述它“看起来很奇怪”的确切方式 - 没有人可以帮助您解决这种模糊。 我也遇到了同样的问题,你找到解决办法了吗? 【参考方案1】:

我遇到了同样的问题。 我的解决方法是使用淡入淡出部分动画:

[tableView reloadSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationFade];

而不是一个元素:

[tableView deleteRowsAtIndexPaths:tmpArray withRowAnimation:UITableViewRowAnimationTop];

这看起来更流畅。

【讨论】:

【参考方案2】:

一个仍未得到答复的旧问题。我想你很久以前就知道了,但这是我的第一个想法。 (我记得我自己也尝试过这样做。)

UITableView调用heightForRowAtIndexPath:时,会因为表格正在尝试准备单元格,所以不能使用单元格返回高度。这可能会导致调用中的无限回归,或者它可能会检测到这一点并放弃或抛出异常,让您束手无策。

您必须在不使用单元格本身的情况下计算单元格高度。

至于单元格高度假设,请尝试为单个单元格调用插入/删除,而不是一次调用来一次完成所有操作。在您调用endUpdates 之后,UITableView 仍会为动画批量处理它们。

【讨论】:

以上是关于RowAnimation 使用不同高度的单元格看起来很奇怪的主要内容,如果未能解决你的问题,请参考以下文章

删除高度大于其他单元格的单元格时,动画看起来很尴尬

如何通过更改单元格的高度来创建动态 TableView 页脚

集合视图具有多个部分的不同单元格高度

在具有不同单元格高度的列表视图中滚动

我想在单个表格视图中使用来自 nib 的两个不同的自定义单元格。两个原型电池具有不同的高度

UITableView imageView 复用其他单元格的图片