代码之家  ›  专栏  ›  技术社区  ›  kareman

setNeedsDisplay并不总是调用drawRect

  •  10
  • kareman  · 技术社区  · 17 年前

    [self setNeedsDisplay] 这将在中重新绘制视图 - (void)drawRect:(CGRect)rect . 该属性在表视图委托的 tableView:cellForRowAtIndexPath: drawRect 不是每次都打电话 setNeedsDisplay 是尤其是当我快速地摆弄桌子的时候。慢速滚动效果很好。这导致第一个和最后一个单元格中的信息通常不正确。

    在日志中,我通常可以看到,每次调用 有人打电话给我 画矩形 设置需要显示 比 画矩形 . 当然这里应该有一对一的比例。

    我在普通UIView中使用相同的自定义视图,每次调用时它都会完美地重新绘制 设置需要显示

    有人知道这里发生了什么吗? 是否有其他方法强制自定义视图重新绘制自身?

    4 回复  |  直到 17 年前
        1
  •  13
  •   kareman    17 年前

    我想在我发现问题之前,我与这个问题斗争了将近一周。给你,我不骗你:

    指向此自定义视图的指针是在.m文件而不是.h文件中定义的,使其成为类变量而不是实例变量。

    是的,我非常非常尴尬。

        2
  •  7
  •   rpetrich    17 年前

    setNeedsDisplay 我只会打电话 drawRect: 如果视图可见,则会使视图的图层和图层无效 drawRect: 将在它确实变为可见时调用。

    drawRect:

        3
  •  1
  •   amattn    17 年前

    你应该打电话来 [_table_ reloadData] 重新绘制表格。不 [_table_cell_ setNeedsDsiplay]

        4
  •  0
  •   Ramin    17 年前

    看起来有两种情况会刷新视图:如果内部值发生更改(并且您调用 [self setNeedsDisplay] 强制更新),以及tableview是否请求绘制(或重用)单元格。在这种情况下,您没有显式地重新绘制该自定义视图。

    tableView:cellForRowAtIndexPath:中表视图的委托应 总是 重新使用单元格时重置所有内容。

    若tableview正在回收单元格,它将返回一个仍保留旧值的单元格。由您确定内容是否已更新。根据您设置自定义表单元格的方式,您可能需要做更多的工作来确保视图是最新的,但最简单的事情是在自定义表单元格处理程序中强制调用 [myCustomView setNeedsDisplay] .