繁体   English   中英

在iOS上,如果drawRect不使用传入的rect,[self setNeedsDisplayInRect:rect]传入rect的关系是否重要?

[英]On iOS, if drawRect doesn't use the rect that was passed in, does it matter if [self setNeedsDisplayInRect:rect] passes in a rect?

也就是说,如果

[self setNeedsDisplayInRect:rect];

会被调用,并为需要重绘的区域非常仔细地计算出rect ,但是如果我们的drawRect代码不关心rect还是仍然绘制所有内容,iOS系统还能以某种方式提高绘制速度吗? (或者可能没有什么改善?)这个问题可能需要一个非常熟悉UIKit / CoreGraphics的人。

有几种方法可能是肯定的:

  1. 您可以裁剪到矩形,在这种情况下,即使在矩形中绘制,也不会绘制任何内容。 在矩形外部绘制不是免费的,但会更便宜。 iOS无法为您执行此操作,因为您可能会故意忽略rect,或者使用rect但还会无条件地在其他范围内绘制其他内容。 (尽管那另一件事可能应该是另一种看法。)
  2. 即使您当前的 drawRect:不使用矩形,您也可以稍后返回该代码进行优化。 您可能已经知道,做到这一点的一种非常好的方法(如果可能的话)是使用矩形来决定要绘制的内容。 即使您现在不这样做,将来也可以这样做,现在指定更改的rect意味着要更改的东西要少得多。
  3. 对#3的推论是,即使现在无法如此优化绘制的内容,您也可以决定在将来的主要版本中完全将视图绘制的内容更改为可以绘制的内容。 同样,现在指定更改的rect意味着将来要做的事少得多。
  4. 子视图。 如果您的视图实际上没有绘制用户在其中看到的某些东西,而是将这些东西委托给了子视图(而不是Cocoa / Cocoa Touch的意义),那么您可以重写setNeedsDisplayInRect:来将setNeedsDisplay:消息发送给子视图—以及调用其框架与rect相交的子视图—才调用super (并且UIView的实现可能已经做到了。您应该对其进行测试。)

如果您的drawRect:实现忽略了传入的rect并绘制了整个视图,则传递给setNeedsDisplayInRect:的rect的任何优化都是setNeedsDisplayInRect:

“需求显示”矩形直接通过; 它唯一的用处是drawRect:实现用于忽略不必要的绘图。 输入drawRect:实现后,系统将无法判断您在传递的rect之外的绘图是否是有意的,因此所有绘图实际上都已发生(包括性能影响)。

取决于您所绘制的内容和方式,将drawRect:实现限制为至少利用传入的rect并不是很困难。您要绘制的所有内容都具有边界rect,无论是文本块还是文本块都可以。贝塞尔曲线路径或图像,或者只是矩形,您正在用某种颜色填充。 CGRectIntersectsRect()测试将每一位包围起来-您不会完全以这种方式将图形限制为通过rect,但是至少要消除不需要绘制的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM