2010-10-27 4 views
2

У меня есть проект, который должен нарисовать текст в представлении с градиентом, заполняющим пользовательский подкласс NSView, как этот пример ниже.Рисование текста с градиентным заполнением в Cocoa

alt text

мне интересно, как я могу добиться этого, так как я довольно нового для какао чертежа.

ответ

2

Попробуйте использовать creating an alpha mask from the text, используя NSGradient для рисования в нем. Вот простой пример, основанный на связанном коде:

- (void)drawRect:(NSRect)rect 
{ 
    // Create a grayscale context for the mask 
    CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceGray(); 
    CGContextRef maskContext = 
    CGBitmapContextCreate(
     NULL, 
     self.bounds.size.width, 
     self.bounds.size.height, 
     8, 
     self.bounds.size.width, 
     colorspace, 
     0); 
    CGColorSpaceRelease(colorspace); 

    // Switch to the context for drawing 
    NSGraphicsContext *maskGraphicsContext = 
     [NSGraphicsContext 
      graphicsContextWithGraphicsPort:maskContext 
      flipped:NO]; 
    [NSGraphicsContext saveGraphicsState]; 
    [NSGraphicsContext setCurrentContext:maskGraphicsContext]; 

    // Draw the text right-way-up (non-flipped context) 
    [text 
     drawInRect:rect 
     withAttributes: 
      [NSDictionary dictionaryWithObjectsAndKeys: 
       [NSFont fontWithName:@"HelveticaNeue-Bold" size:124], NSFontAttributeName, 
       [NSColor whiteColor], NSForegroundColorAttributeName, 
      nil]]; 

    // Switch back to the window's context 
    [NSGraphicsContext restoreGraphicsState]; 

    // Create an image mask from what we've drawn so far 
    CGImageRef alphaMask = CGBitmapContextCreateImage(maskContext); 

    // Draw a white background in the window 
    CGContextRef windowContext = [[NSGraphicsContext currentContext] graphicsPort]; 
    [[NSColor whiteColor] setFill]; 
    CGContextFillRect(windowContext, rect); 

    // Draw the gradient, clipped by the mask 
    CGContextSaveGState(windowContext); 
    CGContextClipToMask(windowContext, NSRectToCGRect(self.bounds), alphaMask); 

    NSGradient *gradient = [[NSGradient alloc] initWithStartingColor:[NSColor blackColor] endingColor:[NSColor grayColor]]; 
    [gradient drawInRect:rect angle:-90]; 
    [gradient release]; 

    CGContextRestoreGState(windowContext); 
    CGImageRelease(alphaMask); 
} 

Это использует границы вида как градиентные границы; если вы хотите быть более точным, вам нужно будет получить высоту текста (информация об этом here).

+1

Спасибо! Я также нашел категорию из примера кода Apple (SpeedometerView) для NSString, который преобразует строку в путь безье, остальная часть вещи просто преобразует путь и заполняет его градиентом. – koo

Смежные вопросы