我有一个加载指示器的自定义视图,它由许多CAShapeLayers
组成,我执行各种动画来表示各种状态。在init方法中,我创建了许多形状图层,并将它们作为子图层添加到视图的图层中。我遇到的问题是我绘制的形状边缘非常粗糙,似乎没有抗锯齿。我在这里尝试过类似答案的一些事情,但我似乎无法解决形状问题。在我直接用drawRect
绘制之前,我从来没有遇到过这个问题。
我有什么遗漏或是否有更好的方法来完成我想要做的事情?
更新:这是对如何绘制形状的比较:
在左侧,我使用以下代码绘制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;
}
答案 0 :(得分:2)
您提供的图片正是发生在我身上的事情。我得到了一个矮胖的圈子。在我的例子中,代码在drawRect方法中。问题是我每次调用drawRect时都会添加一个CAShapeLayer作为我视图的子层。
因此,对于偶然发现类似内容的任何人,在绘制drawRect之前再次绘制之前,请跟踪要添加的CAShapeLayer或清除所有内容。