Не может погладить путь после заполнения

код ниже красиво создает закругленный прямоугольник, который определяется CGRect (rectRect).

он заполняется нормально, но я не получаю инсульт. Есть идеи, почему я не вижу инсульта?

-(void)drawRect:(CGRect)rect {

    CGContextRef ctx = UIGraphicsGetCurrentContext();

    CGContextSetRGBFillColor(ctx, 0, 0, 0, 0.4);
    CGContextSetRGBStrokeColor(ctx, 1, 1, 1, 1);
    CGContextSetLineWidth(ctx, 4.0);

    float fw, fh;
    rect = rectRect;
    float ovalWidth = 12;
    float ovalHeight = 12;

    if (ovalWidth == 0 || ovalHeight == 0) {
        CGContextAddRect(ctx, rect);
        return;
    }

    CGContextTranslateCTM (ctx, CGRectGetMinX(rect), CGRectGetMinY(rect));
    CGContextScaleCTM (ctx, ovalWidth, ovalHeight);
    fw = CGRectGetWidth (rect) / ovalWidth;
    fh = CGRectGetHeight (rect) / ovalHeight;
    CGContextMoveToPoint(ctx, fw, fh/2);
    CGContextAddArcToPoint(ctx, fw, fh, fw/2, fh, 1);
    CGContextAddArcToPoint(ctx, 0, fh, 0, fh/2, 1);
    CGContextAddArcToPoint(ctx, 0, 0, fw/2, 0, 1);
    CGContextAddArcToPoint(ctx, fw, 0, fw, fh/2, 1);
    CGContextClosePath(ctx);

    CGContextFillPath(ctx);
    CGContextStrokePath(ctx);

}

1 ответов


когда вы рисуете путь, либо поглаживая его, либо заполняя его, графический контекст сбрасывает свой путь до пустого. Поэтому после вызова CGContextFillPath, контекст не имеет пути для инсульта.

вместо того, чтобы пытаться заполнить путь, а затем погладить его, вы можете использовать CGContextDrawPath функции как в один звонок:

CGContextDrawPath(ctx, kCGPathFillStroke);

на kCGPathFillStroke константа сообщает Core Graphics, чтобы заполнить путь, а затем погладить его.

С другой стороны, вы можете использовать UIBezierPath и UIColor чтобы существенно уменьшить количество кода:

-(void)drawRect:(CGRect)rect {
    [[UIColor colorWithWhite:0 alpha:0.4] setFill];
    [[UIColor whiteColor] setStroke];

    UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rectRect cornerRadius:12];
    path.lineWidth = 4;
    [path fill];
    [path stroke];
}