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