3

があり、UITableView再び表示される行をアニメーション化したいと考えています。また、アニメーションを切り替えたいのですが、一部のセルは取得UITableViewRowAnimationLeftし、他のセルは取得する必要がありますUITableViewRowAnimationRight。しかし、この機能を自分の で実装する方法がわかりませんUITableViewController。次のコード行を に挿入しようとしましたcellForRowAtIndexPath:

[self.tableView beginUpdates];
NSArray *updatePath = [NSArray arrayWithObject:indexPath];
[self.tableView reloadRowsAtIndexPaths:updatePath 
                      withRowAnimation:UITableViewRowAnimationLeft];
[self.tableView endUpdates];

セル内をスライドする代わりに、セルの順序が変更されたり、一部のセルが 2 回表示されたりしました。また、セル作成後にこれらの行を挿入しようとしました。

if (cell == nil) {
...
} else {
    [self.tableView beginUpdates];
    NSArray *updatePath = [NSArray arrayWithObject:indexPath];
    [self.tableView reloadRowsAtIndexPaths:updatePath 
                          withRowAnimation:UITableViewRowAnimationLeft];
    [self.tableView endUpdates];
4

1 に答える 1

8

テーブルがセルを画面に表示するプロセスを開始すると、行のリロードに成功するとは思いません。reloadRowsAtIndexPath通常はcellForRowAtIndexPath呼び出されるため、無限ループに陥っていないことに驚いています。代わりに、テーブルが悪い状態になっているように見えます。

この場合、セルの変換プロパティを で操作して、独自のアニメーションを作成することをお勧めしますwillDisplayCell。次のようなことができます。

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (<should animate cell>) {
        CGFloat direction = <animate from right> ? 1 : -1;
        cell.transform = CGAffineTransformMakeTranslation(cell.bounds.size.width * direction, 0);
        [UIView animateWithDuration:0.25 animations:^{
            cell.transform = CGAffineTransformIdentity;
        }];
    }
}

「セルをアニメーション化する必要がある」ためのロジックを提供する必要があります。おそらく、初期ロード時にセルをアニメーション化したくないでしょう。

于 2013-08-28T15:06:35.067 に答える