【问题标题】:Last Section Header View not painted after insertRowForIndexpath and deleteRowForIndexpath在 insertRowForIndexpath 和 deleteRowForIndexpath 之后未绘制最后一节标题视图
【发布时间】:2011-07-19 21:43:42
【问题描述】:

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

【问题讨论】:

  • 尝试以编程方式将表格视图滚动到打开的部分
  • 好主意 - 让它更有用 - 但不能解决问题。我想我在自定义部分标题视图的 layoutSubviews 方法中发现最终更新的大小为 0,0,0,0 - 这将使其不可见。怎么可能?

标签: iphone objective-c uitableview sections


【解决方案1】:

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

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

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

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

【讨论】:

  • 除了一个:如果顶部的单元格打开并且我在底部切换一个,则切换部分的标题视图将从顶部向下移动 - 从 0,0 开始。这是由于我想的帧更新。但是我怎样才能在不保存状态的情况下阻止这种情况呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-07
  • 1970-01-01
  • 2011-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多