2008-11-04 16 views
5

Necesito poner la imagen de un NSProgressIndicator en una NSOutlineView Cell. He redactado código que hace esto para un indicador determinado y funciona muy grande:Obteniendo un NSImage de un NSProgressIndicator

NSProgressIndicator *progressIndicator = [[NSProgressIndicator alloc] initWithFrame:NSMakeRect(0, 0, 16, 16)]; 
[progressIndicator setStyle:NSProgressIndicatorSpinningStyle];   
[progressIndicator setIndeterminate:NO]; 
[progressIndicator setMaxValue:100.0]; 
[progressIndicator setDoubleValue:somePercentage];   

NSImage *updateImage = [[NSImage alloc] initWithData:[progressIndicator dataWithPDFInsideRect:[progressIndicator frame]]]; 
[progressIndicator release]; 


return [updateImage autorelease]; 

he tratado de modificar el código para darme también imágenes indicadoras indeterminadas. Sin embargo, para el caso indeterminado, siempre obtengo una imagen en blanco de 16x16. (He confirmado esto escribiendo la imagen en un archivo en cada caso, el caso determinado me da la imagen del indicador de progreso, el caso indeterminado siempre es un cuadrado blanco de 16x16).

El código modificado es:

if(self.lengthUnknown) 
{ 
    NSProgressIndicator *progressIndicator = [[NSProgressIndicator alloc] initWithFrame:NSMakeRect(0, 0, 16, 16)]; 
    [progressIndicator setStyle:NSProgressIndicatorSpinningStyle];   
    [progressIndicator setIndeterminate:YES]; 

    NSImage *updateImage = [[NSImage alloc] initWithData:[progressIndicator dataWithPDFInsideRect:[progressIndicator frame]]]; 
    [progressIndicator release]; 


    return [updateImage autorelease]; 
} 
else 
{ 
// Same code as the first listing, this case works fine 
} 

Haz indicadores de progreso indeterminada utilizan algún tipo de dibujo que causa -dataWithPDFInsideRect: ser incapaz de capturar su imagen?


Más información: Intenté fijar el indicador de progreso a no utilizar la animación roscado, así como tratar de agarrar el contenido a través del método de lockFocus NSImage como se sugiere a continuación, pero ninguno de esos intentos hizo una diferencia.

El código de celda de indicador de progreso que Dave menciona a continuación (AMIndeterminateProgressIndicatorCell) es una gran solución, pero me gustaría saber por qué no puedo utilizar la misma técnica que funciona con el modo determinado.

Respuesta

2

indicadores de progreso hacen uso de un subproceso de fondo para mantener su animación dibujando incluso si el hilo principal está ocupado haciendo otra cosa, por lo que es posible que es lo que está causando el problema. Puede intentar llamar a setUsesThreadedAnimation: NO en el indicador de progreso antes de hacer su dibujo para ver si eso hace la diferencia.

Otro tacto sería crear un NSImage en blanco, y luego llamar al método drawRect: del indicador de progreso para procesar sus contenidos en el búfer de imágenes. Eso sería algo así como:

 
NSProgressIndicator* progressIndicator; 
NSImage* image = [[NSImage alloc] initWithSize:[progressIndicator bounds].size]; 
[image lockFocus]; 
[progressIndicator drawRect:[progressIndicator bounds]]; 
[image unlockFocus];