我有一个UITableView,我想以编程方式将一行从位置N1移动到位置N2,我希望它从旧位置动画到新位置。我查看了UITableView文档,我只看到插入,重新加载和删除。您是否知道我可以通过编程方式执行此操作?
几点说明:
我知道我可以从位置N1设置删除动画,并同时将插入动画设置为位置N2。这是我的后备,但我希望用户明白它真的从N1转移到N2。
我不是在谈论允许用户将其从一个地方拖到另一个地方。我知道如何做到这一点,我正在寻找一种方法来以编程方式启动和动画移动。
答案 0 :(得分:4)
我过去曾经处理过类似的事情,解决方案并不漂亮,但确实有效。
基本上你必须做一些数学来计算屏幕上行的位置。然后根据y
contentOffset
的{{1}}属性进行调整。
你可以这样做:
UITableView
然后,您将构建一个与您的视图完全相同的新[myView convertPoint:localPosition toView:nil];
。将其框架设置为直接位于您要移动的UIView
的顶部。将其添加为应用主UITableViewCell
的子视图。
您需要在UIWindow
上将userInteractionEnabled
或scrollEnabled
设置为NO
,而所有这一切都在进行,以便用户无法使用整个过程中事物的位置(只需记住在完成所有动画时将其设置回UITableView
。)
然后将其设置为新位置然而最有意义。
我知道你可能需要在所有这些过程中滚动YES
,这会使事情变得相当复杂,但你也可以为滚动设置动画。
如果您的应用中有必要,您当然必须在 动画的行上执行类似的操作。
就像我说它不容易或漂亮。但我做了解你想要完成的事情,我认为当它正确拉开时效果非常棒。
如果有人更好地了解如何在不疯狂的情况下解决这个问题我很想知道,但这种类型的实施是我能够做到的最好的。
答案 1 :(得分:1)
[table beginUpdates];
[table moveRowAtIndexPath:indexPath toIndexPath:destIndexPath];
[table endUpdates];
答案 2 :(得分:0)
如果你使用的是iOS 5或者hight,你可以使用以下方法:
- (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];
查看Apple的文档here。
我猜你最好的后备确实是删除和插入方法,如:
[tableView beginUpdates];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:oldPath] withRowAnimation:UITableViewRowAnimationLeft];
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newNewPath] withRowAnimation:UITableViewRowAnimationLeft];
[tableView endUpdates];