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