¿Por qué el golpe de un CAShapeLayer se extiende fuera del marco?

Aquí hay un código de ejemplo:

//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 networkingColor] CGColor]; borderLayer.lineWidth = 5; [self.layer addSublayer:borderLayer]; } return self; } 

introduzca la descripción de la imagen aquí

OK. Gracias por la respuesta. para cambiar i:

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

E hizo 6 el ancho de la línea.

Al configurar lineWidth dibuja una línea, donde la ruta real está exactamente en el medio de la línea dibujada.

Si desea que la línea dibujada se alinee con algo, tendrá que desplazar la ruta a la mitad de la línea lineWidth .

Puede cambiar la ruta utilizando - (void)applyTransform:(CGAffineTransform)transform en UIBezierPath y aplicar una transformación de traducción.

Si desea que una ruta dibujada esté contenida en un área determinada, cambiar la ruta no ayuda. En ese caso, solo cree una ruta más pequeña. Si desea dibujar un rectángulo de 100ptx100pt con un ancho de línea de 5, debe dibujar una ruta en un rectángulo de 95pt * 95pt (espacio de 2,5pt en cualquier lado).

Prefiere elegir la propiedad de límites de su vista para el cálculo. La propiedad del marco no funcionará correctamente si su origen es mayor que (0,0). Puede usar CGRectInsets para ajustar el rectángulo de su círculo en lugar de realizar cálculos de transformación. Esto posicionará automáticamente el rectángulo centrado dentro del rectángulo original.

 - (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 networkingColor] CGColor]; borderLayer.lineWidth = lineWidth; [self.layer addSublayer:borderLayer]; } return self; }