Quartz2D и градиентная линия - PullRequest
0 голосов
/ 19 апреля 2010

как мне нарисовать градиентную линию с помощью quartz2d?

Ответы [ 2 ]

3 голосов
/ 19 апреля 2010

CGContextDrawLinearGradient рисует градиенты. Используйте CGContextClipToRect (или связанные функции отсечения), чтобы обрезать область, которую вы хотите заполнить градиентом.

Нет поддержки обводки или заливки пути градиентом, вместо этого вы обрезаете область, которую хотите заполнить.

1 голос
/ 20 мая 2012

Я использовал это внутри drawRect: и работал как шарм:

double slope, cosy, siny;
double halfWidth = 2; // the thickness of the line will be 2*halfWith

// the start and end points have to be inside UIView frame coordinates
CGPoint start = CGPointMake(30, 20);
CGPoint end = CGPointMake(80, 90);  

slope = atan2((start.y - end.y), (start.x - end.x));
cosy = cos(slope);
siny = sin(slope);

CGContextRef context = UIGraphicsGetCurrentContext();

CGGradientRef myGradient;
CGColorSpaceRef myColorspace;
size_t num_locations = 2;
CGFloat locations[2] = { 0.0, 1.0 };
CGFloat components[8] = { 1.0, 1.0, 1.0, 1.0,  // Start color (White)
                          1.0, 0.0, 0.0, 1.0 }; // End color (Red)

myColorspace = CGColorSpaceCreateDeviceRGB();
myGradient = CGGradientCreateWithColorComponents (myColorspace, components, locations, num_locations);

CGContextMoveToPoint(context, start.x -halfWidth*siny , start.y +halfWidth*cosy);
CGContextAddLineToPoint(context, end.x -halfWidth*siny , end.y +halfWidth*cosy  );
CGContextAddLineToPoint(context, end.x +halfWidth*siny , end.y -halfWidth*cosy );
CGContextAddLineToPoint(context, start.x +halfWidth*siny, start.y -halfWidth*cosy);
CGContextAddLineToPoint(context, start.x -halfWidth*siny , start.y +halfWidth*cosy);    
CGContextClip(context);

CGContextDrawLinearGradient (context, myGradient, start, end, 0);
CGColorSpaceRelease( myColorspace );
CGGradientRelease (myGradient);
...