我正在使用下面的代码在自定义CALayer
类的 drawLayer 方法中绘制弧,但不会显示任何内容:
(void) drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
float r = self.bounds.size.width/2;
CGContextClearRect(ctx, self.bounds); // clear layer
CGContextSetFillColorWithColor(ctx, [UIColor whiteColor].CGColor);
//CGContextFillRect(ctx, layer.bounds);
UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(0, 0) radius:r startAngle:-M_PI_2 endAngle:M_PI_2 clockwise:NO];
CGContextAddPath(ctx, path.CGPath);
CGContextStrokePath(ctx);
}
请注意,如果我取消注释CGContextFillRect(ctx, layer.bounds)
行,则会正确呈现矩形。
答案 0 :(得分:0)
我能看到的问题是你没有设置笔触颜色(但填充颜色)
CGContextSetStrokeColorWithColor(ctx, [UIColor redColor].CGColor);
配置 fill 颜色时,它用于填充路径。同样的笔触颜色。
如果您只想要描边或填充路径,那么您应该使用 CGContextStrokePath
或CGContextFillPath
但是如果您想同时执行这两项操作,那么您应该使用CGContextDrawPath
kCGPathFillStroke
作为“绘图模式”。
答案 1 :(得分:0)
感谢你们两位。我最终决定使用以下代码在drawLayer方法之外绘制弧:
- (id) initWithLayer:(id)layer withRadius:(float)radius
{
self = [super initWithLayer:layer];
// ...
self.strokeColor = [UIColor whiteColor].CGColor;
self.lineWidth = 10.0;
return self;
}
- (void) update:(float)progress
{
// ....
UIBezierPath *arcPath = [UIBezierPath bezierPath];
[arcPath addArcWithCenter:CGPointMake(r, r) radius:r - self.lineWidth/2 startAngle:startAngle endAngle:nextAngle clockwise:YES];
self.path = arcPath.CGPath;
}
答案 2 :(得分:0)
看起来CGPath和UIBezierPath的所有弧绘制方法在64位设备上都有一个错误,只有当顺时针参数设置为YES时它们才有效。我注意到您的非工作代码显示clockwise:NO
,工作代码显示为clockwise:YES
。