Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 处理drawRect多个调用_Iphone_Cocoa Touch_Uiview - Fatal编程技术网

Iphone 处理drawRect多个调用

Iphone 处理drawRect多个调用,iphone,cocoa-touch,uiview,Iphone,Cocoa Touch,Uiview,我发现我的drawRect被调用了不止一次。不幸的是,这产生了双重绘制一切的不幸副作用,因为我的所有子视图都是在drawRect(我是严格的无神论者w.r.t.界面生成器)中绘制的 处理对drawrect的多次调用的最佳方法是什么?检查是否再次调用的标志?或者清除整个视图并从头开始重新绘制(如我所做的?当UIKit调用drawRect:时,应该已经为您清除设置为draw-into的图形上下文(除非您已将ClearContextBeforeDrawing属性设置为否)。您是否正在手动调用drawR

我发现我的drawRect被调用了不止一次。不幸的是,这产生了双重绘制一切的不幸副作用,因为我的所有子视图都是在drawRect(我是严格的无神论者w.r.t.界面生成器)中绘制的


处理对drawrect的多次调用的最佳方法是什么?检查是否再次调用的标志?或者清除整个视图并从头开始重新绘制(如我所做的?

当UIKit调用
drawRect:
时,应该已经为您清除设置为draw-into的图形上下文(除非您已将
ClearContextBeforeDrawing
属性设置为
)。您是否正在手动调用
drawRect:
而不是调用
setNeedsDisplay
/
setNeedsDisplayInRect:

此外,每个视图只负责绘制其自身的内容,而不负责绘制其子视图的内容。

您所说的“您的子视图是在drawRect中绘制的”是什么意思?如果您的意思是要调用drawRect中的-addSubview:,请不要这样做。将这些视图移动到更合适的位置,仅在需要时调用(如果子视图始终存在,则可能是视图的-initWithFrame:方法),并仅使用drawRect进行自定义绘图


严格地说,多次调用是-drawRect的全部要点。它被调用来在需要时更新视图的小部分。如果您正在更新视图(移动视图、更新superview等),它实际上经常被调用,因此它应该尽可能简单、快速,以避免性能问题。

例如,如果视图有UIButton,该怎么办?视图是否必须重新绘制UIButton?UIButton是UIView内容的一部分视图不能“有UIButton”,它可以包含UIButton,因为该按钮将是其子视图。子视图不被视为视图内容的一部分。