问候!我试图在驻留在可缩放UISCrollView中的CALayer中绘制一系列圆。这是放大捏的图层。如果我使用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:方法中使用 Vanilla 核心图形绘制它们时,圆圈变得非常锯齿(完全混淆了!)似乎没有多少抗锯齿的拼图游戏可以帮助您:
-(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获得的笔触/填充。我只是在某个地方缺少转换吗?
非常感谢!
最佳答案
简短答案:contentsScale
更长的答案:(从pe8ter在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会导致图层再次渲染。
关于cocoa-touch - CALayer中的抗锯齿图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6076724/