NSOutlineView настраиваемое представление для ячеек без использования NSTableRowView - PullRequest
0 голосов
/ 06 марта 2012

Я хочу знать, как установить фон выбранного элемента в NSOutlineView.Установив SelectionHighlightStyle на NSTableViewSelectionHighlightStyleSourceList, я получаю стандартный интенсивный синий режим подсветки.

Мне удалось изменить фон выбранного NSTextFieldCell, но левую часть фона строкибыл еще стандартный синий.Кроме того, я не могу определить градиент.

Поэтому я понял, что должен использовать пользовательский вид, и нашел NSTableRowView.Но так как я работаю над 10.6.8 , я подумал, есть ли какая-либо другая возможность создать собственный стиль подсветки градиента.И даже лучше было бы использовать альтернативный подход к использованию NSTableRowView в целом.

Я не нашел никакой информации, чтобы реализовать это ни в одном классе или делегировании.Если ничего подобного нет, как Apple спроектировала и разработала список источников в XCode 4.2?Синий цвет намного светлее, а верхний элемент имеет две строки.

1 Ответ

3 голосов
/ 06 марта 2012

NSTableViews на основе представлений / NSOutlineViews доступны только для 10.7 и выше, поэтому любое решение, использующее NSTableRowView, не будет работать, если вы пытаетесь поддерживать 10.6.8. Я бы сделал это, используя собственный подкласс NSOutlineView. Затем переопределите -highlightSelectionInClipRect: и -drawBackgroundInClipRect:. В -highlightSelectionInClipRect: вы нарисуете градиентную подсветку для выбранных строк, которые вы можете получить, используя -selectedRowIndexes и -rectOfRow.

Код для всего этого не будет ужасно простым, но я делал это раньше, так что это определенно возможно. Одна ошибка, которая в какой-то момент вызвала у меня серьезные головные боли, это то, что внутренне, -drawBackgroundInClipRect: вызывается из -[NSOutlineView drawRect] и напрямую -[NSClipView drawRect]. Вызывающий метод определяет пространство координат, в котором находится аргумент clipRect. Вы можете использовать этот фрагмент кода, чтобы убедиться, что он находится в координатном пространстве NSTableView:

- (void)drawBackgroundInClipRect:(NSRect)clipRect
{
    clipRect = [self convertRect:clipRect fromView:[NSView focusView]];

    // Now do your background drawing. 
    // Easy if it's a solid background, more complex if you want alternating row colors
}

С учетом всего вышесказанного, это становится намного проще, если вы можете пойти дальше и просто использовать View-Based NSTableView / NSOutlineView и отказаться от поддержки 10.6. В этом случае вам вообще не нужно создавать подкласс NSOutlineView, и вы можете выполнять все свои собственные рисунки в простых подклассах NSTableRowView и NSTableCellView.

...