为什么-[UIColor setFill]可以在不引用绘图上下文的情况下工作?

13

我不明白为什么这段代码能在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个回答

14
我的观点是,UIColor对象接收到一个setFill消息,然后一些堆栈理解这个UIColor现在将成为填充颜色,这不是很奇怪和错误吗?至少我希望通过调用一些CGContext方法来设置填充...但现在,UIColor不再表示颜色,而是执行某些操作以更改我的绘图上下文。
这是因为所有这些都发生在当前CGContext中。这就是为什么你的代码只有在存在当前CGContext时才起作用(例如,在drawRect:或UIGraphicsBeginImageContextWithOptions块中)。
在你iOS学习的这个阶段,阅读我的书中的绘图章节可能会对你有很大帮助:http://www.apeth.com/iOSBook/ch15.html#_graphics_contexts

1
非常感谢@matt,特别是提供的链接,对我来说将会非常有用 :) - Morgan Wilde
1
你的书非常有帮助。终于有人以一种易于理解的方式分解了图形上下文和UIKit与CoreGraphics的概念!谢谢。 - d512
2
很高兴能帮上忙!起初我也觉得这个东西很困惑,所以我花了很多心思来清楚地解释它。 - matt

7
UIColor setFill 方法的实现是获取当前的图形上下文,然后在该上下文中设置颜色。它本质上为您完成以下操作:
UIColor *color = ... // some color
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(ctx, color.CGColor);

我确实欣赏它的功能,但我发现它很奇怪,认知失调来自于UIColor是一个color对象,而不是一个context对象。 - Morgan Wilde
3
setFill 这样的方法存在的意义就是为了在当前上下文中更方便地操作。同时,还需要看一下类似于 NSString drawAtPoint: 这样的方法(这是 NSString 的一个分类方法)。它也是一种方便的方法,使得更高级别的类可以更轻松地使用底层的 Core Graphics API。 - rmaddy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接