在另一行删除动画之后插入行

Posted

技术标签:

【中文标题】在另一行删除动画之后插入行【英文标题】:Inserting row after another row deletion animation 【发布时间】:2016-04-04 10:11:19 【问题描述】:

我正在尝试在另一行删除动画完成后插入一行。我一直在尝试执行以下操作:

tableView.beginUpdates()
CATransaction.begin()

CATransaction.setCompletionBlock 
    tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: .Right)


tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Left)

CATransaction.commit()
tableView.endUpdates

当行数与预期不同时,这给了我通常的断言失败。

然后我尝试使用带有完成块的UIView 动画:

tableView.beginUpdates()

func animations() 
    tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Left)


func completion() 
    if count == self.payments.count && self.payments.isEmpty  insert() 


UIView.animateWithDuration(0.5, animations:  animations() )  _ in completion() 

tableView.endUpdates()

两次尝试都给了我同样的错误。是否有可能或者我应该研究用于插入/删除 tableview 行的自定义动画?


编辑:

我设法通过将tableView.endUpdates() 移动到完成块来使其工作。但是插入动画在删除行的同时仍然有动画。

还有其他方法吗?

【问题讨论】:

【参考方案1】:

如果你知道你的动画需要多少时间来完成,只需添加这个函数来等待给定的时间,然后再执行一些代码:

func delay(delay:Double, closure:()->()) 
    dispatch_after(
        dispatch_time(
            DISPATCH_TIME_NOW,
            Int64(delay * Double(NSEC_PER_SEC))
        ),
        dispatch_get_main_queue(), closure)

用法:

delay(seconds: 0.5)  
    //code to be delayed "0.5 sec"

【讨论】:

【参考方案2】:

我认为您将代码放在错误的位置

应该是这样的:

CATransaction.begin()

CATransaction.setCompletionBlock 
  // animation has finished


tableView.beginUpdates()
// do some work
tableView endUpdates()

CATransaction.commit()

参考:How to detect that animation has ended on UITableView beginUpdates/endUpdates?

【讨论】:

以上是关于在另一行删除动画之后插入行的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 中动画插入/删除的 2 个 NSArray 的区别

在另一个表中插入一行时如何自动增加一个表中的值

javascript 在另一个之后或之前插入元素

vue的动画组件(transition)

Java语言开发入行记

Mysql 为每一行检查是不是一个字段在另一个表中,如果不删除该行