在回调后,在U​​ITableViewCell中为UIViews制作动画的好方法是什么?

时间:2010-04-27 15:28:03

标签: iphone

我们找不到一种方法来将UITableCell中的UIViews设置为来自回调的动作。

假设您在单击UITableViewCell上的按钮的情况下触发了下载图片的异步操作。进一步假设当下载图片时,我们希望单元格中的UIView为图片设置动画,以便为用户提供即将呈现新内容的视觉反馈。

我们无法找到一种方法来跟踪UIVIew以调用beginAnimation,因为用户单击的原始单元格现在可能会用于另一行,因为当您向上和向下滚动时,单元格的性质会被重复使用桌子。换句话说,我们不能保持指向UITableViewCell的指针。我们需要找到另一种定位单元格的方法,并在该行可见时为其设置动画,如果该行滚动超出范围,则不进行动画处理。

1 个答案:

答案 0 :(得分:1)

保持单元格对象与正在设置动画的对象不同,以便单元格保存UIView。当发生动画回调时,检查以确保UIView仍然存在,如果存在,则为更改设置动画。

当单元格对象从屏幕上被撞出并被回收时,释放已经动画化的UIView并创建一个新的UIView。当动画回调发生时,它将无事可做,因为UIView不再存在。

上面的修改是在UIView中保留某种对象,你的回调可以检查动画是否仍然合适。这可能是正在下载的图片的某种唯一标识符。如果标识符发生更改,则不需要动画。如果匹配,请执行动画。


编辑:

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

    static NSString *MyIdentifier = @"MyTableCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle
                                       reuseIdentifier:MyIdentifier] autorelease];
    } else {
        UIView *oldViewToAnimate = [cell.contentView viewWithTag:1];
        [oldViewToAnimate removeFromSuperview];
    }

    UIView *viewToAnimate = [[UIView alloc] initWithFrame:CGRectZero]; //replace with appropriate frame
    viewToAnimate.tag = 1;
    [cell.contentView addSubview:viewToAnimate];

    return cell;
}

当您产生下载过程时,您会传递[cell.contentView viewWithTag:1]。下载完成后,它将更新相应的视图。如果重用表格单元格,则视图将不再具有超级视图,并且不会更新错误的单元格。

您可以采取一些措施来提高效率,但这是基本想法。如果你有一个自定义的UITableViewCell,那么可能会有点不同。


编辑2:

要重复使用viewToAnimate对象以确保在父单元格被回收时它们会更新,请执行以下操作:

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

    static NSString *MyIdentifier = @"MyTableCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle
                                       reuseIdentifier:MyIdentifier] autorelease];
    } else {
        UIView *oldViewToAnimate = [cell.contentView viewWithTag:1];
        [oldViewToAnimate removeFromSuperview];
    }

    UIView *viewToAnimate = [self viewToAnimateForIndexPath:indexPath];
    viewToAnimate.tag = 1;
    [cell.contentView addSubview:viewToAnimate];

    return cell;
}

viewToAnimateForIndexPath需要:

  • 检查是否已为此indexPath创建viewToAnimate
  • 如果没有
  • ,请创建一个viewToAnimate
  • 保存对indexPath
  • 可以查找的视图的引用
  • 返回viewToAnimate,以便表格单元格可以使用它

我对您的数据结构知之甚少。下载过程完成后,可以调用相同的方法来获取视图并为其设置动画。