ios – 沿弯曲的UIBezierPath绘制梯度

前端之家收集整理的这篇文章主要介绍了ios – 沿弯曲的UIBezierPath绘制梯度前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在一个应用程序中,我绘制一个弯曲的UIBezierPath一个MKOverlayPathView类来显示飞行路线.这是我使用的代码

06000

- (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context{

    self.mapRect = mapRect;

    CGContextSetRGBFillColor(context,1.0,1.0);
    CGContextSetRGBStrokeColor(context,0.0,1.0);
    CGContextSetLineWidth(context,mapRect.size.height/700);
    CGContextSetLineJoin(context,kCGLineJoinRound);
    CGContextSetLineCap(context,kCGLineCapRound);

    CGContextAddPath(context,[self pathForOverlayForMapRect:mapRect].CGPath);

    [self updateTouchablePathForMapRect:mapRect];

    CGContextDrawPath(context,kCGPathFillStroke);

}

这是正常工作,但我想要沿着该路径绘制一个渐变,而不是只填充颜色.这是开始变得非常棘手的地方.

我已经尝试了CGContextDrawLinearGradient(),但它还没有让我有用的.

解决方法

诀窍是使用行的笔画路径(CGContextReplacePathWithStrokedPath)并剪辑它(CGContextClip)来限制渐变到路径:
// Create a gradient from white to red
CGFloat colors [] = {
    1.0,1.0
};

CGColorSpaceRef baseSpace = CGColorSpaceCreateDeviceRGB();
CGGradientRef gradient = CGGradientCreateWithColorComponents(baseSpace,colors,NULL,2);
CGColorSpaceRelease(baseSpace),baseSpace = NULL;

CGContextSetLineWidth(context,mapRect.size.height/700);
CGContextSetLineJoin(context,kCGLineJoinRound);
CGContextSetLineCap(context,kCGLineCapRound);

CGContextAddPath(context,[self pathForOverlayForMapRect:mapRect].CGPath);
CGContextReplacePathWithStrokedPath(context);
CGContextClip(context);

[self updateTouchablePathForMapRect:mapRect];

// Define the start and end points for the gradient
// This determines the direction in which the gradient is drawn
CGPoint startPoint = CGPointMake(CGRectGetMidX(rect),CGRectGetMinY(rect));
CGPoint endPoint = CGPointMake(CGRectGetMidX(rect),CGRectGetMaxY(rect));

CGContextDrawLinearGradient(context,gradient,startPoint,endPoint,0);
CGGradientRelease(gradient),gradient = NULL;

猜你在找的iOS相关文章