【发布时间】:2011-01-09 10:18:53
【问题描述】:
我有一个自定义 UIView,它是 UITableViewCell 的子视图。绘制单元格时,我的自定义视图也是如此,在我的 UIView 子类中正确调用 drawRect:。重新加载单元格时,会正确绘制视图(调用drawRect:)。
当某个事件发生时(例如计时器),我想重绘视图而不必重新加载整个单元格。 (这不是单元格中的唯一视图。)
但是,当我在子视图上调用 setNeedsDisplay 时,什么也没有发生。
我猜当我的视图的 drawRect: 被调用时,生成的图像被缓存在某处的背景中,这样当我调用 setNeedsDisplay 时,该背景被重绘到屏幕上,但我的 drawRect: 调用永远不会再次调用。
为什么drawRect:在创建单元格后就再也没有被调用过?
编辑:单元格的子视图是从笔尖创建的。即:从 nib 加载 UIViewController,并将其视图添加到 UITableViewCell。
我使用不是从 nib(由代码创建)加载的自定义视图从头开始制作了一个测试用例,它按预期工作:setNeedsDisplay 导致 drawRect: 调用。它必须是在 .xib 文件中设置的东西,或者是在从 nib 加载视图时发生的与视图不同的东西。
【问题讨论】:
-
你是否从主线程调用 setNeedsDisplay?您确定将其发送到正确的视图(即,如果从单元格完成应该没问题,但在完成 somewhere 并且单元格已被替换(即通过滚动)时很容易出错。
-
是的,正在从主线程调用 setNeedsDisplay。我什至尝试过使用 performSelectorOnMainThread:... 推迟它。请参阅有关来自 nib(.xib) 文件的视图的编辑。
-
您找到解决方案了吗?
-
我从来没有找到原因。我更改了我的代码以编程方式创建视图,而不是从 nib/xib 文件中获取它,并且从那以后没有重新讨论过这个问题。
标签: iphone uiview uitableview drawrect