2010-04-03 17 views
7

Este es el código que uso para dibujar:¿Por qué hay un error de contexto no válido?

- (void) drawSomething 
{ 

    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetRGBStrokeColor(context, 1, 0, 0, 1); 
    CGContextSetLineWidth(context, 6.0); 

    CGContextMoveToPoint(context, 100.0f, 100.0f); 
    CGContextAddLineToPoint(context, 200.0f, 200.0f); 
    CGContextStrokePath(context); 

    NSLog(@"draw"); 

} 

pero me dio el error de la siguiente manera:

[Session started at 2010-04-03 17:51:07 +0800.] 
Sat Apr 3 17:51:09 MacBook.local MyApp[12869] <Error>: CGContextSetRGBStrokeColor: invalid context 
Sat Apr 3 17:51:09 MacBook.local MyApp[12869] <Error>: CGContextSetLineWidth: invalid context 
Sat Apr 3 17:51:09 MacBook.local MyApp[12869] <Error>: CGContextMoveToPoint: invalid context 
Sat Apr 3 17:51:09 MacBook.local MyApp[12869] <Error>: CGContextAddLineToPoint: invalid context 
Sat Apr 3 17:51:09 MacBook.local MyApp[12869] <Error>: CGContextDrawPath: invalid context 

¿Por que me impulsan a decir que el contexto es inválido?

+0

¿A qué se llama drawSomething? ¿Cuál debería ser el contexto actual entonces? –

+0

llamó desde mi método init. el contexto actual no es la vista actual? – Tattat

Respuesta

12

Como the documentation dice:

El contexto gráfico actual es nulo por defecto. Antes de llamar a su método drawRect:, los objetos de vista insertan un contexto válido en la pila, por lo que es actual.

Así que hay que poner este código en el método drawRect

+0

aún no obtienes ese – Tattat

+4

El sistema operativo del iPhone está diseñado para que el contexto gráfico (al que accedemos a través de UIGraphicsGetCurrentContext()) se cree solo cuando sea necesario. Eso es necesario cuando quieres dibujar algo, así que en el drawRect: method que anularás en tu clase. Incluso si puede llamar directamente a drawRect :, la documentación de iPhone SDK le aconseja que no lo haga. Así que en lugar de simplemente cambiar el nombre de su método drawSomething: draw_rect: y llamándolo, lo cual funcionaría, le aconsejo que lo haga, pero llame a setNeedsDisplay como @Brad Larson le dijo que lo haga;) –

+0

thz chicos, son muy útiles. – Tattat

8

De my answer a this similar question:

Si esto se va a dibujar en la pantalla, tendrá que localizar el código de dibujo dentro de el método -drawRect: de una UIView (o –drawInContext: de un CALayer). Para actualizar su contenido, deberá llamar al -setNeedsDisplay en UIView o CALayer. Si intenta dibujar en cualquier otro momento, se producirá el error de "contexto no válido" que está viendo.

Véase también this question.

Cuestiones relacionadas