如果我经常调用 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 时的 Swift 奇怪行为
setNeedsDisplay() 没有调用 draw(_ rect: CGRect)
UICollectionView 在 UICollectionViewCells 上调用 setNeedsDisplay