Подделка субпиксельного сглаживания текста с помощью Core Animation

Для всех, кто работает над проектом с представлениями с поддержкой слоя Core Animation, к сожалению, очевидно, что субпиксельное сглаживание (сглаживание текста) ) отключен для текста, который не отображается на предварительно заданном непрозрачном фоне. Теперь для людей, которые могут устанавливать непрозрачный фон для своего текста (либо с помощью вызова setBackgroundColor: , либо аналогичной настройки в Interface Builder), эта проблема не представляет особой проблемы. Для других, однако, у которых нет абсолютно никакого способа обойти это, это не то, что можно игнорировать.

Я уже более двух дней искал в Интернете решение, но ничего полезного не нашлось. Все, что я хочу сделать, - это создать текстовую метку (не редактируемую пользователем), которая устанавливается в окне листа (фон окна листа прозрачен, поэтому при объявлении представления содержимого листа wantLayer значение 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: Оказывается, ссылка выше тоже провальная. Хотя связанные методы дают субпиксельное сглаживание, они также не работают на прозрачном фоне.

31
задан Community 23 May 2017 в 11:47
поделиться