滚动时的UITableViewCell动画

时间:2010-11-25 23:40:14

标签: iphone uitableview multirow

我已经用Love example for Multi-row selection实现了Cocoa,其中包括创建一个自定义UITableViewCell,它在layoutSubviews中启动动画,以显示每行左侧的复选框,如下所示:

- (void)layoutSubviews
{
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationBeginsFromCurrentState:YES];

    [super layoutSubviews];

    if (((UITableView *)self.superview).isEditing)
    {
        CGRect contentFrame = self.contentView.frame;
        contentFrame.origin.x = EDITING_HORIZONTAL_OFFSET;
        self.contentView.frame = contentFrame;
    }
    else
    {
        CGRect contentFrame = self.contentView.frame;
        contentFrame.origin.x = 0;
        self.contentView.frame = contentFrame;
    }

    [UIView commitAnimations];
}

这样可以正常工作,并且无论如何我的UITableView都可以正常运行。然而,我遇到了一个小的美学问题:滚动我以前没有显示的UITableView行会启动它们的滑动动画,这意味着动画在某些行进入视图时会交错。

这是可以理解的,因为setAnimationBeginsFromCurrentState已设置为YES,而UITableView中的更下行尚未更新其帧位置。为了解决这个问题,我试图使用willDisplayCell来覆盖UITableView处于编辑模式时变为可见的单元格的动画。基本上绕过动画并立即更新行框架,以使其看起来好像单元格已经动画到位,如下所示:

/*
 Since we animate the editing transitions, we need to ensure that all animations are cancelled
 when a cell is scheduled to appear, so that things happen instantly.
 */
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    [cell.contentView.layer removeAllAnimations];   

    if(tableView.isEditing) {
        CGRect contentFrame = cell.contentView.frame;
        contentFrame.origin.x = EDITING_HORIZONTAL_OFFSET;
        cell.contentView.frame = contentFrame;
    } else {
        CGRect contentFrame = cell.contentView.frame;
        contentFrame.origin.x = 0;
        cell.contentView.frame = contentFrame;
    }
}

不幸的是,这似乎没有任何效果。有没有人知道如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

不确定你是否还需要这个问题的答案,但我刚刚遇到完全相同的问题,所以我想我会分享我的解决方案。我实现Multi-Selection的方式与你提到的Cocoa with Love博客文章中描述的相同。

在cellAtIndexPath DataSource方法中,当我创建一个新单元格时(如果单元格已经在可重用单元格的队列中),我检查tableView是否处于编辑模式,如果是,我在单元格上设置属性(I我创建了自己的自定义单元格,其EnableAnimation属性为false,因此当它获得SetEditing回调时,它不会为单元格设置动画,而只是设置框架。在Cell类的构造函数中,我将EnableAnimation设置为true,当调用SetEditing回调时,我将EnableAnimation设置为传入的animate参数。我希望这会有所帮助。