UITableViewでセル数を変更した時にアニメーションさせる方法

2011-09-16

uitableview_animation.png

iPhoneアプリプログラミングにおいて、UITableViewを使ったレイアウトは多いですが、UISwitchなどのコントロールのオン・オフで新たな行(セル)を表示する効果を使いたい人って多いと思います。

ただ、これにアニメーション効果を持たせようとするとちょっと厄介。

更新するだけならreloadDataで出来るけど…

テーブルビューを更新する場合に手軽な命令としては以下のようなreloadData関数を使うことが多いです。

[self.tableView reloadData];

しかし、このreloadDataではセルの変更時にアニメーション効果をつけることができません。 別のビューから移行してくる場合などはアニメーションの必要がないので利用できるのですが、今回のようにUISwitchなどで表示を変更する場合には使えないのです。

セクションの削除→追加を意図的にやってアニメーション!

そこで少々トリッキーな方法ですが、以下の方法でテーブルを強制的に描き変えるようにしてアニメーションさせます。

  1. アップデートの準備
  2. 更新対象のセクションを削除
  3. 更新対象のセクションを追加
  4. アップデートの終了

コードにすると、以下のようになります。 以下の例は、更新対象のセクション番号=1として指定した例です。

[self.tableView beginUpdates];
[self.tableView deleteSections:[NSIndexSet indexSetWithIndex:1] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView insertSections:[NSIndexSet indexSetWithIndex:1] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates];

beginUpdatesendUpdatesの処理で挟むのは、セクションを削除→追加する過程でインデックス番号がずれてしまうのを防ぐためです。

アニメーションのタイプを指定するwithRowAnimationパラメータがUITableViewRowAnimationNoneになっていますが、問題なくアニメーションされます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

2011-09-16