我正在处理Core Graphic的某些内容,并且正在寻找有关两个主题的其他说明。

drawRect:
我对此有所了解,并且知道UIView的所有绘图方面都在这里进行,但是不清楚幕后发生的事情。当我创建一个UIView并填写drawRect然后将另一个对象的UIView设置为该自定义视图时,会发生什么情况?何时调用drawRect?

CGGraphicsContext:
我知道这是什么目的,并且理解了这个概念,但是我无法确切知道它是如何工作的。
例如:

CGContextSaveGState(context);
CGContextAddRect(context, rect);
CGContextClip(context);
CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0);
CGContextRestoreGState(context);

上面的代码在我的应用中,可以正常工作。让我感到困惑的是它的工作方式。保存/还原上下文的想法很有意义,但是似乎我确实是在保存一个上下文,使用完全相同的上下文进行更改,然后再次还原相同的上下文。好像我要保存一个上下文,然后在该上下文之上编写内容,只是为了还原它。如何将其保存到还原时的状态,即它是上下文的实例,而不是用于更改的实例?您在每种情况下都使用变量上下文的相同引用。

最后,对于使用Core Graphics的实践项目或示例的任何资源,我将不胜感激。我正在寻求提高自己的技能,因为目前我显然没有多少。

最佳答案

当我创建一个UIView并填写drawRect然后将另一个对象的UIView设置为该自定义视图时,会发生什么情况?何时调用drawRect?

将视图添加到“实时”视图图会将视图的框架标记为需要显示。然后,主运行循环创建并合并无效的矩形,并很快返回以调用图形。失效后不会立即绘制。这是一件好事,因为例如调整大小会导致严重的透支-多余的工作会破坏许多应用程序的绘制性能。绘制时,将创建一个上下文以渲染到-最终输出到其目的地。

图形上下文是抽象的,可以自由地针对其目的地进行最佳工作-目的地可以是设备/屏幕,位图,PDF等。但是,上下文句柄(CGContextRef)本身引用目的地并拥有一组参数关于其状态(these parameters are all documented here)。这些参数集的操作类似于堆栈:Push = CGContextSaveGState,Pop = CGContextRestoreGState。尽管上下文指针没有改变,但是参数集的堆栈正在改变。

关于资源,请参见Programming with Quartz。它已经8岁了,最初是为OS X编写的-但最终并没有多大关系,因为从那时起绘图系统和API的基础并没有真正显着发展-这就是您的意图专注在。 API已进行了扩展,因此最好回顾一下自10.4以来引入的API,并查看它们解决了哪些问题,但这对您而言是秘密的一件事,因为它有助于保持对绘图系统基本操作的关注。请注意,iOS排除了某些功能(例如,我经常认为是由于浮点性能和内存限制),因此每个示例都可能无法在iOS上使用,但据我所知没有更好的指南。

提示:如果您使用Quartz而不是AppKit / UIKit,则可以在OS X和iOS上轻松重用您的绘图代码。另外,Quartz API的更新频率较低(即,这些API的寿命更长)。

关于ios - drawRect和CGGraphicsContext如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18521540/

10-13 03:49