【问题标题】:UITableViewCell Panning to reveal options: AnimatedUITableViewCell 平移以显示选项:动画
【发布时间】:2013-03-31 20:01:01
【问题描述】:

所以我有一个很好的在 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

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

非常感谢任何帮助。

【问题讨论】:

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


    【解决方案1】:

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

    算法:

    滑动或平移 tableViewCell 的原理很简单。 弹出单元格下方按钮的算法基于 单元格的当前位置与 纽扣。有几种方法可以解决这个问题,其中一种用于 下面的例子是 _NOT_THE_MOST_OPTIMAL_ 一个给定的 当我们重新排序按钮时出现的并发症。 (即,如果 按钮被重新排序,算法将失败)。

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

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

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

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

    工作:

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

    这些区域的值是根据动画区域的位置计算的(在 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. 由于我们不访问它们的框架,因此按钮将始终正确设置动画 用于计算

    缺点:

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

    【讨论】:

    • +1 表示算法。你能开源你为此编写的源代码吗?或者如果已经开源请分享链接!!
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-14
      • 1970-01-01
      • 2011-07-31
      • 2012-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多