2010-11-25 11 views
5

Si no soy realmente quisquilloso sobre el tono exacto, etc. de la imagen atenuada, ¿hay una manera rápida y sucia de dibujar un NSImage ligeramente atenuado, como este ? He buscado en línea y realmente no puedo encontrar lo que estoy buscando (pero no soy muy bueno a la hora de entender los gráficos y los términos técnicos correctos).La manera más fácil de dibujar un NSImaged atenuado (como una vista deshabilitada)

Non-dimmed Dimmed

estoy realmente oscurecimiento iconos para el mismo caso de uso como Xcode oscurecimiento iconos como anteriormente (es decir, el documento tiene cambios sin guardar).

Respuesta

16

Esto funciona muy bien para mí:

NSImage *iconImage = [NSImage imageNamed:@"Icon"]; 
NSSize iconSize = [iconImage size]; 
NSRect iconRect = NSMakeRect(0.0, 0.0, iconSize.width, iconSize.height); 
[iconImage lockFocus]; 
[[NSColor colorWithCalibratedWhite:0.0 alpha:0.33] set]; 
NSRectFillUsingOperation(iconRect, NSCompositeSourceAtop); 
[iconImage unlockFocus]; 
[iconImage drawInRect:iconRect 
       fromRect:iconRect 
      operation:NSCompositeSourceOver 
       fraction:0.75]; 

Básicamente estoy añadiendo una capa de negro con un 33% de opacidad en la parte superior del icono real (enmascararlo con NSCompositeSourceAtop). Y luego estoy dibujando el icono atenuado con una opacidad del 75%.

[Editar: se deshizo imagen temporal del negro utilizando NSRectFillUsingOperation (...), según lo aconsejado por Nikolai Ruhe]

+0

Quien downvoted que era un poco duro. Esto funciona ¿Puede quien haya votado por favor hacer lo decente y comentar por qué, por favor? :) – d11wtq

+1

Usando 'NSRectFillUsingOperation' para dibujar encima de' iconImage' puede deshacerse de 'blackImage'. –

+0

Solo pensaba eso yo mismo. Solo dibuje un rectángulo oscuro que sea semiopaco sobre la parte superior de la rect. La imagen ha sido dibujada. Básicamente debería hacer lo mismo. A punto de refactorizar – d11wtq

Cuestiones relacionadas