Ios 以编程方式删除和插入项目时,默认的UITableView滚动应该如何工作?

Ios 以编程方式删除和插入项目时,默认的UITableView滚动应该如何工作?,ios,uitableview,uiscrollview,Ios,Uitableview,Uiscrollview,我有一个带有两个部分的UITableView。项目可以从一个部分移动到另一个部分,如下图所示 基本互动如下: 你刷了一个单元格/行 该单元格将从其分区中删除 该单元格将添加到另一部分的底部 注意,我使用了一系列删除rowsatindexpaths和插入rowsatindexpaths与CATTransactions。删除后再添加并不是唯一的表操作;对于常规方法,我希望在前面的操作完成后启动链式插入/删除/更新动画。下面是一个例子: [CATransaction begin]; [CATra

我有一个带有两个部分的
UITableView
。项目可以从一个部分移动到另一个部分,如下图所示

基本互动如下:

  • 你刷了一个单元格/行
  • 该单元格将从其分区中删除
  • 该单元格将添加到另一部分的底部
注意,我使用了一系列
删除rowsatindexpaths
插入rowsatindexpaths
CATTransaction
s。删除后再添加并不是唯一的表操作;对于常规方法,我希望在前面的操作完成后启动链式
插入
/
删除
/
更新
动画。下面是一个例子:

[CATransaction begin];
[CATransaction setCompletionBlock:^{
    [table beginUpdates];
    // update data source...
    // insertRows...
    [table endUpdates];
}];

[table beginUpdates];
// update data source...
// deleteRows...
[table endUpdates];

[CATransaction commit];
当表格视图中有足够的项目占据了超过一个屏幕的空间时,(我认为是),当单元格从一个部分删除并添加到另一个部分时,默认的
UITableView
滚动开始

我的假设是(
UITableView
滚动以放置/保持插入的行在视图中,因为我在文档中没有找到任何关于滚动行为的引用)

考虑以下示例:滑动单元格以将其从一个部分删除,并将其添加到另一个部分:

  • 该单元格当前在视图中,因为用户正在滑动它(因此,
    deleteRows…
  • (在某些情况下)表格视图会滚动后续的
    插入行…
    ;滚动发生在插入之前,以便观察动画插入
例如,在下图中,滑动底部区域的一个单元格,表格视图滚动,然后在顶部区域的底部插入

我说的是某些情况,因为如果插入发生在顶部部分(第0部分),就会观察到这种行为。当删除/插入从第0部分到第1部分时,表视图根本不会滚动

我还看到一些我不理解的其他行为。如果某些单元格有多行文本(单元格大小不尽相同),则滚动条似乎“不起作用”。起初,滚动量似乎是错误的;但是,当插入发生在第0节时,所有单元格都是单行的测试显示滚动一致

下图显示了错误的滚动:

我有两个具体问题和一个一般问题

具体问题#1:是否存在
UITableView
s的层次结构,以便首选第0节,因此表视图将滚动到第0节,以便观察插入内容,而不是滚动到其他节

具体问题#2:上述示例中的单元格高度是否导致观察到错误的滚动

这是我用来计算表视图单元格高度的代码:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSInteger index = indexPath.row;
    ParsedItem* item;
    if (indexPath.section == 0) {
        item = [_parsedItemList.toDoList objectAtIndex:index];
    }
    else {
        item = [_parsedItemList.doneList objectAtIndex:index];
    }

    NSAttributedString* attrString = [[NSAttributedString alloc] initWithString:item.displayText attributes:_tableViewTextAttrNormal];

    CGFloat height = [self textViewHeightForAttributedText:attrString andWidth:300.00];
    return fmaxf(50.0, height);
}

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 50.0;
}

- (CGFloat)textViewHeightForAttributedText:(NSAttributedString*)text andWidth:(CGFloat)width {
    UITextView* calculationView = [[UITextView alloc] init];
    [calculationView setAttributedText:text];
    CGSize size = [calculationView sizeThatFits:CGSizeMake(width, FLT_MAX)];
    return size.height;
}
一般问题:如上所述,我在文档中没有找到任何描述滚动应该如何工作的内容。是否有一条我遗漏的一般规则或原则?如果我只是做错了,我不想添加显式滚动操作