2011-08-12 7 views
7

Tengo un NSImageView que carga una imagen del paquete de la aplicación.NSI de tamaño redimensionado Vista no redibujado

Es configuración como tal:

coverImage.image = [NSImage imageNamed:@"themeSignEnd.png"]; 
coverImage.imageScaling = NSImageScaleNone; 
coverImage.imageAlignment = NSImageAlignLeft; 

La imagen muestra muy bien.

El tamaño de la NSImageView se calcula en función de otros factores y luego ajusta utilizando este código:

coverImage.frame = CGRectMake((1280 - 869)/2, 0, 869 * percentage, 800); 

Esto funciona perfectamente bien la primera vez que se lleva a cabo (cuando se inicia la aplicación).

El NSImageView toma el tamaño y la imagen contenida se corta en el borde apropiado.

Desafortunadamente, cuando trato de cambiar el tamaño del NSImageView mientras la aplicación se está ejecutando (usando el mismo código anterior), no se actualizará visiblemente.

NSLogging el coverImage.frame muestra que el cuadro en sí se ha actualizado correctamente. Sin embargo, la vista no parece volver a dibujarse, ni al contraerse ni al hacer crecer el marco. Además, cuando salgo y reinicio la aplicación, el NSImageView dibuja el borde correcto.

¿Qué podría causar tal comportamiento?

¿Es posible que el NSImageView simplemente no se vuelva a dibujar? Si es así, ¿cómo puedo forzar un rediseño?

¿Hay alguna otra peculiaridad de NSImageView que omití que puede llevar a este comportamiento?

edición:

Resulta que este error sólo ocurre cuando la propiedad se establece en ImageFrameStyleNSImageFrameNone. Si el marco está configurado para cualquier otra cosa, se vuelve a dibujar bien. Desafortunadamente, necesitamos que la imagen se muestre sin un marco.

¿Hay alguna diferencia en la representación de NSImageViews con y sin marcos que podría explicar esto?

+0

¿Está actualizando el marco de la vista desde el hilo principal? –

+0

@Rob -> Sí, lo soy. – 0x90

+0

Ojalá hubiera una solución para esto. Si descubrió algo nuevo, publíquelo. Cambiar el estilo de marco no tiene ningún efecto para mí. Curiosamente, redimensionar aún más dibujará mi imagen y la actualizará. Si cambio de tamaño más pequeño, deja de actualizarse. – spartygw

Respuesta

1

Así que encontré una forma de evitar esto, sin embargo es bastante hackish.

Como se mencionó en la edición, este error solo se produce con ImageFrameStyle establecido en NSImageFrameNone. Cuando me puse la ImageFrameStyle a otra cosa, a continuación, cambiar su tamaño, luego otra vez en NSImageFrameNone de nuevo después de cambiar el tamaño, las cosas funcionan bien:

[coverImage setImageFrameStyle: NSImageFramePhoto]; 
coverImage.frame = CGRectMake((1280 - 869)/2, 0, 869 * percentage, 800); 
[coverImage setImageFrameStyle: NSImageFrameNone]; 

esto funciona, pero no es muy bonito. Por lo tanto, dejaré la pregunta abierta por un par de días más con la esperanza de encontrar una mejor respuesta.

+0

Hola, ¿esto todavía funciona? Lo intenté, pero parece que no funciona. – GeneCode

0

¿Es posible que el NSImageView simplemente no se vuelva a dibujar? Si es así, ¿cómo puedo forzar un rediseño?

Probar [imageView setNeedsDisplay: YES].

+0

Gracias por la entrada. Se agregó [coverImage setNeedsDisplay: YES]; después del código que establece el nuevo marco. Lamentablemente, el error permanece sin cambios. – 0x90

0

He observado algún comportamiento inesperado al usar vistas respaldadas por capas.En este tipo de vistas, una capa almacena en caché lo que se dibuja, incluidas las imágenes, lo que da como resultado un comportamiento inesperado. Vea en qué se configura la propiedad "wantsLayer" de su NSView para saber si la capa de respaldo está activada.

Cuestiones relacionadas