UITableViewCell平移以显示选项:动画

时间:2013-03-31 20:01:02

标签: iphone objective-c xcode cocoa-touch core-animation

所以我在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

中看到平移手势

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

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

在使用几种不同的方法进行此操作后,我最终得到了一个解决方案,我在下面键入它。

<强>算法:

滑动或平移tableViewCell的原理很简单。 用于弹出单元格下方的按钮的算法基于 细胞的当前位置与细胞的位置相比较 纽扣。有几种方法可以解决这个问题 以下示例是_NOT_THE_MOST_OPTIMAL_给出的一个 我们重新排序按钮时出现的复杂情况。 (即如果 按钮被重新排序,算法将失败)。

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

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

  2. 根据翻译和直接使用按钮的框架 扩大它们。 ===&GT;我们不能使用任何按钮的框架 场景,因为当我们缩放它们时,(x,y,大小,宽度)变化很大

  3. 在动画之前缓存按钮帧并使用它们进行缩放 他们。 ===&GT;缓存它们可能适用于某些情况,但我们会 需要定期更新它们,并确保缓存它们 在ORIENTATION_CHANGE之后。这将再次成为按钮框架的痛苦 取向变化后也非常显着(参见第2页)。

  4. <强>工作:

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

    该区域的这些值是根据动画区域的位置计算的(如IB中所设置)。我们再次分裂 regionOfAnimation EVENLY基于当前按钮的数量,和 当单元格在每个分割中移动时,我们会为其下方的按钮设置动画。

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

    此方法的优点:

    1. 性能优于hit_test(非常需要休息)
    2. 按钮将始终正常动画,因为我们不访问它们的帧 用于计算
    3. 缺点:

      1. 静态按钮的区域和动画区域 必须事先为两个方向计算。
      2. 如果按钮是 互换后,需要更新算法以反映新的变化。

答案 1 :(得分:-1)

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