2009-05-02 20 views
5

Estoy tratando de dibujar algunas líneas simples con el iPhone/Touch SDK. Me gustaría poder cambiar el color de las líneas, pero llamar a CGContextSetRGBStrokeColor no parece afectar las líneas dibujadas que se hacen con CGContextAddLineToPoint hasta que se realiza la llamada real a CGContextStrokePath. Entonces, si realizo varias llamadas para cambiar el color, solo la que se hizo justo antes de CGContextStrokePath tiene algún efecto. Esto es lo que quiero decir:Cambiando colores con CGContextStrokePath

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGContextMoveToPoint(ctx, 0, 0); 
    CGContextSetRGBStrokeColor(ctx,1,0,0,1); 
    CGContextAddLineToPoint(ctx, 100, 100); 
    //CGContextStrokePath(ctx); 
    CGContextSetRGBStrokeColor(ctx,0,1,0,1); 
    CGContextAddLineToPoint(ctx, 200, 300); 
    //CGContextStrokePath(ctx); 
    CGContextSetRGBStrokeColor(ctx,0,0,1,1); 
    CGContextStrokePath(ctx); 
} 

Asumo que estoy haciendo algo muy mal, simplemente no puedo averiguar por qué. Pensé que si añadía las llamadas CGContextStrokePath, eso ayudaría, pero no es así.

Ver la discusión de cómo llegué al código corregido:

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGContextBeginPath(ctx); 
    CGContextMoveToPoint(ctx, 0, 0); 
    CGContextSetRGBStrokeColor(ctx,1,0,0,1); 
    CGContextAddLineToPoint(ctx, 100, 100); 
    CGContextStrokePath(ctx); 
    CGContextClosePath(ctx); 
    CGContextBeginPath(ctx); 
    CGContextMoveToPoint(ctx, 100, 100); 
    CGContextSetRGBStrokeColor(ctx,0,1,0,1); 
    CGContextAddLineToPoint(ctx, 200, 300); 
    CGContextStrokePath(ctx); 
} 

Respuesta

4

no creo que estás haciendo algo muy mal, sólo que CGContextStrokePath para un Contexto Gráfico dado sólo puede tener uno en RGBStrokeColor un momento. Como resultado, se requieren múltiples llamadas a CGContextStrokePath, una vez para cada color.

Se agrega una referencia (no una copia) al contexto de gráficos a esa pila de operaciones de dibujo con cada llamada a CGContextAddLineToPoint(). Cuando finalmente llama a CGContextStrokePath(), se utiliza el último valor para RGBStrokeColor.

Si desea utilizar varios colores con el mismo contexto de gráficos, entonces parece que necesita realizar varias llamadas a CGContextStrokePath() cambiando el valor de RGBStrokeColor() en el contexto de gráficos entre llamadas. El código de muestra de Apple en AccelerometerGraph/GraphView.m parece indicar esto también.

+0

Hm, esa es la conclusión a la que también recurrí, pero cuando ejecuto el código anterior en el simulador con líneas CGContextStrokePath (ctx) no comentadas, obtengo la primera línea dibujada en rojo, y luego nada. Lo que me parece que debería hacer es dibujar la primera línea en rojo y luego dibujar la segunda en verde, pero si la ejecuto en el simulador de iPhone, eso no es lo que sucede. – stinkymatt

+0

Quizás la ruta actual (incluido el punto de inicio) se borre cuando realiza la primera llamada? De acuerdo con los documentos de Apple: "Quartz utiliza el ancho de línea y el color de trazo del estado de los gráficos para pintar la ruta. Como efecto secundario cuando se llama a esta función, Quartz borra la ruta actual". –

+0

En primer lugar, le felicito por su uso de la palabra borrado. Es uno de mis favoritos. En segundo lugar, gracias por ayudarme a ver los documentos de otra manera. Lo que debe hacerse es llamar a CGContextBeginPath (ctx). Luego cambie el color de trazo, mueva el punto de inicio y agregue la línea, luego toque y cierre la ruta. Repita para los siguientes segmentos de línea. Intentaré agregar el código corregido a mi publicación original para la posteridad. ¡Gracias! – stinkymatt

Cuestiones relacionadas