对CAShapeLayers进行抗锯齿处理

时间:2014-03-28 18:24:26

标签: objective-c core-graphics antialiasing

我有一个加载指示器的自定义视图,它由许多CAShapeLayers组成,我执行各种动画来表示各种状态。在init方法中,我创建了许多形状图层,并将它们作为子图层添加到视图的图层中。我遇到的问题是我绘制的形状边缘非常粗糙,似乎没有抗锯齿。我在这里尝试过类似答案的一些事情,但我似乎无法解决形状问题。在我直接用drawRect绘制之前,我从来没有遇到过这个问题。

我有什么遗漏或是否有更好的方法来完成我想要做的事情?

更新:这是对如何绘制形状的比较:

Comparison of drawing methods

在左侧,我使用以下代码绘制layoutSubviews

CGFloat lineWidth = 2.5f;
CGFloat radius = (self.bounds.size.width - lineWidth)/2;
CGPoint center = CGPointMake(CGRectGetWidth(self.frame)/2, CGRectGetHeight(self.frame)/2);

CGFloat startAngle = - ((float)M_PI / 2);
CGFloat endAngle = (2 * (float)M_PI) + startAngle;

UIBezierPath *trackPath =  [UIBezierPath bezierPathWithArcCenter:center
                                                          radius:radius
                                                      startAngle:startAngle
                                                        endAngle:endAngle
                                                       clockwise:YES];
self.trackLayer.path = trackPath.CGPath;
self.trackLayer.lineWidth = lineWidth;

在右侧,我从awakeFromNib调用了一个单独的方法:

-(void)awakeFromNib
{
    ....
    self.trackLayer = [self trackShape]
    [self.layer addSublayer:self.trackLayer];
}

-(CAShapeLayer*)trackShape
{
    float start_angle = 2*M_PI*-M_PI_2;
    float end_angle = 2*M_PI*1-M_PI_2;
    float minSize = MIN(self.frame.size.width, self.frame.size.height);
    float radius = (minSize-_strokeWidth)/2 -4;
    CGPoint center = CGPointMake(self.frame.size.width/2,self.frame.size.height/2);
    CAShapeLayer *circle = [CAShapeLayer layer];

    circle.path = [UIBezierPath bezierPathWithArcCenter:center
                                                 radius:radius
                                             startAngle:start_angle
                                               endAngle:end_angle
                                              clockwise:YES].CGPath;
    circle.strokeColor = self.trackColor.CGColor;
    circle.fillColor = nil;
    circle.lineWidth = (_strokeWidth == -1.0) ? minSize * _strokeWidthRatio
    : _strokeWidth;
    circle.rasterizationScale = [[UIScreen mainScreen] scale];

    return circle;
}

1 个答案:

答案 0 :(得分:2)

您提供的图片正是发生在我身上的事情。我得到了一个矮胖的圈子。在我的例子中,代码在drawRect方法中。问题是我每次调用drawRect时都会添加一个CAShapeLayer作为我视图的子层。

因此,对于偶然发现类似内容的任何人,在绘制drawRect之前再次绘制之前,请跟踪要添加的CAShapeLayer或清除所有内容。