我有它由若干CAShapeLayers
我执行上表示各种状态的各种动画的负载指示符自定义视图。在init方法中,我创建了许多形状图层,并将它们作为子图层添加到视图的图层中。我遇到的问题是我绘制的图形具有非常粗糙的边缘,似乎没有反锯齿。我在这里尝试了一些类似答案的东西,但我似乎无法抗衡这些形状。我从来没有这个问题,然后直接在drawRect
中绘制。抗锯齿上CAShapeLayers
有什么我失踪,或是否有更好的方式来完成我想要做什么?
更新:这里有一个如何的形状,正在制定一个比较:使用此代码
在左边我画在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;
}
的'CAShapeLayer'文档说,“形状将绘制抗锯齿,并尽可能将被光栅化以保持分辨率无关之前被映射到屏幕空间。然而,某些类型的图像处理操作,如CoreImage过滤器,应用于图层或其祖先可能会强制在本地坐标空间中进行光栅化。“每当我添加一个'CAShapeLayer'时,它总是反锯齿的,所以也许你可以分享你正在做的事情(代码,屏幕快照等),这样我们就可以知道发生了什么。 – Rob
@Rob我更新了截图和代码。 – psobko
两个圆实际上都是反锯齿的。右边的看起来比右边的看起来粗糙,但由于它们大小不同,所以很难说。你可以绘制这些尺寸完全相同的尺寸(并分享你使用的半径和线宽值)?使用圆圈时,“半径”中的细微变化(例如38和38.3)可以从根本上改变抗锯齿的视觉效果,因此请确保“半径”值完全相同。 – Rob