0

現在、ほとんどの標準サイズのセルを 44pts で保持する uitableview を使用しています。ただし、160pt 程度の大きいものもいくつかあります。

この例では、44 ポイントの高さで 2 つの行があり、セクションのインデックス 2 の下に、より大きな 160 ポイントの行が挿入されています。

削除の電話:

- (void)removeRowInSection:(TableViewSection *)section atIndex:(NSUInteger)index {
    NSUInteger sectionIndex = [self.sections indexOfObject:section];

    NSIndexPath *removalPath = [NSIndexPath indexPathForRow:index inSection:sectionIndex];

    [self.tableView beginUpdates];
    [self.tableView deleteRowsAtIndexPaths:@[removalPath] withRowAnimation:UITableViewRowAnimationAutomatic];
    [self.tableView endUpdates];
}

デリゲートコール:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    TableViewSection *section = [self sectionAtIndex:indexPath.section];

    return [section heightForRowAtIndex:indexPath.row];
}

セクションコール:

- (NSInteger)heightForRowAtIndex:(NSInteger)index {
    StandardCell *cell = (StandardCell *)[self.list objectAtIndex:index];

    return cell.height;
}

携帯電話:

- (CGFloat)height {
    return 160;
}

私が混乱しているのは、テーブルから大きな行を削除すると、アニメーションが開始され、上の行の下に移動することです。しかし、アニメーションの約 1/4 の特定のポイントに到達すると、アニメーションを終了する代わりに消えてしまいます。

表は、44pts だけであるという概念で行をアニメーション化し、44pts が上の行の下にあるポイントに達すると、表から削除されるようです。行の削除を自動的にアニメーション化するための正しい概念をテーブルに与えるために、私が見逃した詳細は何ですか?

ご協力いただきありがとうございます。

更新: 上記の高さ関数をコメントアウトしてみました (44 を返すデフォルトをオーバーライドします)。これにより、スキップのない適切なアニメーションが得られます。FWIW

4

1 に答える 1

4

これを解決する 1 つの方法は、削除する直前に行の高さを 44 に下げることです。

//mark index paths being deleted and trigger `contentSize` update
self.indexPathsBeingDeleted = [NSMutableArray arrayWithArray:@[indexPath]];
[tableView beginUpdates];
[tableView endUpdates];

//delete row
[self.tableView deleteRowsAtIndexPaths:@[removalPath] withRowAnimation:UITableViewRowAnimationAutomatic];
[tableView endUpdates];

そして、あなたのheightForRowAtIndexPath

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([self.indexPathsBeingDeleted containsObject:indexPath]) {
        //return normal height if cell is being deleted
        [self.indexPathsBeingDeleted removeObject:indexPath];
        return 44;
    }
    if (<test for tall row>) {
        return 160;
    }
    return 44;
}

削除されたインデックス パスを追跡するために、ちょっとした簿記が行われています。これを行うためのよりクリーンな方法がおそらくあります。これは最初に頭に浮かんだことです。これが実際のサンプル プロジェクトです。

于 2013-09-04T19:15:05.630 に答える