【问题标题】:Why does my UIView subclass not redraw after I call setNeedsDisplay?为什么我调用 setNeedsDisplay 后我的 UIView 子类不重绘?
【发布时间】: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


【解决方案1】:

我自己也遇到了同样的问题。对我来说,这是我的 XIB 的一个问题 - 我正在继承 UIView - 所以相应地进行调整。我在 IB 中的错误是我将控件附加到“文件的所有者”而不是将它们附加到 UIView。我敢肯定,在我缺乏经验的情况下,还有一些更大的事情正在发生——也许有更多经验的人可以详细说明。

希望有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多