也就是说,如果
[self setNeedsDisplayInRect:rect];
被调用了,rect
对需要重绘的区域进行了非常仔细的计算,但是如果我们的drawRect
代码不关心rect
,反正什么都画出来,iOS系统还能以某种方式提高绘制速度吗?(或者可能改进很少?)这个问题可能需要非常熟悉 UIKit/CoreGraphics 的人。
也就是说,如果
[self setNeedsDisplayInRect:rect];
被调用了,rect
对需要重绘的区域进行了非常仔细的计算,但是如果我们的drawRect
代码不关心rect
,反正什么都画出来,iOS系统还能以某种方式提高绘制速度吗?(或者可能改进很少?)这个问题可能需要非常熟悉 UIKit/CoreGraphics 的人。
有几种方法可以得到肯定的答案:
drawRect:
不使用矩形,您也可以稍后返回该代码来优化它。正如您可能知道的那样,一种非常好的方法(如果可能的话)是使用矩形来决定您绘制的内容。即使您现在不这样做,将来也可能会这样做,并且现在指定更改的矩形意味着那时要更改的内容要少得多。setNeedsDisplayInRect:
以将消息发送到setNeedsDisplay:
子视图——并且只有框架与矩形相交的子视图——在调用super
. (并且 UIView 的实现可能已经这样做了。你应该测试它。)如果您的drawRect:
实现忽略传入的矩形并绘制整个视图,则传递给的矩形的任何优化setNeedsDisplayInRect:
都是徒劳的。
“需求显示”矩形直接通过;它唯一的用途是drawRect:
实现用于忽略不必要的绘图。一旦你的drawRect:
实现被输入,系统就无法判断你在传递的矩形之外的绘制是否是故意的,所以所有的绘制都真的发生了(包括性能影响)。
根据您正在绘制的内容和方式,将您的drawRect:
实现限制为至少使用传入的矩形并不难。您要绘制的所有内容都有一个边界矩形,无论是文本块还是贝塞尔路径或图像或只是一个矩形,你正在填充一些颜色。用测试围绕每一位绘图CGRectIntersectsRect()
- 您不会以这种方式将绘图完全限制为传入的矩形,但您至少会消除需要绘制的任何不触及该矩形的东西。