如果我经常调用 setneedsdisplay,drawrect 多久会被调用一次?这是为啥?

Posted

技术标签:

【中文标题】如果我经常调用 setneedsdisplay,drawrect 多久会被调用一次?这是为啥?【英文标题】:If I call setneedsdisplay frequently, how often will the drawrect be called? why is that?如果我经常调用 setneedsdisplay,drawrect 多久会被调用一次?这是为什么? 【发布时间】:2015-05-05 07:21:44 【问题描述】:

在我的例子中,drawRect: 不会在每个 setNeedsDisplay 被调用后立即被调用。例如,我认为以下代码与我的情况相同。

for (int i = 0; i < 100; ++i)

    [self setNeedsDisplay];

【问题讨论】:

这正是你想要的,这样 ios 就不会扼杀你的表现。 @gnasher729 我从服务器接收了一些串行点数据,并根据这些点在drawRect:中画了一条线,但有些特殊点需要特殊处理。所以当一个特殊的点来的时候,我调用'setNeedsDisplay',但它恰好没有调用'drawRect:' 【参考方案1】:

来自documentation:

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于如果我经常调用 setneedsdisplay,drawrect 多久会被调用一次?这是为啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 layoutSubviews 中调用 setNeedsDisplay?

setNeedsDisplay 未按预期在子视图中触发 drawRect

setNeedsDisplay 只被调用一次

调用 setNeedsDisplay 时的 Swift 奇怪行为

setNeedsDisplay() 没有调用 draw(_ rect: CGRect)

UICollectionView 在 UICollectionViewCells 上调用 setNeedsDisplay