NSWindow и сглаживание текста в представлении ячеек NSTableView

Я пишу приложение для OS X, и у меня проблема со сглаживанием шрифтов в отдельном окне.

У меня есть текстовое поле, куда вы помещаете текст и окно предложений, которое появляется со списком предложений в соответствии с тем, что вы написали. Я использую View-cell NSTableView для отображения этих предложений и SFBPopoverWindowController для отображения его как «всплывающего» окна (пробовал другие классы с таким же эффектом). Когда строки рисуются впервые, они выглядят нормально, но после того, как я их выбираю (клавиатура или мышь), шрифт меняет свой вес. Это только визуально - как если бы вы изменили метод сглаживания шрифта, а не его жирный шрифт.

Проблема сглаживания шрифта в ячейке

Здесь выделена ячейка "Музыкальная нота"

Что еще более странно, так это то, что после того, как я скрываю и показываю окно 3 раза, с этого момента все работает нормально.

Проблема сглаживания шрифта после трехкратного отображения окна

Опять же - выделенная ячейка - «Музыкальная нота».

Выбор осуществляется путем перезаписи класса NSTableRowView и его drawSelectionInRect: метода, но я попытался отрисовать все внутри пользовательского класса NSTableCellView, и это не помогло. Текст стандартный NSTextField - там ничего не изменилось.

Окно SFBPopoverWindow (и его контроллер) создается один раз и повторно используется с styleMask NSBorderlessWindowMask, backing NSBackingStoreBuffered, defer установлен на YES. Единственное изменение в SFBPopoverWindowController, которое я сделал, - это отключить окно, которое становится ключевым окном, но это ничего не меняет.


person shw    schedule 02.01.2013    source источник
comment
Я сам сталкивался с этой проблемой с настраиваемым представлением, в котором размещается много текста. После перерисовки некоторых частей текста с выделением (другой цвет фона) текст будет выглядеть неровным. Я не нашел ответа, но он исчез после того, как я перешел на использование CALayers. Я знаю, что это не помогает, но я считаю, что это ошибка как в 10.7, так и в 10.8.   -  person trojanfoe    schedule 02.01.2013


Ответы (1)


Это может быть связано с тем, как представление таблицы рисует выбранные ячейки (setSelectionHightLightStyle:). Попробуйте установить стиль None / NSTableViewSelectionHighlightStyleNone в коде или IB / файле раскадровки и нарисуйте выделение самостоятельно (в подклассе NSTableRowView).

Предпосылки: когда вы используете NSTableViewSelectionHighlightStyleRegular или NSTableViewSelectionHighlightStyleSourceList, табличное представление предполагает, что вы используете стандартное поведение и внешний вид выбора, и творит чудеса, чтобы поддержать это.

==========

ОБНОВЛЕНИЕ

==========

Мой предыдущий ответ по-прежнему действителен, но поскольку он описывает только проблему и намекает на обходной путь, я хотел добавить реальное решение. Если вы хотите использовать NSTableViewSelectionHighlightStyleRegular для представления таблицы (с настраиваемым шрифтом и цветами), вам нужен способ «отключить» системную магию, которая появляется после выделения строки. Одно из предлагаемых решений - отклонить статус первого респондента. У него много недостатков, и это совсем не лучшее решение.

Итак, давайте внимательнее посмотрим на системную «магию», которая срабатывает, как только строка будет выделена: NSTableRowView имеет свойство innerBackgroundStyle, которое - согласно документации - 'указывает, как должны рисоваться подпредставления '. Кроме того, 'Это значение динамически вычисляется на основе набора свойств, установленных для NSTableRowView. Подклассы могут переопределить это значение, когда они рисуют по-разному в зависимости от отображаемых в данный момент свойств. Этот метод также можно вызвать, чтобы определить, какой цвет следует использовать в подпредставлении, или, в качестве альтернативы, NSControls может установить для -backgroundStyle в своей ячейке это значение. '

Я предполагаю, что этот стиль будет передаваться по иерархии подпредставлений и заставит ваши текстовые поля выглядеть странно. Система предполагает, что выделенная ячейка имеет темный фон, и меняет interiorBackgroundStyle на темный. Другие элементы управления пытаются соответствующим образом адаптироваться.

Думаю, есть два решения этой проблемы:

1) Переопределите interiorBackgroundStyle в своем NSTableRowView подклассе и верните стиль, соответствующий вашему интерфейсу (в моем случае это .light, потому что мой цвет выделения очень ярко-синий). Это сработало для меня.

2) Если изменение всего стиля слишком много, потому что вы хотите, чтобы только определенные элементы не меняли свой стиль, вам может потребоваться только настроить эти подклассы. Я еще не пробовал.

person JanApotheker    schedule 08.05.2015
comment
Ян, ты только что спас мне рассудок. Я не думал, что инженеры AppKit занимаются волшебным рисованием, когда был выбран Regular. Я предполагал, что любые специальные вещи ограничиваются стилем списка источников. Святая корова. Спасибо. Мой стол теперь выглядит таким сексуальным. Будущие гуглеры, прочтите этот ответ. Это просто спасло человеку жизнь. - person Ben Stock; 15.09.2016
comment
Переопределение интерьераBackgroundStyle поработало для меня как шарм. Как ни странно, в моем приложении проблема проявлялась только на дисплеях без Retina. Текст в моем NSTableView на дисплеях Retina выглядел нормально. Несмотря на это, это исправление сработало. Спасибо! - person philbert1; 12.11.2019