在 iOS 中绘制虚线

Draw dashed line in iOS

我用 CGContextiOS 中画了虚线。 我的代码如下。

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);
CGFloat dashes[] = {5,5};
CGContextSetLineDash(context, 0, dashes, 2);
float startx = x_percentileValues[0];
float starty = orgy-numskipPixels_v*(3-minWeight);
for(int i=0; i<[MeasuredInfos.retval count]; i++) {
     float x = numskipPixels_h*hoursBetweenDates*3+orgx;
     float y = orgy-([[MeasuredInfos.retval objectAtIndex: i] getWeight] - minWeight)*numskipPixels_v;
     CGContextMoveToPoint(context, startx, starty);
     CGContextAddLineToPoint(context, x, y);
     CGContextStrokePath(context);
     startx = x;
     starty = y;


}

如果线的坡度陡一点就好了。如果不陡,虚线有问题,如附图所示。

我检查了这个linkCGContextSetLineDash没有太多讨论。

我发现了问题。问题是我在两个单独的函数中使用了两个 CGContextRef。一个在

       - (void)drawRect:(CGRect)rect {
        //Get the CGContext from this view
            CGContextRef context = UIGraphicsGetCurrentContext();

            //Set the stroke (pen) color
            CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor);
            //Set the width of the pen mark
            CGContextSetLineWidth(context, 2.0);
            float startx = x_percentileValues[0];
            float starty = orgy-numskipPixels_v*(3-minWeight);
            for(int i=0; i<[MeasuredInfos.retval count]; i++) {
                 float x = numskipPixels_h*hoursBetweenDates*3+orgx;
                 float y = orgy-([[MeasuredInfos.retval objectAtIndex: i] getWeight] - minWeight)*numskipPixels_v;
                 CGContextMoveToPoint(context, startx, starty);
                 CGContextAddLineToPoint(context, x, y);
                 CGContextStrokePath(context);
                 startx = x;
                 starty = y;

                 [self drawStar_atX:x andatY:y];
            }

        }

drawStar_atX

中的另一个
-(void)drawStar_atX:(float)xCenter andatY:(float)yCenter
{
    int aSize = 5.0;
    CGFloat color[4] = { 1.0, 0.0, 0.0, 1.0 }; // Red
    CGColorRef aColor = CGColorCreate(CGColorSpaceCreateDeviceRGB(), color);
    CGContextRef context1 = UIGraphicsGetCurrentContext();
    CGContextSetLineWidth(context1, aSize);

    float  w = 15.0;
    double r = w / 2.0;
    float flip = -1.0;

    CGContextSetFillColorWithColor(context1, aColor);


    CGContextSetStrokeColorWithColor(context1, aColor);

    double theta = 2.0 * M_PI * (2.0 / 5.0); // 144 degrees

    CGContextMoveToPoint(context1, xCenter, r*flip+yCenter);

    for (NSUInteger k=1; k<5; k++)
    {
        float x = r * sin(k * theta);
        float y = r * cos(k * theta);
        CGContextAddLineToPoint(context1, x+xCenter, y*flip+yCenter);
    }

    CGContextClosePath(context1);
    CGContextFillPath(context1);
    return;
}

我从 drawRect 打给了 drawStar_atX。两个函数中的 context 和 context1 有一些问题,从第二段开始虚线的宽度变大。实际上它们是在不同的函数中声明的,宽度不同,应该没有任何关系。现在我解决了这个问题,因为 context 和 context1 具有相同的宽度。仍在学习为什么他们有一些关系。