Cocoa 如何将视图连接到图形上下文?

Cocoa 如何将视图连接到图形上下文?,cocoa,cocoa-touch,xcode,Cocoa,Cocoa Touch,Xcode,我对XCode完全是个新手,所以我一直在攀登Quartz2D学习曲线。我知道只要需要刷新视图的图形,就会调用视图的drawRect方法,并且setNeedsDisplay方法会激活重画 但我找不到的是图形上下文和特定视图之间关系的清晰解释。图形上下文本身显然不是视图的实例变量,因此如果我想修改视图,并使用CGContext创建复杂路径。。。方法,将图形上下文与我希望更改的视图结合起来需要什么代码 提前感谢您对这个问题的指导 jrdoner您可以创建图形上下文,但这仅在复杂的绘图操作中才需要。在大

我对XCode完全是个新手,所以我一直在攀登Quartz2D学习曲线。我知道只要需要刷新视图的图形,就会调用视图的drawRect方法,并且setNeedsDisplay方法会激活重画

但我找不到的是图形上下文和特定视图之间关系的清晰解释。图形上下文本身显然不是视图的实例变量,因此如果我想修改视图,并使用CGContext创建复杂路径。。。方法,将图形上下文与我希望更改的视图结合起来需要什么代码

提前感谢您对这个问题的指导


jrdoner

您可以创建图形上下文,但这仅在复杂的绘图操作中才需要。在大多数情况下,它是为您完成的。您只需要通过调用
UIGraphicsGetCurrentContext()
来获取上下文

当框架确定某个视图需要重新绘制时(出于各种原因,其中一个原因是您通过调用
setNeedsDisplay:
)来指示它),它将为该视图生成(或恢复)图形上下文,并在调用
-drawRect:
之前将其设为当前上下文。然后,你的工作就是在提供给你的上下文中进行绘制。之后,框架的问题是剪裁生成的上下文,将其与其他上下文混合,最后将其绘制到屏幕内存中


-drawRect:
中绘制太多复杂的图形时一定要小心谨慎,如果可以的话。iPhone没有台式机那么强大的CPU,建议您使用图像而不是路径来完成大部分绘图工作。苹果甚至从Mac上删除了许多更方便的绘图包装,几乎是故意劝阻开发人员不要过度使用核心图形。

我假设您是在
UIView
子类的
-(void)drawRect:(CGRect)rect
方法中创建路径的

在drawRect内部,您可以通过调用(
CGContextRef)UIGraphicsGetCurrentContext(void)来访问图形上下文

例如:


Xcode是IDE;它与您使用的框架无关。你可以使用vim/emacs来攀爬Quartz 2D学习曲线,如果你愿意的话(尽管在设备上运行会很棘手)。如果你能弄清楚这个问题是针对Cocoa(Mac)还是Cocoa Touch(iPhone),可能会有所帮助。回答得很好。顺便说一句,关于在drawRect中进行复杂绘图,您所说的非常有趣,我想读更多。您是否知道苹果公司有任何官方文档(或任何其他讨论)关于优先加载图像而非编程绘图的主题?接下来,您会将编程绘制的内容写入CGLayer(而不是在drawRect中重复重画:)是加载和操作图像的可接受替代方案吗?关于苹果的建议,这些建议来自我的WWDC笔记,他们在笔记中讨论了为什么他们想要带端盖的拉伸图像,而不是按钮上的渐变。iPhone似乎不像Mac那样有“绘制性能指南”。虽然我的笔记来自2008年的会议,但如果您有权访问,我建议您使用WWDC 2009年会议#132(iPhone视图和动画)。关于GCLayer与drawRect:,重点是CGGradient和CGPath的CPU成本很高,这意味着电池成本很高。因此,在实际情况下,我们应该避免它们。他们当然不是被禁止的:D
- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    [[UIColor grayColor] set];
    UIRectFill ([self bounds]);
    CGContextBeginPath (context);
    CGContextMoveToPoint (context, 75, 10);
    CGContextAddLineToPoint (context, 10, 150);
    CGContextAddLineToPoint (context, 160, 150);
    CGContextClosePath (context);
    [[UIColor redColor] setFill];
    [[UIColor blackColor] setStroke];
    CGContextDrawPath (context, kCGPathFillStroke);
}