Я знаю, этот пост немного старше, но у меня недавно была похожая проблема, и я хотел бы поделиться с вами ее решением.
Имея подкласс NSTextView, я хотел отображать цвета строк в чередующемся порядке. Чтобы иметь возможность изменять цвета извне, я добавил в свой подкласс две переменные экземпляра, XNSStripedTableView:
@interface XNSStripedTableView : NSTableView {
NSColor *pColor; // primary color
NSColor *sColor; // secondary color
}
@property (nonatomic, assign) NSColor *pColor;
@property (nonatomic, assign) NSColor *sColor;
@end
Перезапись highlightSelectionInClipRect: помогает установить правильный цвет для соответствующего clipRect.
- (void)highlightSelectionInClipRect:(NSRect)clipRect
{
float rowHeight = [self rowHeight] + [self intercellSpacing].height;
NSRect visibleRect = [self visibleRect];
NSRect highlightRect;
highlightRect.origin = NSMakePoint(NSMinX(visibleRect), (int)(NSMinY(clipRect)/rowHeight)*rowHeight);
highlightRect.size = NSMakeSize(NSWidth(visibleRect), rowHeight - [self intercellSpacing].height);
while (NSMinY(highlightRect) < NSMaxY(clipRect)) {
NSRect clippedHighlightRect = NSIntersectionRect(highlightRect, clipRect);
int row = (int) ((NSMinY(highlightRect)+rowHeight/2.0)/rowHeight);
NSColor *rowColor = (0 == row % 2) ? sColor : pColor;
[rowColor set];
NSRectFill(clippedHighlightRect);
highlightRect.origin.y += rowHeight;
}
[super highlightSelectionInClipRect: clipRect];
}
Единственная проблема сейчас в том, где установить начальные значения для pColor и sColor? Я пробовал awakeFromNib :, но это заставило бы отладчик выдать ошибку. Так что я углубился в проблему с NSLog: и нашел простое, но жизнеспособное решение: установив начальные значения в viewWillDraw: . Поскольку объекты не создаются при первом вызове метода, мне пришлось проверить nil .
- (void)viewWillDraw {
if ( pColor == nil )
pColor = [[NSColor colorWithSRGBRed:0.33 green:0.33 blue:0 alpha:1] retain];
if ( sColor == nil )
sColor = [[NSColor colorWithSRGBRed:0.66 green:0.66 blue:0 alpha:1] retain];
} * * тысяча двадцать-один
Я думаю, что это решение довольно неплохо :-), хотя можно было бы повторно выбрать имена pColor, а sColor можно было бы настроить так, чтобы они были более «удобочитаемыми для человека».