2012-02-27 8 views
6

¿Es seguro obtener un CGContext de NSView de -drawRect: y utilizarlo para realizar más dibujos posteriormente? En una prueba sencilla como ésta:Contexto de dibujo de NSView

CGContextRef context = NULL; 

- (void)drawRect:(NSRect)r 
{ 
    if (!context) 
     context = [[NSGraphicsContext currentContext] graphicsPort]; 
} 

- (void)drawSomething 
{ 
    CGContextSetRGBFillColor(context, 1, 0, 0, 1); 
    CGContextFillRect(context, CGRectMake (0, 0, 100, 100)); 
    CGContextFlush(context); 
} 

todo parece funcionar cuando -drawSomething se llama, pero es que garantiza que el contexto no va a cambiar?

Como puede ver y puede adivinar, estoy intentando omitir la forma estándar de dibujar usando -drawRect:. Funciona muy bien para una miríada de ocasiones, pero una forma de dibujo más procedimental facilitaría la vida en mi caso particular.

Respuesta

6

No debe hacer esto. No se garantiza que el contexto exista fuera de drawRect: y el hecho de que su código de dibujo funcione es un feliz accidente. No confíes en este comportamiento.

Si necesita forzar el dibujo en cualquier punto, debe llamar display en la vista, que a su vez llamada drawRect:.

2

Es necesario utilizar lockFocus: si desea dibujar fuera drawRect: Aquí está el extracto de la documentación de NSView:

Si no se utiliza una pantalla ... método para dibujar un objeto NSView, debe invocar lockFocus antes de invocar métodos que envían comandos a el servidor de ventana, y debe equilibrarlo con un mensaje de desbloqueo cuando haya terminado.

Al ocultar o miniaturizar una ventana de una sola toma, la ventana de reserva para se liberará. Si no usa el mecanismo de visualización estándar para dibujar, debe usar lockFocusIfCanDraw en lugar de lockFocus si existe la posibilidad de dibujar mientras la ventana está miniaturizada u oculta.

Cuestiones relacionadas