CAShapeLayer绘制路径奇怪

时间:2011-12-13 04:58:19

标签: iphone ios cocoa-touch ipad drawing

我正在构建一个UIBezierPath,如下所示:

UIBezierPath *path = [UIBezierPath bezierPath];
CGFloat yOrigin = 2;
for (int i = 0; i < lines; ++i) {
    [path moveToPoint:CGPointMake(0, yOrigin)];
    [path addLineToPoint:CGPointMake(width, yOrigin)];
    yOrigin += distance;
}
[path closePath];

然后我把它放在CAShapeLayer中:

CAShapeLayer *shapeLayer = [[CAShapeLayer alloc] init];
[shapeLayer setFrame:aFrame];
[shapeLayer setPath:[bezierPath CGPath]];
[shapeLayer setStrokeColor:[[UIColor blackColor] CGColor]];
[shapeLayer setMasksToBounds:YES];

但是,当我添加到滚动视图时,结果如下:

Path Image

为什么这样做?前四行几乎是灰色的!它看起来像一个别名问题,但路径非常简单。

2 个答案:

答案 0 :(得分:5)

是的,这是一个抗锯齿问题。

您使用的路径宽度为1磅。在上面的示例中,CAShapeLayer的上三个实例精确地定位在整个点值上,例如。 5.0,其中较低实例位于两个整点之间,例如。 14.5。

当系统将图层渲染到屏幕像素时,它会对前三行进行抗锯齿处理,绘制两个触摸的像素,透明度为50%。下面的线完美地坐在一个像素上,因此画成完美的黑色。

我希望一点点ASCII艺术有助于理解。

 pt          upper lines                           lower line
5.0|---------                                      -------------------------------
   |  pixel  --------------------------------------  perfectly aligned center 5.5
6.0|---------  line between pixels centered on 6.0 -------------------------------
   |  pixel  --------------------------------------
7.0|---------

答案 1 :(得分:0)

我遇到了同样的情况:垂直和水平黑线变成灰色。

看起来像像素上的UiView'snap'坐标,而不是CALayer。

我对此问题的解决方法是在coodinates上添加0.5。

CGRect bounds_on_pixels(const CGRect& bounds) {

    const float f = 0.5f;
    return CGRectMake(bounds.origin.x+f, bounds.origin.y+f, bounds.size.width-1.f, bounds.size.height-1.f);
}

注意:-1.f的大小是兼性的。

使用CAShapeLayer和UIBezierPath

的示例
CAShapeLayer* shape_layer = [CAShapeLayer layer];
// initialize shape_layer...
shape_layer.path =
[
 UIBezierPath bezierPathWithRoundedRect:bounds_on_pixels(self.view.bounds)
 byRoundingCorners:UIRectCornerTopLeft | UIRectCornerTopRight
 cornerRadii:CGSizeMake(10.0, 10.0)
].CGPath;
// add shape_layer: [self.view.layer insertSublayer:shape_layer atIndex:0];

@tonklon:感谢你的想法!