2

就我而言,在drawRect:调用每个单曲后不会立即setNeedsDisplay调用。例如,我认为以下代码与我的情况相同。

for (int i = 0; i < 100; ++i)
{
    [self setNeedsDisplay];
}
4

2 回答 2

9

文档中:

当您的视图的实际内容发生变化时,您有责任通知系统您的视图需要重绘。为此,您可以调用视图的 setNeedsDisplay 或 setNeedsDisplayInRect: 方法。这些方法让系统知道它应该在下一个绘图周期更新视图。因为它要等到下一个绘图周期才更新视图,所以可以在多个视图上调用这些方法同时更新它们。

drawRect:只会在绘制下一帧时及时调用,这意味着您的整个循环将导致drawRect:在下一次渲染迭代中仅被调用一次。这节省了不必要的计算,因为它避免了绘制永远不会显示在屏幕上的框架。它还允许您在代码中的不同位置进行多项更改,每次都通知视图需要刷新,而不会降低性能,因为调用setNeedsDisplay只会告诉绘图系统下一帧需要重绘;它不会强制立即渲染可能永远不会显示在屏幕上的帧。

于 2015-05-05T07:35:46.020 回答
1

setNeedsDisplay仅将视图标记为需要再次显示。实际的绘图调用在主线程的下一次运行循环迭代中完成,一次。这允许绘图系统进行一些优化并“组合”对setNeedsDisplay.

于 2015-05-05T07:36:41.413 回答