0

我有一个 UITableView 中的部分设置,它们都有一个自定义部分标题视图。一次只有一个部分可以有可见的行。

要创建显示其他单元格行的效果,我基本上使用以下函数:

[self.tableView beginUpdates];

if ( sectionHeaderInsert >= 0 && sectionHeaderInsert <= numberOfSectionsInTableView ) {
    [ticketReastepsScreenView.tableView insertRowsAtIndexPaths:indexPathsInsert withRowAnimation:UITableViewRowAnimationFade];
}

[self updateTmpSelectedNumberToCurrent];

if ( sectionHeaderRemove >= 0 && sectionHeaderRemove <= numberOfSectionsInTableView ) {
    [ticketReastepsScreenView.tableView deleteRowsAtIndexPaths:indexPathsRemove withRowAnimation:UITableViewRowAnimationFade];
}

[self.tableView endUpdates];

现在发生的事情是,最后新部分“打开”而旧部分正确“关闭”,但是:如果我有更多适合屏幕的部分,则(部分)可见的最后一个部分将不会正确重新绘制 - 它完全被白色覆盖。

所有部分都被问到新的高度,我认为它甚至要求新的观点(我有一个数组)。然后要求视图 [view setNeedsDisplay];

当我稍微滚动一下以使最后一个部分标题消失然后再将其滚动回来时,它会再次活跃起来并且可见,直到我再次更改当前打开的部分。

UPD:这种有趣的行为仅在我同时执行 insertRow 和 deleteRow 时才会出现。我也可以简单地关闭一个部分(deleteRow),然后在一个部分触摸动作中打开新的部分(insertRow),行为是不同的。

我还尝试在两个操作之间设置 endUpdates 和 beginUpdates - 没有积极的结果。

UPD2:当过渡到最终位置时(位置很好)我可以看到最后一节标题被正确绘制,但随后消失(没有动画,简单的纯白色)

4

1 回答 1

0

无论真正的问题是什么——我重写了 TableView 的重要部分,我认为我学到的是:

如果您需要 UITableViewCell,请使用 UITableViewCell。如果您需要一个 UIView 作为节标题,请使用 UIView 作为节标题。

我将部分标题与 TableViewCells 混合在一起,只是为了重用其中的一些代码。由于类别只能扩展一个特定的类,我不得不使用委托/提供者方法/对象来重用某些代码。它可能需要更多的子类化,但实际上更安全。

此外,自动滚动到某个位置现在效果明显更好,并且绘图伪影消失了。

于 2011-07-29T12:56:48.043 回答