2009-06-14 5 views
0

Ich habe eine Unterklasse von NSOutlineView erstellt und den folgenden Code verwendet, um die Zeilenfarben zu wechseln.NSOutlineView nicht tun, was es in seiner Unterklasse tun sollte

Header-Datei.

#import <Cocoa/Cocoa.h> 


@interface MyOutlineView : NSOutlineView { 
} 

- (void) drawStripesInRect:(NSRect)clipRect; 

@end 

Implementierungsdatei.

#import "MyOutlineView.h" 

// RGB values for stripe color (light blue) 
#define STRIPE_RED (237.0/255.0) 
#define STRIPE_GREEN (243.0/255.0) 
#define STRIPE_BLUE (254.0/255.0) 
static NSColor *sStripeColor = nil; 

@implementation MyOutlineView 

// This is called after the table background is filled in, 
// but before the cell contents are drawn. 
// We override it so we can do our own light-blue row stripes a la iTunes. 
- (void) highlightSelectionInClipRect:(NSRect)rect { 
    [self drawStripesInRect:rect]; 
    [super highlightSelectionInClipRect:rect]; 
} 

// This routine does the actual blue stripe drawing, 
// filling in every other row of the table with a blue background 
// so you can follow the rows easier with your eyes. 
- (void) drawStripesInRect:(NSRect)clipRect { 
    NSRect stripeRect; 
    float fullRowHeight = [self rowHeight] + [self intercellSpacing].height; 
    float clipBottom = NSMaxY(clipRect); 
    int firstStripe = clipRect.origin.y/fullRowHeight; 
    if (firstStripe % 2 == 0) 
     firstStripe++; // we're only interested in drawing the stripes 
    // set up first rect 
    stripeRect.origin.x = clipRect.origin.x; 
    stripeRect.origin.y = firstStripe * fullRowHeight; 
    stripeRect.size.width = clipRect.size.width; 
    stripeRect.size.height = fullRowHeight; 
    // set the color 
    if (sStripeColor == nil) 
     sStripeColor = [[NSColor colorWithCalibratedRed:STRIPE_RED 
                green:STRIPE_GREEN 
                blue:STRIPE_BLUE 
                alpha:1.0] retain]; 
    [sStripeColor set]; 
    // and draw the stripes 
    while (stripeRect.origin.y < clipBottom) { 
     NSRectFill(stripeRect); 
     stripeRect.origin.y += fullRowHeight * 2.0; 
    } 
} 

@end 

Aber das Problem ist, dass, was der Code tun soll geschieht nicht in die Gliederungsansicht, der Code korrekt ist, aber muss ich die Gliederungsansicht, um den Code zu verbinden ist eine Möglichkeit?

Antwort

4

Wenn Sie die Gliederungsansicht in IB instanziieren, müssen Sie den Klassennamen Ihrer Gliederungsansicht im Identity-Inspektor auf "MyOutlineView" festlegen. Denken Sie daran, auf das Steuerelement doppelzuklicken, damit das innere Rechteck ausgewählt wird und der Titel des Inspektorfensters "Umrissansicht-Identität" lautet; Mit einem einzigen Klick auf das Steuerelement wird nur die Bildlaufansicht ausgewählt (eine Umrissansicht ist in eine Bildlaufansicht eingebettet).

Wenn Sie Ihre Gliederungsansicht programmatisch erstellen, nur sicher sein, ein instanziiert MyOutlineView statt eines NSOutlineView:

MyOutlineView *outlineView = [[MyOutlineView alloc] initWithFrame:rect]; 

wo rect der Rahmen Ihrer Gliederungsansicht ist.

+0

Perfekt! Du bist fantastisch! Ich frage mich nur, ob du mir mit 1 letzten Sache helfen könntest, wie würde ich die Gitterlinienfarbe Gelb statt Blau machen. Ich weiß, dass ich die Zahlen ändern müsste, wo es sagt, aber was würde ich ändern müssen? Danke sehr sehr! – Joshua

+0

STRIPE_RED, STRIPE_GREEN und STRIPE_BLUE sind die RGB-Werte der Farben. Wenn Sie die RGB-Werte des gewünschten Gelbs finden, ändern Sie diese entsprechend, und behalten Sie /255.0 bei, da sie offensichtlich als Dezimalzahl zwischen 0 und 1 dargestellt werden. –