Si no le importa llamar a una API privada, puede dejar que el sistema operativo (CoreUI) lo sombree. Se necesita un par de declaraciones:
typedef CFTypeRef CUIRendererRef;
extern void CUIDraw(CUIRendererRef renderer, CGRect frame, CGContextRef context, CFDictionaryRef object, CFDictionaryRef *result);
@interface NSWindow(CoreUIRendererPrivate)
+ (CUIRendererRef)coreUIRenderer;
@end
y para el dibujo real:
CGRect drawRect = CGRectMake(x, y, width, height);
CGImageRef cgimage = your_image;
CFDictionaryRef dict = (CFDictionaryRef) [NSDictionary dictionaryWithObjectsAndKeys:
@"backgroundTypeRaised", @"backgroundTypeKey",
[NSNumber numberWithBool:YES], @"imageIsGrayscaleKey",
cgimage, @"imageReferenceKey",
@"normal", @"state",
@"image", @"widget",
[NSNumber numberWithBool:YES], @"is.flipped",
nil];
CUIDraw ([NSWindow coreUIRenderer], drawRect, cg, dict, nil);
CGImageRelease (cgimage);
Esto tomará el canal alfa de CGImage y aplicar el efecto de relieve, como se ve en la barra de botones. Puede o no necesitar la línea "is.flipped". Quítelo si su resultado está boca abajo.
Hay un montón de variaciones:
kCUIPresentationStateKey = kCUIPresentationStateInactive
: La ventana no está activa, la imagen será más ligero.
state = rollover
: Solo tiene sentido con la opción anterior. Esto significa que está sobre la imagen, la ventana está inactiva, pero el botón es sensible (el clic está habilitado). Se volverá más oscuro.
state = pressed
: Se produce cuando se presiona el botón.El ícono se pone un poco más oscuro.
Consejo extra: para averiguar cosas como esta, puede usar el complemento SIMBL CUITrace. Imprime todas las invocaciones de CoreUI de una aplicación de destino. Este es un tesoro si tiene que dibujar su propia interfaz de usuario de aspecto nativo.
utilizar un 'NSButtonCell' dibujar –