Это прекрасно работает для меня:
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];
В основном я добавляю черный слой с непрозрачностью 33% поверх фактического значка (маскируя его с помощью NSCompositeSourceAtop
).А потом я просто рисую затемненный значок с непрозрачностью 75%.
[Редактировать: избавился от временного черного изображения с помощью NSRectFillUsingOperation (...), как советует Николай Рухе ]