Если вы хотите, чтобы он выглядел идеально, вам нужно нарисовать текст дважды.
Как видно при увеличении надписей под элементами панели инструментов в любом приложении или, например, на панели закладок в Safari (Control + прокрутка вверх, control + option + \ для переключения сглаживания увеличенного изображения), текст отображается с субпиксельным сглаживанием, по крайней мере, когда для параметра «Стиль сглаживания шрифтов» в системных настройках «Внешний вид» установлено значение «средний», которое будет по умолчанию на компьютерах Mac со встроенным или внешним дисплеем Apple с плоским экраном .
NSShadow нельзя использовать с субпиксельным сглаживанием, поэтому, если вы просто установите NSShadowAttributeName в словаре атрибутов, с которым вы рисуете строку, вы заметите, что субпиксельное сглаживание - это MIA при увеличении масштаба на вашем предоставленном тексте. Из-за того, как спроектирован NSShadow, независимо от того, какой цвет вы устанавливаете для своего экземпляра NSShadow - даже если он непрозрачный - он всегда будет отрисовываться с альфа-каналом, делая сглаживание субпикселя невозможным.
Решение действительно очень простое:
- Нарисуйте текст один раз белым цветом с некоторой прозрачностью,
- Затем нарисуйте его еще раз, пиксель выше в оттенке серого по своему вкусу без прозрачности.
Ваша 'тень' будет рисоваться без субпиксельного сглаживания, но фактический текст над ней будет рисоваться вместе с ним, давая вам тот же эффект, что и стандартные ярлыки элементов кнопок панели инструментов Какао или элементы на панели закладок Safari .
РЕДАКТИРОВАТЬ: Кажется, что элементы панели закладок в Safari также рисуют свои «тени» с точностью до субпикселя, поэтому, вероятно, так они и сделали, выбрав непрозрачный оттенок серого для белого «теневого» текста; Недостаток такого подхода: вы привязываете свой код для рисования, чтобы он хорошо работал только с определенным цветом фона, например, если ваши элементы будут использоваться на синем фоне, вы захотите установить для этого цвета светлый оттенок синего, чтобы он выглядел как полупрозрачный белый.