Это мой первый вопрос здесь, и я постараюсь сделать это как можно яснее.
Я хочу нарисовать пользовательский градиент в выбранной строке в NSTableView на основе представления, добавляя тонкий приподнятый эффект. Для этого мне нужно использовать более темный цвет для линий сетки до и после выбранной строки (см. здесь а> для примера). Я переопределил метод drawSeparatorInRect:
в NSTableRowView, чтобы нарисовать пользовательскую разделительную линию для выбранной строки (используя метод isSelected
в качестве флага), но я не могу сделать то же самое для строки выше/ниже (поскольку я рисую строку внизу/вверху).
Я пробовал несколько способов указать ближайшей строке, что она должна рисовать более темную разделительную линию, но безуспешно, поскольку шаг отображения не следует тому же порядку (я проверил это с помощью NSLogs в drawSeparatorInRect:
, и кажется, что при небольшой прокрутке этот порядок меняется). Итак, иногда (в основном после прокрутки) строка не знает, что она должна использовать более темный цвет, поскольку она рисуется перед выбранным (я думаю, в этот момент выбранная строка еще не знает, что она выбрана, иначе я не понимаю, что происходит).
Некоторые из вещей, которые я пробовал:
- В методе
drawSeparatorInRect:
выбранной строки я попытался получить доступ к представлениям братьев и сестер ([superview subviews]
) и заставить предыдущий/следующий снова рисовать себя. - Из подкласса
NSTableView
измените непосредственно ближайшую строку при изменении selectedIndexes. - Рисование линии за пределами выбранной строки из ее метода
drawSeparatorInRect:
, как показано здесь.
Обратите внимание, что я сделал это, используя: представление строки, спрашивающее, выбрана ли предыдущая/следующая, флаг closestRowIsSelected или внешний вызов метода для «принудительного» темного цвета.
Теперь у меня есть то, что выбранная строка рисует как верхнюю, так и нижнюю границы, поэтому одна из них помещается вместе с предыдущей/следующей линией строки... Это тонко, но все еще там.
Любая помощь будет хорошо принята.
Заранее спасибо.
! Я не публиковал никакого кода, так как проблема не в нем (он просто вызывает [NSBezierPath fillRect:rect]
с красным цветом), я думаю... так что мне нечего показать.