为什么CAShapeLayer的笔画延伸出框架?

这里是示例代码:

//Called by VC: HICircleView *circleView = [[HICircleView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; // init of circle view - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { CAShapeLayer *borderLayer = [CAShapeLayer layer]; borderLayer.fillColor = [UIColor whiteColor].CGColor; borderLayer.path = [UIBezierPath bezierPathWithOvalInRect:self.frame].CGPath; borderLayer.strokeColor = [[UIColor redColor] CGColor]; borderLayer.lineWidth = 5; [self.layer addSublayer:borderLayer]; } return self; } 

在这里输入图像说明

好的,谢谢你的回答。 改变我:

 CGRect rect = CGRectMake(3, 3, self.frame.size.width, self.frame.size.height); borderLayer.path = [UIBezierPath bezierPathWithOvalInRect:rect].CGPath; 

并制作了6线宽。

设置lineWidth绘制一条线,其中实际path恰好在绘制线的中间。

如果你想绘制的线与东西排成一列,你将不得不将path移动一半lineWidth

您可以通过在UIBezierPath上使用- (void)applyTransform:(CGAffineTransform)transform来移动path,并应用转换转换。

如果您想要在某个区域中包含绘制的path,则移动path不会有帮助。 在这种情况下只需创build一个较小的path。 如果你想绘制一个宽度为5的100ptx100pt矩形,你必须绘制一个95pt * 95pt矩形(任何一边的2.5pt空间)的path。

你宁愿select你的视图的边界属性进行计算。 如果原点大于(0,0),则框架属性将无法正常工作。 您可以使用CGRectInsets来调整您的圆的矩形,而不是执行变换计算。 这将自动将矩形定位在原始矩形的中心。

 - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { CAShapeLayer *borderLayer = [CAShapeLayer layer]; borderLayer.fillColor = [UIColor whiteColor].CGColor; CGFloat lineWidth = 5; CGRect rect = CGRectInset(self.bounds, lineWidth / 2, lineWidth / 2); borderLayer.path = [UIBezierPath bezierPathWithOvalInRect:rect].CGPath; borderLayer.strokeColor = [[UIColor redColor] CGColor]; borderLayer.lineWidth = lineWidth; [self.layer addSublayer:borderLayer]; } return self; }