我有一个UITableView
,有两个部分。项目可以从一个部分移动到另一个部分,如下图所示。
基本互动如下:
注意,我使用deleteRowsAtIndexPaths
和insertRowsAtIndexPaths
与CATransaction
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...
;滚动发生在插入之前,以便观察动画插入例如,在下图中,滑动底部的一个单元格,表格视图滚动,然后插入顶部的底部...
我说某些情况,因为如果插入发生在顶部(第0部分),则会观察到此行为。当删除/插入从第0部分到第1部分时,表视图根本不滚动。
我也看到了其他一些我不明白的行为。在某些单元格具有多行文本(单元格大小不同的情况下)的情况下 - 滚动似乎"不起作用"。首先滚动量只是错误;但是,当插入发生在第0部分时,测试所有单元格是单行显示一致滚动。
下图显示错误的滚动:
我有两个特定的问题和一个一般问题。
具体问题#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;
}
一般性问题:正如我上面提到的,我还没有在文档中找到任何描述滚动应该如何工作的内容。我错过了一般规则或校长吗?如果我只是做错了,我不想添加明确的滚动操作...