Рисование текста с градиентной заливкой в ​​Какао - PullRequest
3 голосов
/ 27 октября 2010

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

alt text

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

1 Ответ

3 голосов
/ 06 декабря 2010

Попробуйте создать альфа-маску из текста , а затем использовать 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);
}

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

...