2013-08-02 26 views
11

Dưới đây là mẫu mã:Tại sao đột quỵ của CAShapeLayer mở rộng ra khỏi khung?

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

OK, cảm ơn vì câu trả lời. để dịch chuyển i:

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

Và thực hiện 6 chiều rộng đường kẻ.

Trả lời

11

Đặt lineWidth vẽ một đường, trong đó đường dẫn thực tế chính xác nằm ở giữa đường vẽ.

Nếu bạn muốn đường vẽ được vẽ bằng thứ gì đó, bạn sẽ phải dịch chuyển đường đi một nửa số lineWidth.

Bạn có thể thay đổi đường dẫn bằng cách sử dụng - (void)applyTransform:(CGAffineTransform)transform trên UIBezierPath và áp dụng biến đổi dịch.

Nếu bạn muốn đường dẫn được vẽ trong một khu vực nhất định, việc di chuyển đường dẫn sẽ không giúp ích gì. Trong trường hợp đó, chỉ cần tạo một đường nhỏ hơn. Nếu bạn muốn vẽ một đường thẳng 100ptx100pt với chiều rộng đường là 5, bạn phải vẽ một đường đi trong khoảng 95pt * 95pt (không gian 2,5pt ở hai bên).

+0

THanks. Bạn có thể giải thích làm thế nào để thay đổi đường dẫn đường? Đừng bận tâm. Hiểu rồi. –

+0

Tôi đã cập nhật câu trả lời của mình, hy vọng rằng nó đã rõ ràng hơn một chút. – Sebastian

5

Bạn muốn chọn thuộc tính giới hạn của chế độ xem để tính toán. Thuộc tính Frame sẽ không hoạt động đúng nếu nguồn gốc của nó lớn hơn (0,0). Bạn có thể sử dụng CGRectInsets để điều chỉnh hình chữ nhật của vòng tròn thay vì thực hiện các phép tính biến đổi. Điều này sẽ tự động định vị hình chữ nhật ở giữa hình chữ nhật ban đầu.

- (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

Cảm ơn mẹo CGRectInset, đây là những gì tôi đã kết thúc bằng Swift 3: 'let delta = type (của: self) .StrokeLineWidth/2.0' ' let rect = contentView.bounds.insetBy (dx: delta, dy: delta) ' – Lucien