2013-05-09 94 views
9

它会把我为什么这个代码,里面drawRect:,工作原理:为什么 - [UIColor setFill]在不参考绘图上下文的情况下工作?

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现在将填充颜色,ISN”这只是奇怪和错误?至少我希望通过调用一些CGContext方法来设置填充...但现在,不是代表颜色,而是继续并且做一些事情来改变我的绘图的上下文。

有人可以解释幕后发生了什么,因为我完全迷失在这里吗?

我没有在发布前检查这些引用:

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

回答

12

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

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

它可能会帮助你很多,在这个阶段你的iOS学习,读我的书的绘画章:http://www.apeth.com/iOSBook/ch15.html#_graphics_contexts

+1

多谢@马特,特别是对链接,这将是非常有用的我:) – 2013-05-09 16:41:15

+1

你的书是真的很有帮助。最后,有人以一种合理的方式分解了图形上下文和UIKit与CoreGraphics的概念!谢谢。 – d512 2013-12-12 22:34:06

+1

很高兴能帮到你!最初我也发现了同样的事情,所以我花了很多精力来解释清楚。 – matt 2013-12-13 00:56:53

6

UIColor setFill执行写入来获得当前的图形上下文,然后设置当前上下文中的颜色。本质上,它可以实现这个要求:

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

我很欣赏它的确如此,但我觉得它很奇怪,认知失调来自这样一个事实,即'UIColor'是一个'颜色'对象,而不是'上下文'对象。 – 2013-05-09 16:42:46

+3

像'setFill'这样的方法,在使用当前上下文的时候很方便。另外看看'NSString drawAtPoint:'('NSString'的类别方法)这样的方法。这也是一种方便的方法,可以使用较低级别的Core Graphics API更容易地使用更高级别的类。 – rmaddy 2013-05-09 16:46:59

相关问题