cocoa - 无法指定 CTLineDraw 的填充样式

标签 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);
}

我希望文本是红色的,下面有一个红色方 block (文本不会在这种背景下显示)。相反,我看到一个带有黑色文本的红色方 block 。

CTDrawLine 的极其详细的文档说: CT线绘制 绘制一条完整的线。

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

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

我错过了什么?

附录:

可能值得注意的是,我想要的最终结果是能够渲染充满图案和纯色的文本。

最佳答案

经过一番摆弄后,我发现您必须添加 kCTForegroundColorFromContextAttributeName, https://developer.apple.com/library/ios/documentation/Carbon/Reference/CoreText_StringAttributes_Ref/Reference/reference.html

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

关于cocoa - 无法指定 CTLineDraw 的填充样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21865646/

相关文章:

cocoa - 使用绑定(bind)/核心数据时为 "[something copyWithZone:]: unrecognized selector sent to instance"

cocoa - 使用字符串值填充 NSPopUpButtonCell

c++ - 如何从自定义数据流编写 CoreGraphics CGImageRef?

iphone - iPhone应用程序中的弧形文本

ios - 使用 CATransform3D 性能不佳

iphone - 现有圆上的曲线文本

cocoa - 如何从代码中禁用 NSBox

cocoa - 将文件拖放到 NSOutlineView 中

objective-c - 关于 Apple Cocoa 文档的问题

c++ - 在 C++ 中注册 WindowServer CGScreenRefreshCallback CGScreenUpdateMoveCallback