NSTableView: Как нарисовать пользовательские разделители до и после выбранной строки

Это мой первый вопрос, и я постараюсь сделать его как можно более ясным.

Я хочу нарисовать настраиваемый градиент в выбранной строке в NSTableView на основе представления, добавляя при этом едва уловимый эффект выпуклости. Для этого мне нужно использовать более темный цвет для линий сетки, которые находятся до и после выбранной строки (см. здесь для примера). Я переопределил метод drawSeparatorInRect: в NSTableRowView , чтобы нарисовать линию настраиваемого разделителя для выбранной строки (используя метод isSelected в качестве флага), но я не могу сделать то же самое для верхнего / нижнего (так как я рисую линию внизу / вверху).

Я пробовал несколько способов указать ближайшей строке, что она должна рисовать более темную разделительную линию, но безуспешно, поскольку шаг отображения не соответствует тому же порядку (я проверил это с помощью NSLogs в drawSeparatorInRect: , и кажется, что при небольшой прокрутке этот порядок меняется). Итак, иногда (в основном после прокрутки) строка не знает, что ей следует использовать более темный цвет, поскольку она рисует себя перед выбранным (я думаю, что на данный момент выбранная строка еще не знает, что она выбрана, в противном случае я не понимаю в чем дело).

Некоторые из вещей, которые я пробовал:

  1. В методе drawSeparatorInRect: выбранной строки я попытался получить доступ к представлениям братьев и сестер ( [subviews супервизора] ) и заставьте предыдущий / следующий снова нарисовать себя.
  2. Из подкласса NSTableView измените непосредственно ближайшую строку при изменении selectedIndexes .
  3. Рисование линии за пределами выбранной строки из метода drawSeparatorInRect: , как показано здесь .

Обратите внимание, что я сделал это, имея: представление строки, спрашивающее, выбран ли предыдущий / следующий, флаг closestRowIsSelected или внешний вызов метода для «принудительного» использования темного цвета.

Теперь у меня есть то, что выбранная строка рисует как верхнюю, так и нижнюю границы, поэтому одна из них помещается вместе в строку предыдущей / следующей строки ... Это незаметно, но все еще там.

Любая помощь будет принята хорошо.

Заранее благодарю.

! Я не публиковал никакого кода, так как проблемы там нет (он просто вызывает [NSBezierPath fillRect: rect] с красным цветом), я думаю ... так что мне нечего показать.

9
задан Community 23 May 2017 в 10:30
поделиться