问候!我正在尝试在CALayer中绘制一系列圆圈,这些圆圈位于可缩放的UISCrollView中。这是放大捏的图层。如果我使用CAShapeLayer绘制圆圈,那么它们可以很好地缩放:
CAShapeLayer plotLayer = [CAShapeLayer layer];
plotLayer.bounds = self.bounds;
plotLayer.anchorPoint = CGPointZero;
plotLayer.position = CGPointZero;
CGMutablePathRef path = CGPathCreateMutable();
for (id one in many) {
CGRect ellipseRect = [one circleRect];
CGPathAddEllipseInRect(path, NULL, ellipseRect);
}
plotLayer.path = path
CFRelease(path);
[self.layer addSublayer:plotLayer];
[plotLayer setNeedsDisplay];
然而,当我尝试在我的drawLayer:inContext:方法中使用香草核心图形绘制它们时,圆圈变得非常锯齿状(彻头彻尾的专利!)没有任何数量的抗锯齿jiggery-pokery似乎有帮助:
-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context
{
CGContextSetAllowsAntialiasing(context, true);
CGContextSetShouldAntialias(context, true);
CGContextClip(context);
for (id one in many) {
CGRect ellipseRect = [one circleRect];
CGContextStrokeEllipseInRect(context, ellipseRect);
}
}
我正在试图弄清楚CAShapeLayer正在做什么来获得如此好的抗锯齿效果(除了我自己的启发)我可以充分利用我绘图中的核心图形,而不仅仅是我可以获得的笔触/填充与CAShapeLayer。我只是在某个地方错过了一个变换?
非常感谢!
答案 0 :(得分:2)
简答:contentsScale
更长的答案:(几乎逐字逐句地从Vector like drawing for zoomable UIScrollView处获取):
通过在缩放后在相关图层上设置contentScale属性,可以获得更好的渲染效果:
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView
withView:(UIView *)view
atScale:(float)scale
{
[CATransaction begin];
[CATransaction setValue:[NSNumber numberWithBool:YES]
forKey:kCATransactionDisableActions];
uglyBlurryTextLayer.contentsScale = scale;
[CATransaction commit];
}
布拉德拉森(Brad Larson)在So a CALayer does not contain a content bitmap of a view?发生实际绘图(扰流器,通常只发生一次,尽管应用了多少变换)时,有一个(通常很好的)描述。基于此,我只能假设设置contentsScale会导致图层再次渲染。
答案 1 :(得分:0)
我没有试过这个,但是如果你的圈子在调整视图大小时会出现锯齿,那可能是因为插值质量。
您是否尝试过将插值质量设置为高?
CGContextSetInterpolationQuality(context, kCGInterpolationHigh);