为什么这个代码在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
答案 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);