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