CAShapeLayer圆角失真

时间:2013-12-05 05:48:51

标签: ios objective-c uibezierpath cashapelayer

我目前正在处理代码中的iOS应用资产生成(创建CAShapeLayer并将其渲染为UIImage)。 我在为我的图层绘制bezier路径时遇到圆角变形的问题,并且想知道是否有人有同样的问题?

可视化问题的屏幕截图:

http://i.stack.imgur.com/I8Jre.png

(生成的UIImage用作UIButton的backgroundImage)

用于创建图层的代码:

CAShapeLayer * layer = [CAShapeLayer new];
[layer setBackgroundColor:[UIColor clearColor].CGColor];
[layer setFrame:CGRectMake(.0, .0, size.width, size.height)];
[layer setFillColor:[UIColor colorForKey:@"colour_1"].CGColor];
[layer setStrokeColor:[UIColor colorForKey:@"colour_4"].CGColor];
[layer setLineWidth:2.0];
[layer setPath:[UIBezierPath bezierPathWithRoundedRect:layer.frame  byRoundingCorners:UIRectCornerBottomLeft|UIRectCornerBottomRight cornerRadii:CGSizeMake(10.0, 10.0)].CGPath];

将其变成UIImage:

UIImage * imageFromCALayer(CALayer * layer) {
    UIGraphicsBeginImageContextWithOptions([layer frame].size, NO, [UIScreen mainScreen].scale);
    [layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return outputImage;
}

2 个答案:

答案 0 :(得分:0)

为什么要拍摄CAShapeLayer并将其光栅化为图像?直接画路径!不仅是正确生成图像的方式,而且它可以让您更好地控制绘图过程。

答案 1 :(得分:0)

由于您的CAShapeLayer和图像具有相同的尺寸并且您应用了轮廓(在形状路径的一半内部和一半外部),因此会裁剪生成的图像。因此,您需要做的就是将轮廓的宽度添加到结果图像的宽度和高度。