关于 drawRect 和 setNeedsDisplay

引言:

iOS的绘图操作是在UIView类的drawRect方法中完成的,所以如果我们要想在一个UIView中绘图,需要写一个扩展UIView 的类,并重写drawRect方法,在这里进行绘图操作,程序会自动调用此方法进行绘图。


# 一. drawRect

当一个视图被刷新时,该视图的drawRect函数被调用。每次调用该函数时,它都绘制内容到视图。 由于drawRect调用非常频繁,所以它应该是一个非常轻量级的函数。不要在drawRect函数内分配内存,而且坚决不要从你的代码中直接调用drawRect函数)。


# 二. setNeedsDisplay

那么,如果你不能在自己的代码中调用drawRect函数,如何才能刷新视图呢?答案是调用函数setNeedsDisplay

由于移动设备上资源稀缺,iOS会尽可能试图优化资源密集的处理过程。向屏幕上绘制内容需要大量的资源,所以使用setNeedsDisplay函数设置视图,而不是手动调用drawRect函数刷新视图。 当一个视图调用setNeedsDisplay函数设置了标志,iOS会在最有效率的时候自动刷新视图。drawRect和setNeedsDisplay之间的时间延迟难以察觉,在毫秒级。但是,通过让iOS自己调度而调用drawRect, iOS可以优化多个drawRect函数调用,然后以最高效的方式来执行命令。


# 三. 注意事项

为了优化iOS应用程序的性能,iOS只绘制屏幕上可见的视图。这意味着,如果一个视图在屏幕之外或者被另一个视图所覆盖,iOS不会刷新该视图的这部分内容。