Подтвердить что ты не робот

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

Код ниже прекрасно создает округленный прямоугольник, который определяется 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);

}
4b9b3361

Ответ 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];
}