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 页脚