Why does a CAShapeLayer's stroke extend out of the frame?

后端 未结 2 735
灰色年华
灰色年华 2021-02-18 18:48

Here\'s sample code:

//Called by VC:

HICircleView *circleView = [[HICircleView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];

// init of circle view

- (id)         


        
相关标签:
2条回答
  • 2021-02-18 19:03

    You'd rather choose your view's bounds property for calculation. Frame property won't work properly if it's origin is greater than (0,0). You can use CGRectInsets to adjust your circle's rectangle instead of performing transform calculations. This will automatically position the rectangle centered within the original rectangle.

    - (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;
    }
    
    0 讨论(0)
  • 2021-02-18 19:06

    Setting the lineWidth draws a line, where the actual path is exactly in the middle of the drawn line.

    If you want the drawn line to line up with something, you will have to shift the path by half the lineWidth.

    You can shift the path by using - (void)applyTransform:(CGAffineTransform)transform on UIBezierPath and apply a translate transform.

    If you want a drawn path to be contained in a certain area, shifting the path doesn't help. In that case just create a smaller path. If you want to draw a 100ptx100pt rect with a line width of 5, you have to draw a path in a 95pt*95pt rect (2.5pt space on either side).

    0 讨论(0)
提交回复
热议问题