Как воспроизвести стиль вставного текста при рисовании текста с Mac OS X Cocoa? - PullRequest
5 голосов
/ 01 февраля 2009

Я говорю о стиле канавки текста на фокусированных полосах заголовка или панели закладок сафари, например. Есть ли простой способ воспроизвести этот стиль при использовании:

[string drawAtPoint:... withAttributes:...];

Ответы [ 2 ]

7 голосов
/ 01 февраля 2009

Если вы хотите, чтобы он выглядел идеально, вам нужно нарисовать текст дважды.

Как видно при увеличении надписей под элементами панели инструментов в любом приложении или, например, на панели закладок в Safari (Control + прокрутка вверх, control + option + \ для переключения сглаживания увеличенного изображения), текст отображается с субпиксельным сглаживанием, по крайней мере, когда для параметра «Стиль сглаживания шрифтов» в системных настройках «Внешний вид» установлено значение «средний», которое будет по умолчанию на компьютерах Mac со встроенным или внешним дисплеем Apple с плоским экраном .

NSShadow нельзя использовать с субпиксельным сглаживанием, поэтому, если вы просто установите NSShadowAttributeName в словаре атрибутов, с которым вы рисуете строку, вы заметите, что субпиксельное сглаживание - это MIA при увеличении масштаба на вашем предоставленном тексте. Из-за того, как спроектирован NSShadow, независимо от того, какой цвет вы устанавливаете для своего экземпляра NSShadow - даже если он непрозрачный - он всегда будет отрисовываться с альфа-каналом, делая сглаживание субпикселя невозможным.

Решение действительно очень простое:

  1. Нарисуйте текст один раз белым цветом с некоторой прозрачностью,
  2. Затем нарисуйте его еще раз, пиксель выше в оттенке серого по своему вкусу без прозрачности.

Ваша 'тень' будет рисоваться без субпиксельного сглаживания, но фактический текст над ней будет рисоваться вместе с ним, давая вам тот же эффект, что и стандартные ярлыки элементов кнопок панели инструментов Какао или элементы на панели закладок Safari .

РЕДАКТИРОВАТЬ: Кажется, что элементы панели закладок в Safari также рисуют свои «тени» с точностью до субпикселя, поэтому, вероятно, так они и сделали, выбрав непрозрачный оттенок серого для белого «теневого» текста; Недостаток такого подхода: вы привязываете свой код для рисования, чтобы он хорошо работал только с определенным цветом фона, например, если ваши элементы будут использоваться на синем фоне, вы захотите установить для этого цвета светлый оттенок синего, чтобы он выглядел как полупрозрачный белый.

3 голосов
/ 01 февраля 2009

Нарисуйте его без тени под ним. Используйте тень белого цвета, непрозрачность 50% или около того, размытие 0, смещение на 1 пункт вниз.

Простой способ сделать это - просто нарисовать текст дважды. В первый раз вы рисуете его на 1 пункт ниже, белым, с непрозрачностью 50%. Второй раз вы рисуете его в желаемой позиции, в желаемом цвете, с желаемой (вероятно, 100%) непрозрачностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...