2016-04-04 15 views
0

別の行削除アニメーションが完了した後に行を挿入しようとしています。私は、次の操作を実行しようとしてきた:行の数は、それが期待されていますと同じでない場合別の行削除アニメーションの後に行を挿入する

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.endUpdates()を移動して動作させることができました。しかし、挿入アニメーションは、行が削除されると同時にアニメーション化されます。

これを行う別の方法はありますか?

答えて

0

あなたのアニメーションだけでいくつかのコードを実行する前に、一定時間を待つために、この機能を追加完了するのにかかるんどのくらいの時間を知っている場合:

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" 
} 
0

私はあなたが間違った位置にコードを入れていると思い

は、それはこのようにする必要があります:

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?

関連する問題