无法为CTLineDraw指定填充样式

时间:2014-02-18 21:23:25

标签: cocoa quartz-graphics

我是OS-X / Cocoa开发的新手,我在使用CTDrawLine时遇到了一些麻烦。当使用kCGTextStroke绘制时,我可以使用CGContextSetStrokeXXX变体(我甚至可以使用模式)来改变文本的笔划,但是当我将模式设置为kCGTextFill时,将忽略当前上下文的填充样式,并将文本呈现为黑色。这是一些演示此问题的代码。

-(void) drawRect: (NSRect)rect {
    CGContextRef context = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort];


    float x = 50;
    float y = 50;

    CTFontRef font = CTFontCreateWithName(CFSTR("Arial"), 74, NULL);

    CFStringRef stringRef = CFStringCreateWithCString(NULL, "Hello SO", kCFStringEncodingUTF8);
    CFStringRef keys[] = { kCTFontAttributeName };
    CFTypeRef values[] = { font };
    CFDictionaryRef attributes = CFDictionaryCreate(kCFAllocatorDefault, (const void**)&keys,
                                                        (const void**)&values, sizeof(keys)/sizeof(keys[0]),
                                                        &kCFTypeDictionaryKeyCallBacks,
                                                        &kCFTypeDictionaryValueCallBacks);

    CFAttributedStringRef attrString = CFAttributedStringCreate(kCFAllocatorDefault, stringRef, attributes);
    CTLineRef line = CTLineCreateWithAttributedString(attrString);

    CGContextSetTextPosition(context, x, y);
    CGContextSetTextDrawingMode(context, kCGTextFill);

    // why doesn't this work?
    CGContextSetRGBFillColor(context, 1, 0, 0, 1);
    CGContextFillRect(context, CGRectMake(0, 0, 200, 200));
    CTLineDraw(line, context);

    CFRelease(stringRef);
    CFRelease(attributes);
    CFRelease(line);
    CFRelease(attrString);
    CFRelease(font);
}

我希望文字是红色的,下方有一个红色方块(文字不会出现在这个背景下)。相反,我看到一个带有黑色文字的红色方块。

CTDrawLine的令人难以置信的详细文档说: CTLineDraw 绘制完整的一行。

在CoreText或Quartz的引用中没有明显的替代路径来指定填充样式。我可以获得所需文本填充样式的唯一方法是使用kCGTextClip并在该区域上填充一个矩形,这是愚蠢的。

我正在测试OS-X 10.9并使用XCode 5进行构建,使用C ++ 11语言扩展,这是一个.mm文件(虽然我怀疑这会导致问题)。

我错过了什么?

附录:

值得注意的是,我希望的最终结果是能够渲染这个充满图案和纯色的文字。

1 个答案:

答案 0 :(得分:3)

稍微摆弄一下我发现你必须添加kCTForegroundColorFromContextAttributeName,https://developer.apple.com/library/ios/documentation/Carbon/Reference/CoreText_StringAttributes_Ref/Reference/reference.html

CFStringRef keys[] = { kCTFontAttributeName, kCTForegroundColorFromContextAttributeName };
CFTypeRef values[] = { font, kCFBooleanTrue };