为什么 - [UIColor setFill]在不参考绘图上下文的情况下工作?

时间:2013-05-09 16:33:18

标签: ios cocoa-touch graphics uicolor

为什么这个代码在drawRect:内有效,这让我感到很震惊:

UIBezierPath *buildingFloor = [[UIBezierPath alloc] init];
// draw the shape with addLineToPoint
[[UIColor colorWithRed:1 green:0 blue:0 alpha:1.0] setFill]; // I'm sending setFill to UIColor object?
[buildingFloor fill]; // Fills it with the current fill color

我的观点是,UIColor对象得到一条消息setFill然后以某种方式堆栈理解这个UIColor现在将是填充颜色,这不是奇怪和错误?至少我希望通过调用一些CGContext方法设置填充...但现在不是代表颜色,UIColor继续并做一些事情来改变我的绘图的上下文。

有人可以解释幕后发生的事情,因为我完全迷失在这里吗?

我在发布之前检查了这些参考文献:

http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIColor_Class/Reference/Reference.html http://developer.apple.com/library/ios/#documentation/uikit/reference/UIBezierPath_class/Reference/Reference.html

2 个答案:

答案 0 :(得分:14)

  

我的观点是,UIColor对象获取消息setFill,然后以某种方式堆栈理解这个UIColor现在将是填充颜色,这不是奇怪和错误吗?至少我希望通过调用一些CGContext方法设置填充......但现在不是代表颜色,UIColor继续并做了一些事情来改变我的绘图的上下文。

这是因为所有这一切都发生在当前的 CGContext中。这就是为什么你的代码只有在当前的CGContext时才有效(例如,在drawRect:UIGraphicsBeginImageContextWithOptions块中)。

在iOS学习的这个阶段,阅读本书的绘图章节可能会对你有所帮助:http://www.apeth.com/iOSBook/ch15.html#_graphics_contexts

答案 1 :(得分:6)

编写UIColor setFill的实现是为了获取当前的图形上下文,然后在当前上下文中设置颜色。基本上它是为你做的:

UIColor *color = ... // some color
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(ctx, color.CGColor);