2014-03-28 189 views
3

我有它由若干CAShapeLayers我执行上表示各种状态的各种动画的负载指示符自定义视图。在init方法中,我创建了许多形状图层,并将它们作为子图层添加到视图的图层中。我遇到的问题是我绘制的图形具有非常粗糙的边缘,似乎没有反锯齿。我在这里尝试了一些类似答案的东西,但我似乎无法抗衡这些形状。我从来没有这个问题,然后直接在drawRect中绘制。抗锯齿上CAShapeLayers

有什么我失踪,或是否有更好的方式来完成我想要做什么?

更新:这里有一个如何的形状,正在制定一个比较:使用此代码

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; 
} 
+4

的'CAShapeLayer'文档说,“形状将绘制抗锯齿,并尽可能将被光栅化以保持分辨率无关之前被映射到屏幕空间。然而,某些类型的图像处理操作,如CoreImage过滤器,应用于图层或其祖先可能会强制在本地坐标空间中进行光栅化。“每当我添加一个'CAShapeLayer'时,它总是反锯齿的,所以也许你可以分享你正在做的事情(代码,屏幕快照等),这样我们就可以知道发生了什么。 – Rob

+0

@Rob我更新了截图和代码。 – psobko

+0

两个圆实际上都是反锯齿的。右边的看起来比右边的看起来粗糙,但由于它们大小不同,所以很难说。你可以绘制这些尺寸完全相同的尺寸(并分享你使用的半径和线宽值)?使用圆圈时,“半径”中的细微变化(例如38和38.3)可以从根本上改变抗锯齿的视觉效果,因此请确保“半径”值完全相同。 – Rob

回答

2

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

因此,任何人谁在类似的东西绊倒,跟踪你添加的CAShapeLayer的或明确的一切都在drawRect中再次绘制前。

+0

这是我的问题。删除叠加的CAShapeLayers后,边缘不会随着每次后续重绘而变得锯齿状。谢谢米却。 – declan