2013-08-02 7 views
11

Ecco il codice di esempio:Perché il tratto di un CAShapeLayer si estende oltre la cornice?

//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, grazie per la risposta. per spostare i:

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

E ha reso 6 la larghezza della linea.

risposta

11

L'impostazione di lineWidth disegna una linea, in cui il percorso effettivo si trova esattamente nel mezzo della linea disegnata.

Se si desidera allineare la linea tracciata con qualcosa, sarà necessario spostare il percorso della metà dello lineWidth.

È possibile spostare il percorso utilizzando - (void)applyTransform:(CGAffineTransform)transform su UIBezierPath e applicare una trasformazione di traduzione.

Se si desidera che un percorso disegnato sia contenuto in una determinata area, il passaggio del percorso non è di aiuto. In tal caso basta creare un percorso più piccolo. Se si desidera disegnare un rettangolo 100ptx100pt con una larghezza della linea pari a 5, è necessario disegnare un tracciato in un rettangolo 95pt * 95pt (spazio 2,5pt su ciascun lato).

+0

THanks. Puoi spiegare come spostare il percorso della linea? Non importa. Fatto. –

+0

Ho aggiornato la mia risposta, spero che ora sia un po 'più chiara. – Sebastian

5

Preferisci scegliere la proprietà dei limiti della vista per il calcolo. La proprietà frame non funzionerà correttamente se la sua origine è maggiore di (0,0). È possibile utilizzare CGRectInsets per regolare il rettangolo del cerchio anziché eseguire i calcoli di trasformazione. Questo posizionerà automaticamente il rettangolo al centro del rettangolo originale.

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

Grazie per il suggerimento CGRectInset, questo è quello che ho trovato in Swift 3: 'let delta = tipo (di: self) .StrokeLineWidth/2.0' ' let rect = contentView.bounds.insetBy (dx: delta, dy: delta) ' – Lucien

Problemi correlati