首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在iOS上,如果drawRect不使用传入的rect,那么[self setNeedsDisplayInRect: rect ]传入rect有关系吗?

在iOS上,如果drawRect不使用传入的rect,那么[self setNeedsDisplayInRect: rect ]传入rect有关系吗?
EN

Stack Overflow用户
提问于 2012-04-23 15:08:58
回答 2查看 259关注 0票数 0

也就是说,如果

代码语言:javascript
复制
[self setNeedsDisplayInRect:rect];

但是如果我们的drawRect代码不关心rect并绘制所有内容,那么iOS系统还能以某种方式提高绘制速度吗?(或者可能只有很少的改进?)这个问题可能需要非常熟悉UIKit/CoreGraphics的人。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-23 15:35:23

答案有几种可能是肯定的:

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

Stack Overflow用户

发布于 2012-04-23 15:34:27

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

"needs“rect是直接传递的;它唯一的作用是让drawRect:实现用来忽略不必要的绘制。一旦进入drawRect:实现,系统就无法判断您在传递的rect之外的绘制是否是有意的,因此所有绘制都会发生(包括性能影响)。

根据您绘制的是什么以及如何绘制,将drawRect:实现限制为至少使用传入的rect并不是太难。你想要绘制的所有东西都有一个边界矩形,无论它是一大块文本、一条贝塞尔曲线路径、一幅图像,还是你正在用某种颜色填充的矩形。使用CGRectIntersectsRect()测试围绕绘制的每一位--这样不会将绘制完全限制在传入的rect中,但至少可以消除需要绘制的任何未接触到该rect的内容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10276216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档