2014-02-18 50 views
1

我是OS-X/Cocoa開發的新手,我在CTDrawLine上遇到了一些麻煩。使用CGContextSetStrokeXXX變體(我甚至可以使用模式)在使用kCGTextStroke進行繪製時可以愉快地更改文本的筆畫,但是當我將模式設置爲kCGTextFill時,當前上下文的填充樣式將被忽略,並且文本呈現黑色。這裏有一些代碼演示了這個問題。無法指定填充樣式CTLineDraw

-(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文件中(儘管我懷疑這會導致問題)。

我錯過了什麼?

附錄:

這可能是值得關注我的期望的最終結果是能夠呈現這段文字充滿模式,以及純色。

回答