Для тех, кто работает над проектом с представлениями на основе слоев Core Animation, к сожалению, очевидно, что сглаживание на субпикселях (сглаживание текста) отключено для текста, не отображаемого на заданном непрозрачном фоне. Теперь для людей, которые могут установить непрозрачные фоны для своего текста (либо с помощью вызова setBackgroundColor:
, либо с помощью эквивалентных настроек в Интерфейсном Разработчике), эта проблема не представляет большой проблемы. Однако для других, у которых нет абсолютно никакой возможности обойти это, нельзя игнорировать это.
Более двух дней я искал онлайн решение, и ничего полезного не нашлось. Все, что я хочу сделать, это создать текстовую метку (не редактируемую пользователем), которая устанавливается в окне листа (фоны окна листа прозрачны, поэтому представление содержимого листа объявляет wantsLayer
как true, отключает сглаживание текста для всех меток на окно); что-то очень простое. Я видел много оспариваемых решений (быстрый поиск в Google поднимет эту тему во многих других местах), но до сих пор все эти решения основаны на способности людей и желании идти на компромисс с непрозрачным фоном (чего вы не можете использовать на листе).
Пока лучшее направление, которое я могу себе представить, это предварительно визуализировать текст с сглаживанием текста на изображении, а затем отобразить изображение, как обычно, в режиме со слоями. Тем не менее, это не представляется возможным. «Обычный» способ, который я бы предположил, можно попробовать вот так:
NSAttributedString *string = [[self cell] attributedStringValue];
NSImage *textImage = [[NSImage alloc] initWithSize:[string size]];
[textImage lockFocus];
[string drawAtPoint:NSZeroPoint];
[textImage unlockFocus];
Но, похоже, это не работает (скорее всего, потому что при вызове из drawRect:
в настроенном графическом контексте уже отключено сглаживание текста - субпиксельное сглаживание отключено, и вместо него используется обычное сглаживание), но оно также не работает более сложное решение найдено в этом вопросе (где вы создаете свой собственный графический контекст).
Так как же возможно сделать что-то подобное? Можно ли как-то «подделать» эффект сглаживания текста? Существуют ли даже обходные пути, которые могут что-то настроить? Я действительно не хочу отказываться от Core Animation только из-за этой глупой проблемы; Есть много преимуществ, которые экономят много времени и кода.
Редактировать: После долгих поисков я что-то нашел. Хотя сам поток только подтверждает мои подозрения, я думаю, что, возможно, нашел одно решение проблемы: пользовательский CALayer
рисунок. Тимоти Вуд в одном из своих ответов приложил пример проекта, в котором показано сглаживание шрифтов с использованием нескольких методов, некоторые из которых работают. Я посмотрю, как интегрировать это в свой проект.
Редактировать # 2: Оказывается, ссылка выше также перебор. Хотя связанные методы обеспечивают сглаживание на субпикселях, они также не работают на прозрачных фонах.