2009-12-23 11 views
3

Voici mon code:NSShadow avec une sous-classe NSButton

- (void)drawRect:(NSRect)dirtyRect { 
    // Drawing code here. 
    // Create the Gradient 
    NSGradient *fillGradient = nil; 
    if (mouseIsDown) 
     fillGradient = [[NSGradient alloc] initWithStartingColor:[NSColor colorWithCalibratedRed:0.868 green:0.873 blue:0.868 alpha:1.000] endingColor:[NSColor colorWithCalibratedRed:0.687 green:0.687 blue:0.687 alpha:1.000]]; 
    else 
     fillGradient = [[NSGradient alloc] initWithStartingColor:[NSColor colorWithCalibratedRed:0.687 green:0.687 blue:0.687 alpha:1.000] endingColor:[NSColor colorWithCalibratedRed:0.868 green:0.873 blue:0.868 alpha:1.000]]; 
    // Add The Text 
    NSDictionary *att = nil; 

    NSMutableParagraphStyle *style = 
    [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; 
    [style setLineBreakMode:NSLineBreakByWordWrapping]; 
    [style setAlignment:NSLeftTextAlignment]; 
    att = [[NSDictionary alloc] initWithObjectsAndKeys: 
      style, NSParagraphStyleAttributeName, 
      [NSColor blackColor], 
      NSForegroundColorAttributeName, nil]; 
    [style release]; 

    // Create the path 
    aPath = [[NSBezierPath bezierPath] retain]; 

    [aPath moveToPoint:NSMakePoint(10.0, 0.0)]; 
    [aPath lineToPoint:NSMakePoint(70.0, 0.0)]; 
    [aPath lineToPoint:NSMakePoint(70.0, 23.0)]; 
    [aPath lineToPoint:NSMakePoint(10.0, 23.0)]; 
    [aPath lineToPoint:NSMakePoint(0.0, 10.0)]; 

    NSShadow *shadow = [[NSShadow alloc] init]; 
    [shadow setShadowColor:[NSColor blackColor]]; 
    [shadow setShadowOffset:NSMakeSize(0, 0)]; 
    [shadow setShadowBlurRadius:5]; 
    [shadow set]; 

    NSRect rect; 
    rect.size = [[self title] sizeWithAttributes:att]; 
    rect.origin.x = floor(NSMidX([self bounds]) - rect.size.width/2 - 8); 
    rect.origin.y = floor(NSMidY([self bounds]) - rect.size.height/2 - 5); 

    [fillGradient drawInBezierPath:aPath angle:90.0]; 
    [fillGradient release]; 
    [[self title] drawInRect:rect withAttributes:att]; 
    [att release]; 

} Le problème est que le NSShadow est derrière le texte ne le NSBezierPath, « aLigne », comment pourrais-je ajouter l'ombre du l'NSBezierPath?

Répondre

4

Essayez d'envelopper la substance de remplissage chemin NSShadow et de Bézier (par exemple, aPath = [[NSBezierPath bezierPath] retain];-[fillGradient release];) dans [NSGraphicsContext saveGraphicsState] et [NSGraphicsContext restoreGraphicsState].

En outre, l'ombre peut être découpée par les limites de la vue (je ne me souviens pas si cela est vrai ou non).

(De plus, le « plus propre » façon de le faire serait probablement sous-classe NSButtonCell aussi bien, remplaçant drawWithFrame:inView:/-drawInteriorWithFrame:inView: et retourner votre méthode de votre bouton classe de cellules personnalisée à partir +cellClass (assurez-vous de définir la classe cellulaire appropriée dans IB aussi bien, ou en l'échangeant dans le -initWithCoder: de votre bouton.) La manière que vous le faites peut cependant répondre à vos besoins.)