Если вы не возражаете против вызова частного API, вы можете позволить операционной системе (CoreUI) сделать за вас затенение.Вам нужно несколько объявлений:
typedef CFTypeRef CUIRendererRef;
extern void CUIDraw(CUIRendererRef renderer, CGRect frame, CGContextRef context, CFDictionaryRef object, CFDictionaryRef *result);
@interface NSWindow(CoreUIRendererPrivate)
+ (CUIRendererRef)coreUIRenderer;
@end
И для фактического рисунка:
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);
Это займет альфа-канал cgimage и применяет эффект тиснения, как видно на кнопках панели инструментов.Вы можете или не можете нуждаться в строке "is.flipped".Удалите его, если ваш результат перевернут.
Существует несколько вариантов:
kCUIPresentationStateKey = kCUIPresentationStateInactive
: окно не активно, изображение будет светлее.
state = rollover
: имеет смысл только с предыдущей опцией.Это означает, что вы наводите курсор на изображение, окно неактивно, но кнопка чувствительна (переход по нажатию включен).Становится темнее.
state = pressed
: Происходит при нажатии кнопки.Значок становится немного темнее.
Дополнительный совет: чтобы узнать подобные вещи, вы можете использовать плагин SIMBL CUITrace .Он распечатывает все вызовы CoreUI целевого приложения.Это сокровищница, если вам нужно нарисовать свой собственный интерфейс.