Почему штрих 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;
}

enter image description here

Хорошо, спасибо за ответ. сдвинуть i:

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

И сделал 6 ширину линии.

Ответ 1

Настройка lineWidth рисует линию, где фактический путь находится точно в середине вытянутой линии.

Если вы хотите, чтобы нарисованная линия совпала с чем-то, вам придется сдвинуть этот путь на половину lineWidth.

Вы можете переместить путь с помощью - (void)applyTransform:(CGAffineTransform)transform на UIBezierPath и применить преобразование перевода.

Если вы хотите, чтобы рисованный путь содержался в определенной области, перемещение пути не помогает. В этом случае просто создайте меньший путь. Если вы хотите нарисовать прямоугольник размером 100ptx100pt с шириной линии 5, вам нужно нарисовать путь в прямоугольнике 95pt * 95pt (пространство 2,5pt с обеих сторон).

Ответ 2

Вы бы предпочли использовать свойство bound bounds для вычисления. Свойство Frame не будет работать должным образом, если его начало больше (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;
}