用渐变填充可可的绘图文本

时间:2010-10-27 11:33:03

标签: cocoa text drawing gradient

我有一个项目需要在视图中使用渐变填充在NSView的自定义子类中绘制文本,如下面的示例所示。

alt text

我想知道如何实现这一目标,因为我对Cocoa绘图很陌生。

1 个答案:

答案 0 :(得分:3)

尝试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的信息)。