2

我有一个自定义动画:

    - (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated

UITableViewCell,类似于:

    [UIView animateWithDuration:0.15 animations:^{
        self.center = CGPointMake(self.center.x + 110, self.center.y);
    } completion:^(BOOL finished) {
        isShifted = finished;
    }];

这里的想法是在触摸按下时移动单元格。然后,如果选择了单元格(没有发生滚动或取消事件),我将继续执行单元格的另一个动画并转换到新视图。

setHighlighted:NO这里的问题是动画在方法调用时将单元格放回其原始位置。从视觉上看,它看起来像在选择时单元格移动(触地),然后开始返回(系统移除突出显示),然后开始转换(系统调用setSelected:YES)。

据我所见,在选择表格中的单元格时,会发生以下情况:

  1. setHighlighted:YES
  2. setHighlighted:NO
  3. setSelected:YES

是否有任何优雅的解决方案可以跳过呼叫 2 并避免后移动画而不引入将检查选择的计时器?

4

2 回答 2

1

可以考虑使用委托方法tableView:shouldHighlightRowAtIndexPath:

- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath {
    // The cell has been touched, perform custom animation here
    return NO;
}

setHighlight:永远不会在任何单元格上调用,但您仍然有一个执行自定义动画的入口点。

于 2013-11-02T23:02:16.703 回答
1

如果你的 UITableView 有一个委托(可能是你自己的视图控制器),你可以通过类似"tableView: willSelectRowAtIndexPath:来捕捉选择。

然后,您可以在单元格被选中时对单元格执行“特殊”操作(例如设置强制单元格在动画中执行您想要的操作的属性)。

并通过" tableView:willDeselectRowAtIndexPath:"取消选择单元格时将其恢复为之前的状态。

您还可以使用相同类型的委托方法来突出显示,例如"tableView:shouldHighlightRowAtIndexPath:

于 2013-11-02T23:00:03.163 回答