2012-02-23 13 views
6

ho voluto tracciare una linea utilizzando CGContext e quello che ho finora è:Utilizzando CGContext per disegnare la linea

CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor); 
CGContextSetLineWidth(context, 1.0f); 
CGContextMoveToPoint(context, 10, 10); 
CGContextAddLineToPoint(context, 100, 50); 
CGContextStrokePath(context); 

Essa trae sempre dall'angolo in alto a sinistra verso l'alto in basso a destra. Come posso regolare l'origine di inizio e fine di questa linea? Come posso regolare la lunghezza della linea?

risposta

4

Queste due linee sono responsabili dei punti iniziale e finale:

CGContextMoveToPoint(context, 10, 10); // This sets up the start point 
CGContextAddLineToPoint(context, 100, 50); // This moves to the end point. 

Regolando questi due x, y punti è possibile regolare la linea. La lunghezza della linea dipende dai punti iniziale e finale.

A seguito di risposta di PSOFT - ecco una base example project del disegno, compresa la creazione di un percorso e accarezzandolo.

Questo è spiegato in maggior dettaglio con più codice di esempio nella guida Quartz 2D per paths.

7

CoreGraphics == Good Times.

E 'stato un po' che ho fatto niente a mano libera per così dire, quello che faccio in questi giorni è quello di costruire tutto in anticipo le operazioni di disegno. Ricordate che c'è un 'puntatore' implicita, dai giorni di Logo, e si può passare senza fare la mossa un'operazione di disegno, ma è necessario specificarlo. Penso che un buon approccio (almeno per le figure statiche) sia quello di creare quei percorsi che dovrete prima disegnare, quindi usare il percorso più e più volte per cose come riempimento, tratto, ombreggiatura.

CGColorRef fillColor = // yadda 
    CGColorRef strokeColor = // yadda 

    const CGFloat radius = 5.0; 

    // Create the path first - rounded rectangle 
    CGMutablePathRef path = CGPathCreateMutable(); 
    CGPathMoveToPoint(path, NULL, 100.0 - radius, 10.0); 
    CGPathAddLineToPoint(path, NULL, 10.0 + radius, 10.0); 
    CGPathAddArcToPoint(path, NULL, 10.0, 10.0, 10.0, 10.0 + radius, radius); 
    CGPathAddLineToPoint(path, NULL, 10.0, 100.0 - radius); 
    CGPathAddArcToPoint(path, NULL, 10.0, 100.0, 10.0 + radius, 100.0, radius); 
    CGPathAddLineToPoint(path, NULL, 100.0 - radius, 100.0); 
    CGPathAddArcToPoint(path, NULL, 100.0, 100.0, 100.0, 100.0 - radius, radius); 
    CGPathAddLineToPoint(path, NULL, 100.0, 10.0 + radius); 
    CGPathAddArcToPoint(path, NULL, 100.0, 10.0, 100.0 - radius, 10.0, radius); 
    CGPathCloseSubpath(path); 

    // Then use it in your draw commands 
    CGContextSetStrokeColor(context, CGColorGetComponents(strokeColor)); 
    CGContextSetFillColor(context, CGColorGetComponents(fillColor)); 
    CGContextSetLineJoin(context, kCGLineJoinMiter); 
    CGContextSetLineWidth(context, strokeWidth); 

    CGContextAddPath(context, path); 
    CGContextDrawPath(context, kCGPathFillStroke); 
    CGPathRelease(path); 

Ecc È possibile rilasciare il percorso, alla fine, se si desidera, o mantenere il riferimento intorno per un uso più tardi.

+1

Grazie per l'invio del codice di lavoro. Ogni volta che ho avuto bisogno di CGPathAddArcToPoint ho dovuto capire le cose per errore e provare a non capire. La documentazione di Apple chiama i valori endpoint, ma nella Figura 3.5 parla di punti tangenti. Tracciando su carta quello che stava facendo il tuo primo parametro (10,10), ora vedo che è essenzialmente il punto d'angolo, o in termini di una curva quadratica di bezier, è il punto di controllo. Lavorare questa comprensione nella forma su cui stavo lavorando l'ha trasformato da un rettangolo inclinato a un bel rettangolo arrotondato. – tobinjim

+0

Felice di essere al servizio – QED

+1

Non è necessario CGPathRelease (percorso); alla fine? –

Problemi correlati