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

时间:2014-04-22 12:09:19

标签: ios uitableview uiscrollview

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

enter image description here

基本互动如下:

  • 你刷一个单元格/行
  • 该单元格从其部分中移除
  • 将该单元格添加到其他部分的底部

注意,我使用deleteRowsAtIndexPathsinsertRowsAtIndexPathsCATransaction s的序列。删除然后添加isn是唯一的表操作;对于一般方法,我希望链接insert / delete / update动画在前面的操作完成时启动。这是一个例子:

[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...
  • 可能不需要更改/滚动
  • (在某些情况下)表视图滚动后续insertRows...;滚动发生在插入之前,以便观察动画插入

例如,在下图中,滑动底部的一个单元格,表格视图滚动,然后插入顶部的底部...

enter image description here

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

我也看到了其他一些我不明白的行为。在某些单元格具有多行文本(单元格大小不同的情况下)的情况下 - 滚动似乎"不起作用"。首先滚动量只是错误;但是,当插入发生在第0部分时,测试所有单元格是单行显示一致滚动。

下图显示错误的滚动:

enter image description here

我有两个特定的问题和一个一般问题。

具体问题#1 UITableView是否有层次结构,以便第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;
}

一般性问题:正如我上面提到的,我还没有在文档中找到任何描述滚动应该如何工作的内容。我错过了一般规则或校长吗?如果我只是做错了,我不想添加明确的滚动操作...

0 个答案:

没有答案