【问题标题】:Programmatically move/animate a UITableView row from one position to another以编程方式将 UITableView 行从一个位置移动/动画到另一个位置
【发布时间】:2011-07-03 19:33:03
【问题描述】:

我有一个 UITableView,我想以编程方式将一行从位置 N1 移动到位置 N2,我希望它从旧位置动画到新位置。我浏览了 UITableView 文档,我只看到插入、重新加载和删除。你知道我可以通过编程方式做到这一点吗?

几点说明:

  • 我知道我可以为位置 N1 的删除设置动画,同时为位置 N2 的插入设置动画。这是我的后备方案,但我希望用户了解它是真正从 N1 迁移到 N2。

  • 我不是说允许用户将它从一个地方拖到另一个地方。我知道如何做到这一点,我正在寻找一种以编程方式启动和动画移动的方法。

【问题讨论】:

  • 删除/插入包含在 beginUpdates/endUpdates 中没有帮助?
  • 这仍然为我提供了一种效果,即位置 N1 的行向左滑出(这是我正在使用的动画样式),然后该行在位置 N2 滑回。我正在寻找视觉上类似于用户将其拖到新位置时的东西。例如,如果它需要向上移动 3 行,则单元格仅向上滑动 3 行,其他行关闭在 N1 空间周围并打开所有行以降落在 N2 空间中。

标签: iphone ipad ios uitableview


【解决方案1】:

我过去处理过类似的事情,解决方案并不漂亮,但确实有效。

基本上,您必须进行一些数学运算才能计算出该行在屏幕上的位置。然后根据UITableViewcontentOffsety 属性进行调整。

你可以这样做:

[myView convertPoint:localPosition toView:nil];

然后您将构建一个与您的视图相同的新UIView。将其框架设置为直接位于您要移动的 UITableViewCell 的顶部。将其添加为应用主 UIWindow 的子视图。

您需要在UITableView 上将userInteractionEnabledscrollEnabled 设置为NO,这样用户就不会在整个过程中弄乱事物的位置(只是当一切都完成动画后,记得将其设置回YES)。

然后将其动画到新位置,但最有意义。

我知道您可能需要在所有这些过程中滚动UITableView,这会使事情变得相当复杂,但您也可以为滚动设置动画。

如果在您的应用中需要,您当然必须对您正在动画的行执行类似的操作。

就像我说的那样,它不容易或漂亮。但我确实了解您要完成的工作,并且我认为正确完成后效果非常棒。

如果有人对如何在不发疯的情况下实现这一目标有更好的了解,我很想知道,但这种类型的实现是我能做到的最好的。

【讨论】:

  • 感谢您的回答。我要再等一两天,看看我能不能得到其他人,但如果不能,我会接受这个答案。如果这是我能做的最好的,那么我将坚持我的后备解决方案。让我获得近乎完美解决方案的 2 行代码比一个非常复杂且可能脆弱的解决方案要好。非常感谢您花时间回答!
  • 不错的解决方法。有没有实现这个的应用程序?在花时间实施它之前,我想看看它看起来有多好。
  • 我在bitbucket.org/elmalabarista/dragdroptableviews 有一个实现。动画很垃圾......这就是我卡住的地方
【解决方案2】:
[table beginUpdates];
[table moveRowAtIndexPath:indexPath toIndexPath:destIndexPath];
[table endUpdates];

【讨论】:

    【解决方案3】:

    如果您使用的是 iOS 5 或更高版本,您可以使用以下方法:

    - (void)moveRowAtIndexPath:(NSIndexPath *)indexPath toIndexPath:(NSIndexPath *)newIndexPath
    

    例如:

    //move last cell one row up.
    NSIndexPath *oldPath = [NSIndexPath indexPathForRow:[items count] - 1 inSection:0];
    NSIndexPath *newPath = [NSIndexPath indexPathForRow:[items count] - 2 inSection:0];
    [[self tableView] moveRowAtIndexPath:oldPath toIndexPath:newPath];
    

    查看苹果的文档here

    我猜你最好的后备方法确实是删除和插入方法,比如:

    [tableView beginUpdates];
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:oldPath] withRowAnimation:UITableViewRowAnimationLeft];
    [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newNewPath] withRowAnimation:UITableViewRowAnimationLeft];
    [tableView endUpdates];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-04
      • 1970-01-01
      相关资源
      最近更新 更多