为什么cashapelayer的圆形路径不是完美的圆形?

3

文档中说CAShapLayer是抗锯齿的,为什么会出现这种结果。 我还在drawRect方法中使用CGContext画了一个圆,效果非常完美。

   UIBezierPath *path = [UIBezierPath bezierPath];
    [path appendPath:[UIBezierPath bezierPathWithOvalInRect:CGRectMake(150, 300, 136, 136)]];

    self.circleLayer = [CAShapeLayer layer];
    self.circleLayer.path = path.CGPath;
    self.circleLayer.frame = self.bounds;
    self.circleLayer.fillColor = [[UIColor whiteColor] colorWithAlphaComponent:0.6].CGColor;
    [self.layer addSublayer:self.circleLayer];

enter image description here


你是在问我们如何关闭抗锯齿吗?还是你的Core Graphics渲染也在进行抗锯齿,而你只是想知道为什么两者有些不同? - Rob
顺便说一句,我发现如果你使用UIBezierPath方法addArcWithCenter时,半径为非整数(例如150.2而不是150),则CAShapeLayer的抗锯齿伪影会更少分散注意力。 - Rob
3个回答

2
根据UIBezierPath文档bezierPathWithOvalInRect: "使用一系列贝塞尔曲线创建一个封闭的子路径来近似椭圆形",因此它可能无法画出完美的圆形。

但是CGContextAddEllipseInRect也说:“椭圆形由一系列贝塞尔曲线近似表示。” - Luke
1
当我使用CGContextAddEllipseInRect在drawRect中绘制圆时,它是一个完美的圆形。 - Luke

1
如果您使用UIBezierPath绘制圆形,则不会得到完美的圆形,因为它是从Bézier曲线的近似值中得出的。
您可以通过正方形UIView绘制完美的圆形。例如:
myView.layer.cornerRadius = myView.frame.size.width/2;
在这个主题中,解释了三种绘制圆形的方法 -> 如何使用CAShapeLayer和UIBezierPath绘制平滑的圆形?

0

iOS 12: 我在 iPhone XS 和 XS Max 上遇到了同样的问题。但在 iPhone 8 上却没有这个问题,圆是完美的。

为了解决 XS 和 XS Max 上的问题,我将 UIBezierPathflatness 属性设置为0.0,并确保用于 UIBezierPath 的矩形中心是整数或浮点数字,例如25.5。我的矩形中心是 y=51.166666,这导致椭圆不是圆形。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接