如何在不重置表位置的情况下为UITableView设置动画,类似于Apple Mail应用程序?

时间:2011-08-07 21:17:42

标签: iphone ios uitableview

我有一个tableView,它有一个按钮将其置于伪编辑模式。在此模式下,此单元格“向右/向左移动”以在左侧显示复选框。该过程与Mail应用程序“编辑”按钮的工作方式没有什么不同。

我现在这样做的方法是设置一个伪编辑标志,然后重新加载表格,如果设置了标志,那么单元格的绘制方式不同。我也把它放在一个动画块中,它给了我移动效果:

[UIView beginAnimations:@"cell shift" context:nil];
[UIView setAnimationDuration:kEventActionViewAnimationDuration];

cell.eventName.frame = (self.pseudoEditing) ? kPseudoEditingFirstIndentedRect :     kFirstLabelRect;
cell.eventLocationName.frame = (self.pseudoEditing) ? kPseudoEditingSecondIndentedRect : kSecondaryLabelRect;
cell.eventStartDate.frame = (self.pseudoEditing) ? kPseudoEditingThirdIndentedRect : kThirdLabelRect;
cell.eventStartEndTime.frame = (self.pseudoEditing) ? kPseudoEditingFourthIndentedRect : kFourthLabelRect;
cell.imageView.frame = (self.pseudoEditing) ? kImageViewIndentedRect : kImageViewRect;
cell.rsvpImageView.hidden = !self.pseudoEditing;

[UIView commitAnimations];

return cell;

我的问题是我需要重新加载表,以便调用cellForRowAtIndexPath:方法来更新单元格,然后将表格位置重置为tableView的顶部。我可以然后将表位置设置到使用scrollToIndexPath之类的命令之前的位置:...然而这不会起作用,因为表会滚动到顶部然后再回到上一个我不想要的细胞。

那么有没有办法在tableView中重新加载tableCells而没有tableView更改滚动位置,类似于Mail应用程序的做法?

THX

2 个答案:

答案 0 :(得分:0)

我根本不会重新加载表格视图。使您的单元格具有multiEditing之类的属性。当您开始编辑时,迭代表视图的visibleCells数组并在动画块中设置属性(单元格本身可以执行动画,类似于现有的setEditing:animated:方法)。对于新单元格,只需在出列/创建它们后立即设置它。

答案 1 :(得分:0)

您可以继承UITableViewCell并覆盖-layoutSubviews。在该方法中,您将检查UITableViewCell s editing属性并相应地确定内容视图的帧。更改单元格编辑模式时,-layoutSubviews中所做的任何更改都将自动设置动画。只需在表格视图上设置editing,就会自动对所有单元格执行更改。