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.