0

我正在使用下面的代码将弧线绘制到自定义类的drawLayer方法中,CALayer但没有显示任何内容:

(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)行,则会正确呈现一个矩形。

4

3 回答 3

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;
}
于 2013-08-27T12:38:41.300 回答
0

我可以看到的问题是您没有设置描边颜色(而是填充颜色)

CGContextSetStrokeColorWithColor(ctx, [UIColor redColor].CGColor);

当您配置填充颜色时,它用于填充路径。描边颜色也一样。


如果您只想描边或填充路径,那么您应该使用其中一个, CGContextStrokePath或者,CGContextFillPath但如果您想同时使用两者,那么您应该使用CGContextDrawPathwithkCGPathFillStroke作为“绘图模式”。

于 2013-07-25T09:37:58.580 回答
0

看起来 CGPath 和 UIBezierPath 的所有弧线绘制方法在 64 位设备上都有一个错误,它们只有在顺时针参数设置为 YES 时才有效。我注意到您的非工作代码显示clockwise:NO并且工作代码具有clockwise:YES.

于 2015-01-09T02:23:56.070 回答