2013-08-02 9 views
11

Hier ist Beispielcode:Warum erstreckt sich der Hub eines CAShapeLayers aus dem Rahmen?

//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, danke für die Antwort. zu verschieben i:

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

Und machte 6 die Linienbreite.

Antwort

11

die lineWidth Einstellung zeichnet eine Linie, wo der tatsächliche Weg genau in der Mitte der gezeichneten Linie ist.

Wenn Sie die gezogene Linie mit etwas ausrichten wollen, müssen Sie den Weg um die halbe lineWidth verschieben müssen.

Sie können den Pfad verschieben, indem Sie - (void)applyTransform:(CGAffineTransform)transform auf UIBezierPath verwenden und eine Translate-Transformation anwenden.

Wenn ein gezeichneter Pfad in einem bestimmten Bereich enthalten sein soll, hilft das Verschieben des Pfads nicht. In diesem Fall erstellen Sie einfach einen kleineren Pfad. Wenn Sie eine 100ptx100pt rect mit einer Linienbreite von 5 zeichnen möchten, müssen Sie einen Pfad in einem 95pt * 95pt rect (2.5pt Abstand auf jeder Seite) zeichnen.

+0

THanks. Kannst du erklären, wie man den Linienweg verschiebt? Vergiss es. Ich habs. –

+0

Ich aktualisierte meine Antwort, hoffe, dass es jetzt ein bisschen klarer ist. – Sebastian

5

Sie würden lieber die Begrenzungseigenschaft Ihrer Ansicht für die Berechnung wählen. Die Rahmeneigenschaft funktioniert nicht ordnungsgemäß, wenn der Ursprung größer als (0,0) ist. Sie können CGRectInsets verwenden, um das Rechteck des Kreises anzupassen, anstatt Transformationsberechnungen durchzuführen. Dadurch wird das Rechteck automatisch innerhalb des ursprünglichen Rechtecks ​​positioniert.

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

Danke für den CGRectInset-Tipp, das ist, was ich mit Swift 3: 'let delta = Typ (von: self) .StrokeLineWidth/2.0' 'let rect = contentView.bounds.insetBy (dx: Delta, dy: delta) ' – Lucien

Verwandte Themen