在[superview drawRect:]中调用[subview setNeedsDisplay]是否安全?

时间:2016-12-22 22:14:25

标签: ios uiview uikit drawrect

我在UIGraphicsGetImageFromCurrentContext内使用drawRect并将子视图的属性设置为返回的UIImage。这最终会在子视图中触发setNeedsDisplay

这有副作用吗?

基本上,如果在superview的drawRect方法中调用setNeedsDisplay,子视图是否会始终调用其drawRect方法?或者子视图是否会被视为“已经显示”,这意味着不会进行更新?

1 个答案:

答案 0 :(得分:1)

来自邮件列表:http://lists.apple.com/archives/Cocoa-dev/2005/Jul/msg01697.html

  

如果从drawRect:中调用setNeedsDisplay:,将设置该标志,但只要drawRect:返回,它将再次被清除。因此,当时间到达时,标志清除,并且不再调用drawRect:

     

-drawRect只能用于绘图。绝对不应在drawRect:中完成调整大小,重新定位以及添加或删除子视图。可能会导致不正确的行为。 AppKit合理地依赖于视图层次结构在绘制视图层次结构的过程中保持不变。

     

此外,不要在drawRect中调用-display或variants或-drawRect:或者您邀请无限递归并崩溃。

上面的代码片段正在回答这个问题:http://lists.apple.com/archives/Cocoa-dev/2005/Jul/msg01693.html

  

概述

     

我有一个管理多个子视图的NSView(viewA)。这个观点是   drawRect包含用于定位和调整其所有子视图的代码   相应地调用每个子视图的setNeedsDisplay:YES   方法。其中一个子视图也是NSView(viewB),它也是   有多个子视图。

     

问题

     

如果调整包含viewA的窗口,则调用viewA的drawRect方法   被调用,但由于某些未知原因,viewB的drawRect方法是   尽管是viewA的drawRect方法,但并不总是被调用   调用viewB的setNeedsDisplay:YES方法。 drawRect方法   与所有viewA相关联的其他子视图虽然被调用。

     

问题

     

任何人都可以建议为什么viewB的drawRect方法是   在superview发送setNeedsDisplay之后并不总是被调用   信息?任何关于我做错事的想法都会受到赞赏。

相关问题