为什么CAShapeLayer的笔划延伸到框架之外?

时间:2013-08-02 00:21:05

标签: ios objective-c core-animation

以下是示例代码:

//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;
}

enter image description here

好的,谢谢你的回答。转移我:

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

并将线宽设为6。

2 个答案:

答案 0 :(得分:16)

设置lineWidth绘制一条线,其中实际路径恰好位于绘制线的中间。

如果您希望绘制的线与某些内容对齐,则必须将路径移动lineWidth的一半。

您可以使用- (void)applyTransform:(CGAffineTransform)transform上的UIBezierPath移动路径并应用翻译转换。

如果您希望将绘制的路径包含在某个区域中,则移动路径无济于事。在这种情况下,只需创建一个较小的路径如果要绘制线宽为5的100ptx100pt矩形,则必须在95pt * 95pt矩形(两侧2.5pt空间)中绘制路径。

答案 1 :(得分:9)

您更愿意选择视图的边界属性进行计算。如果它的原点大于(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;
}