UITableView的相邻cell交换简单动画

 实现了上下两个cell交换的简单动效,界面如下,点击上,和上面一个cell交换位置,点击下,和下面一个交换位置,点击删除,就删除当前的cell,完整代码,简单说明一下主要cell交换的代码。


UITableView的相邻cell交换简单动画_第1张图片

UITableViewCell *cell = [_tableView cellForRowAtIndexPath:indexPath];
NSIndexPath *nextIndexPath = [NSIndexPath indexPathForRow:indexPath.row+1 inSection:indexPath.section];
UITableViewCell *nextCell = [_tableView cellForRowAtIndexPath:nextIndexPath]; 
CGFloat cellY = cell.frame.origin.y;
[UIView animateWithDuration:0.6 animations:^{
     //当前这个顶部就和上面一个平齐
       CGRect rect = cell.frame;
       rect.origin.y = cellY + CGRectGetHeight(nextCell.frame);
       cell.frame = rect;
       //上面一个需要处理一下,只能基于当前的y+下面的cell的高度,直接交换y轴,位置不准,在刷新表格的时候,会有抖动的现象
       CGRect rect1 = nextCell.frame;
       rect1.origin.y = cellY;
       nextCell.frame = rect1;
}completion:^(BOOL finished) 
{[titleArray exchangeObjectAtIndex:indexPath.row withObjectAtIndex:nextIndexPath.row];
    [heightArray exchangeObjectAtIndex:indexPath.row withObjectAtIndex:nextIndexPath.row];
     [self.tableView reloadData];
}];

   通过点击当前的cell的indexPath,拿到当前点击的cell;通过是上还是下,拿到需要换位置的indexPath,继而拿到需要换位置的cell,获取需要换位置的两个cell的y坐标,这理是和上一个换,那个下面cell的新的y坐标就是上一个的y,直接赋值,但是上一个的y不是下一个y,而是上一个的y+下一个cell的高度。这个地方理解一下就行了。最后动画完成了之后,交换数据源,刷新表格让表格的indexPath正常就行了。

  注意

   这里是有部分bug的,举个栗子,当前需要操作的cell在屏幕上方,并且只漏出了一半(漏出一半的作用是让前一个cell不在可见范围),当和上一个交换位置的时候,由于前一个cell不在可见范围,通过前一个cell获取y的时候,是拿不到正确值的,这里值能拿到0,所以正确的思路应该是存储每一个cell的y,放在一个数组里面,在交换的时候,从数组里面获取y,应该就没有问题。这是我的思路,要是有更好的思路,欢迎指正。

你可能感兴趣的:(ios,cell交换,UITableView,UITableViewCell)