我是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文件(虽然我怀疑这会导致问题)。
我错过了什么?
附录:
值得注意的是,我希望的最终结果是能够渲染这个充满图案和纯色的文字。
答案 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 };