2013-10-02 7 views
8

Realizzo un editor di immagini che può creare oggetti di forme diverse come cerchi, triangoli e quadrati che possono anche essere aggiornati o rimossi. Quindi ho usato CAShapeLayer per creare oggetti di forme.Disegnare una linea con Bezierpath usando l'oggetto CAShapeLayer

Ora voglio anche disegnare una linea sull'immagine che può anche essere aggiornata o rimossa, quindi ho usato bezierpath e CAShapeLayer per creare la linea, funziona perfettamente. MA ora il problema è che quando voglio selezionare qualsiasi linea esistente può essere selezionato qualsiasi strumento dove vicino a linea perché CAShapeLayer imposta anche la regione di riempimento che sarà una linea retta dal punto iniziale al punto finale.

La mia domanda è: come è possibile creare una linea senza area di riempimento utilizzando CAShapeLayer.

Ecco il mio codice per la creazione di linea:

CAShapeLayer *line = [CAShapeLayer layer]; 
// Using bezierpath to make line 
UIBezierPath *linePath=[UIBezierPath bezierPath]; 

// Creating L with line 

[linePath moveToPoint:point1]; 
[linePath addToPoint:point2]; 
[linePath addToPoint:point3]; 
line.path=linePath.CGPath; 


// Configure the appearence of the line 
line.fillColor = Nil; 
line.opacity = 1.0; 
line.strokeColor = [UIColor whiteColor].CGColor; 

Qualche idea su questo sarà molto apprezzato.

+0

Funziona. Probabilmente hai dimenticato di aggiungere layer '' '[self.view.layer addSublayer: line];' '' – Shmidt

+0

Ho aggiunto anche questa linea, crea la linea fine ma riempie anche la regione dal punto iniziale al punto finale e la considero come una parte di livello. Quindi il problema è che ogni volta che tento di toccare, vicino al livello della linea di linea, viene selezionato. –

+0

Dovresti usare '[linePath addLineToPoint: point2]'? –

risposta

3

Potete provare questo. Il suo lavoro per me

CAShapeLayer *line = [CAShapeLayer layer]; 
    UIBezierPath *linePath=[UIBezierPath bezierPath]; 
    [linePath moveToPoint:CGPointMake(startx, starty)]; 
    [linePath addLineToPoint:CGPointMake(endx, endy)]; 
    line.lineWidth = 10.0; 
    line.path=linePath.CGPath; 
    line.fillColor = shapecolor.CGColor; 
    line.strokeColor = shapecolor.CGColor; 
    [[self.view layer] addSublayer:line]; 
+0

controllerà sicuramente e ti farà sapere. –

+0

non ti manca [linePath ictus]? –

+0

Non hai bisogno di '[linePath stroke]' qui, e in effetti probabilmente otterrai errori di contesto se lo fai (a meno che tu non avvii manualmente un contesto o lo usi in 'drawRect') - chiamando' stroke' usa Core Grafica, ma proprio qui vogliamo usare Core Animation. – DMan

0

capisco che ho vissuto questo problema e provare questo:

GPathRef linePathRef = linePath.CGPath 
linePathRef = CGPathCreateCopyByStrokingPath(linePathRef, NULL, line.lineWidth, kCGLineCapRound, kCGLineJoinRound, 1); 
BOOL pathContainsPoint = CGPathContainsPoint(linePathRef, NULL, touchLocation, NO); 

if(pathContainsPoint){ 
    //Do something with the cashapelayer line... 
}else{ 
    //Do something here if needed... 
}