4

所以我有一个很好的在 tableview 单元格上平移的实现。我基本上使用 panGestureRecognizer 并将单元格移出屏幕,并在 tableViewCell 下方显示另一个视图。这工作正常。当我在 tableViewCell 上平移时,我基本上会在下面显示 5 个按钮。

我的目标是在 tableviewcell 移动时为 5 个按钮设置动画。例如,


| 1 | 2 | 3 | 4 | 5|

如果我正在滑动并向右移动单元格并且我是十字按钮 1,我将动画按钮弹出并对用户可见。如果我越过 2,那么 2 将动画弹出,并且对用户可见。当我在按钮 5 中时,所有按钮都已弹出并准备好进行用户操作。

我正在这样做

    //Scale Animation
    CABasicAnimation *scaleAnim = [CABasicAnimation animationWithKeyPath:@"transform"];
    scaleAnim.duration = 0.3;
    scaleAnim.toValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];
    scaleAnim.fromValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.1,0.1, 1.0)];
    scaleAnim.removedOnCompletion = YES;
    [view.layer addAnimation:scaleAnim forKey:nil];

**

我的目标 :

**

因此,当我处于平移手势的中间,并且我决定关闭它(向左移动)时,按钮应该会弹出,并且对用户不可用。

此外,当我移动单元格时,按钮应逐渐放大,并可供用户使用。所以我基本上需要传递单元格的原点并使用一些数学来根据按钮的原点和宽度(相当简单)计算按钮的比例。

if (CGRectIntersectsRect(button.frame, self.movingCell.frame))
{
    CGFloat xScale = cellTranslation - xOriginForButton;
    [self popOutAnimate:button withScale:xScale/ (xWidthForButtons + xSpaceBetweenButtons)];
}

但是当我快速移动单元格时问题出现了,视图没有得到单元格移动的所有变化,并且它们被卡在半动画状态。

我有一种感觉,我没有正确掌握逻辑。整个实现类似于Sparrow iphone 邮件应用程序。当您平移单元格时,按钮会随着单元格的移动以动画形式显示。对于那些没有使用麻雀的人。您可以在 1:25 中看到平移手势https://www.youtube.com/watch?v=XLX6XV0SbWI&t=1m25s

逻辑正确吗?我错过了什么吗?

任何帮助深表感谢。

4

2 回答 2

2

在使用几种不同的方式解决这个问题后,我最终找到了一个解决方案,我在下面输入了它。

算法:

滑动或平移 tableViewCell 的原则是直截了当的。弹出单元格下方按钮的算法基于单元格的当前位置与按钮位置的比较。有几种方法可以解决这个问题,以下示例中使用的一种是_NOT_THE_MOST_OPTIMAL_ 一种,因为我们重新排序按钮时会出现复杂情况。(即如果按钮重新排序,算法将失败)。

让我们看一下这个问题的最佳解决方案。

  1. 使用 ( 执行 hit_testCGRectIntersects(rect1, rect2)以找出单元格与任何按钮的位置。==> 这将是最理想的解决方案,因为替换或互换按钮仍然可以正常工作。但是我们不能使用这种方法,因为当单元格时 hit_test 将失败快速移动。这将使按钮处于非常不正确的状态。

  2. 根据翻译直接使用按钮的框架并放大它们。===> 我们不能在任何场景中使用按钮的框架,因为当我们缩放它们时,(x,y,size,width) 变化很大

  3. 在动画之前缓存按钮帧并使用它们来缩放它们。===> 缓存它们可能适用于某些情况,但我们需要非常定期地更新它们,并确保在 ORIENTATION_CHANGE 之后缓存它们。这将再次成为一种痛苦,因为方向改变后的按钮框架也非常剧烈(请参阅第 2 部分)。

在职的:

因此,如果我们要为单元格下方的所有按钮设置动画,那么您将只有一个 regionOfAnimation。如果您有一组带有静态按钮的部分,以及一组需要动画的按钮,那么我们有 2 个区域 - 一个带有 staticButtons 的区域,另一个带有 regionOfAnimation。

区域的这些值是根据动画区域的位置(如 IB 中设置的)计算得出的。我们再次根据按钮的数量均匀地分割 regionOfAnimation,当单元格在每个分割点上移动时,我们为它下面的按钮设置动画。

|    Region of Static Buttons   |  Region of Animation  |
---------------------------------------------------------
| Static Button | Static Button |  1 |  2 |  3 |  4 |  5|
---------------------------------------------------------
|                                       
|              ===>  CELL MOVES ====>               
|   
---------------------------------------------------------

这种方法的优点:

  1. 性能优于 hit_test(非常需要中断)
  2. 按钮将始终正确动画,因为我们不访问它们的框架进行计算

缺点:

  1. 静态按钮区域和动画区域必须事先计算好两个方向。
  2. 如果按钮互换,则需要更新算法以反映新的变化。
于 2013-04-01T18:33:08.810 回答
-1

你可以在这里找到你所有的答案 https://github.com/spiliams/sparrowlike :) 它的评论非常有力,并且会更加模块化.. 尝试编辑这个。

于 2013-04-01T05:21:38.913 回答