2010-04-01 68 views
4

是否可以在iPhone上的路径中绘制渐变?CGPath中的CGGradient

我正在寻找一个替代Mac OS X的方法

-(void)drawInBezierPath:(NSBezierPath *)path relativeCenterPosition:(NSPoint)relativeCenterPosition of NSGradient. 

回答

12

我认为像这样将工作:

CGContextSaveGState(c); 
CGContextAddPath(c, path); 
CGContextClip(c) 

// make a gradient 
CGColorRef colors[] = { topColor, bottomColor }; 
CFArrayRef colorsArr = CFArrayCreate(NULL, (const void**)colors, sizeof(colors)/sizeof(CGColorRef), &kCFTypeArrayCallBacks); 

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, colorsArr, NULL); 
CFRelease(colorSpace); 
CFRelease(colorsArr); 

// Draw a linear gradient from top to bottom 
CGPoint start = ... 
CGPoint end = ... 
CGContextDrawLinearGradient(c, gradient, start, end, 0); 

CFRelease(gradient); 
CGContextRestoreGState(c); 
+0

THX很多托德! 我已经有相同的代码,但我忘了CGContextAddPath后的CGContextClip .... – catlan 2010-04-03 17:06:19

+0

我试图理解此代码,但“颜色”被声明两次不同类型。我不确定在随后的调用中使用哪一个。 – progrmr 2010-04-17 01:01:34

+0

progrmr,它的错字,应该是: CGColorRef colorRef [] = {topColor,bottomColor}; (NULL,(const void **)colorRef,sizeof(colorRef)/ sizeof(CGColorRef),&kCFTypeArrayCallBacks); – digdog 2010-10-08 21:27:22

1

是的,我是这么认为的,如果我明白你的问题。它参与了一点,但这里是做一个很好的例子:

http://cocoawithlove.com/2008/09/drawing-gloss-gradients-in-coregraphics.html

这是用可可和可可没有做触摸,但它的一切BU NSColor转换。您必须改用UIColor。基本上,你必须创建一个渐变功能,然后使用:

CGShadingCreateAxial() 

确定您的渐变的值。

或者你想要有一个梯度线?