繁体   English   中英

setNeedsDisplay并不总是调用drawRect

[英]setNeedsDisplay doesn't always call drawRect

我在自定义表格单元格中有自定义视图。 每次更改自定义视图上的特定属性时,我都会调用[self setNeedsDisplay] ,它会重绘- (void)drawRect:(CGRect)rect的视图。 该属性在表视图委托的tableView:cellForRowAtIndexPath: 但是当表格视图大于屏幕并且必须重复使用单元格时,每次setNeedsDisplay都不会调用drawRect 特别是当我快速拨动桌子时。 慢滚动工作正常。 这导致第一个和最后一个单元格中的信息通常不正确。

在日志中我可以看到,通常情况下,每次调用setNeedsDisplay都会调用drawRect ,但是当我快速滚动表视图时,调用setNeedsDisplay比调用drawRect 当然,这里应该有一对一的比例。

我在普通的UIView中使用相同的自定义视图,每次调用setNeedsDisplay时它都会重绘得很好。 问题似乎与表视图和重用单元格隔离。

有谁知道这里发生了什么? 有没有其他方法可以强制自定义视图重绘自己?

在我发现问题之前,我认为我在这个问题上挣扎了近一个星期。 在这里,我没有欺骗你:

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

是的,我非常,非常尴尬。

setNeedsDisplay只会调用drawRect:如果视图是可见的,否则它会使视图的图层无效,而drawRect:会在它变为可见时被调用。

滚动表格视图时,表格视图将请求单元格,希望将它们添加到视图中。 如果滚动速度足够快,一些单元格将花费很长时间来准备,并且当它们准备好时,它们应该定位的位置是在屏幕外。 在这些情况下,表视图会丢弃它们,而不是将它们添加到滚动视图中(因此不会调用drawRect:

您应该调用[_table_ reloadData]来重绘表格。 不是[_table_cell_ setNeedsDsiplay]

听起来有两种情况可以刷新视图:如果内部值发生变化(并调用[self setNeedsDisplay]强制更新),并且如果tableview正在请求绘制(或重用)单元格。 在这种情况下,您没有明确地重新绘制该自定义视图。

根据文件:

tableView中的表视图委托:cellForRowAtIndexPath:在重用单元格时应始终重置所有内容。

如果tableview是回收单元格,它将返回旧值仍然存在的单元格。 您可以确保更新内容。 根据您设置自定义表格单元格的方式,您可能需要做更多工作以确保视图处于最新状态,但最简单的方法是在自定义表格单元格处理程序中强制调用[myCustomView setNeedsDisplay]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM