2012-01-23 119 views
1

我需要將文本繪製到CGContext中,並且希望使用CATextLayer來設置文本。任何人都可以給我一些關於如何完成的步驟。我爲它編寫了一些代碼,但不知道它的正確性(因爲我是iPhone開發的新手)。使用帶有CGContext的CATextLayer

一些基本問題:1。 如何獲取位置和文本的大小設置CATextLayer框架 2.文字莫名其妙地冒出來倒我已經使用CGAffineTransform固定的,但它是一個哈克修復,我想了解文本出現倒轉的真正原因。 3.我還需要設置我使用NSAttributedString的文本邊框寬度和顏色,但是設置文本大小(增大或減小)並不反映在屏幕上。

編輯1:

我已經更新了代碼,按您的建議,但即使使用CTFontRef後的文本沒有調整。另外,在iPhone上,文字從頂部被截斷一些。任何想法是什麼設置不正確?當我檢查我從getTypographicBounds得到的值時,它們都是0(origin.x,origin.y,width和height)。

的getTypographicBounds方法:

width = CTLineGetTypographicBounds(m_line, &ascent, &descent, &leading); 

// Return text bounds 
return CGRectMake(0, 0, width, ascent + descent); 

修改後的代碼:

CATextLayer* text  = [[CATextLayer alloc] init]; 
CGColorSpaceRef rgbColor = CGColorSpaceCreateDeviceRGB(); 
CGColorRef rgb   = CGColorCreate(rgbColor, m_fill_color); 
text.foregroundColor  = rgb; 
text.frame    = CGRectMake([self getTypographicBounds].origin.x, [self getTypographicBounds].origin.y, [self getTypographicBounds].size.width + 2*m_padding, [self getTypographicBounds].size.height + 2*m_padding); 
text.wrapped    = YES; 

    NSMutableDictionary *stringAttributes = [NSMutableDictionary dictionary]; 

    CTFontRef aCFFont = CTFontCreateWithName ((CFStringRef)m_font_name, 30.0, NULL); 

    // Set a negative width so we get both stroke and fill to show 
    [stringAttributes setObject: (NSObject*)aCFFont forKey: (id)kCTFontNameAttribute]; 
    [stringAttributes setObject: [NSNumber numberWithFloat: -3 ] forKey: (id)kCTStrokeWidthAttributeName]; 
    [stringAttributes setObject: [UIColor whiteColor] forKey: (id)kCTStrokeColorAttributeName]; 

    NSAttributedString *stringToDraw = [[NSAttributedString alloc] initWithString:m_text 
                     attributes:stringAttributes]; 

    text.string = (NSString*)stringToDraw; 
    [text drawInContext:ctx]; 

編輯2:維基示例使用CTLine,我使用CATextLayer。 Reason :: CATextLayer允許我在運行時修改文本,以便顯示中文,日文,印地文,俄文和所有使用不同腳本的語言。而且,CATextLayer似乎比CoreText更清晰地呈現。

我現在面臨的問題是由[文本drawInContext:ctx]行顯示的文本從頂部截斷。我檢查了框架和文字字體大小。字體大小爲16像素,幀高爲17.768,所以我不知道它爲什麼會被截斷。

// Ensure CTLine is up-to-date 
if (m_is_dirty) 
    [self recomputeLine]; 

// Get text metrics 
CGFloat width; 
CGFloat ascent; 
CGFloat descent; 
CGFloat leading; 

width = CTLineGetTypographicBounds(m_line, &ascent, &descent, &leading); 

// Position text so that top of text aligns with top of layer 
CGContextSetTextMatrix(ctx, CGAffineTransformIdentity); 

// Setup text drawing style 
CGContextSetRGBFillColor (ctx, m_fill_color [0], m_fill_color [1], m_fill_color [2], 1.0); 
CGContextSetRGBStrokeColor (ctx, m_stroke_color[0], m_stroke_color[1], m_stroke_color[2], 1.0); 
CGContextSetFont   (ctx, m_font  ); 
CGContextSetFontSize  (ctx, m_font_size ); 
CGContextSetLineWidth  (ctx, m_stroke_width); 

CATextLayer* text  = [[CATextLayer alloc] init]; 
CGColorSpaceRef rgbColor = CGColorSpaceCreateDeviceRGB(); 
CGColorRef rgb   = CGColorCreate(rgbColor, m_fill_color); 
text.foregroundColor  = rgb; 
text.fontSize = m_font_size; 
text.font = m_font; 
text.frame    = CGRectMake([self getTypographicBounds].origin.x, [self getTypographicBounds].origin.y, [self getTypographicBounds].size.width, [self getTypographicBounds].size.height); 
text.wrapped    = YES; 

NSMutableDictionary *stringAttributes = [NSMutableDictionary dictionary]; 


// Set a negative width so we get both stroke and fill to show 
[stringAttributes setObject: [UIFont fontWithName:m_font_name size:m_font_size] forKey: (id)kCTFontNameAttribute]; 
[stringAttributes setObject: [NSNumber numberWithFloat: -3 ] forKey: (id)kCTStrokeWidthAttributeName]; 
[stringAttributes setObject: [UIColor whiteColor] forKey: (id)kCTStrokeColorAttributeName]; 

NSAttributedString *stringToDraw = [[NSAttributedString alloc] initWithString:m_text 
                     attributes:stringAttributes]; 

text.string = (NSString*)stringToDraw;   
[text drawInContext:ctx]; 

在此先感謝

尼克

回答

1

這是因爲用於CGContexts翻轉的座標空間。有關完整說明(附圖),請參閱here

編輯: 控制倉位繪製文本之前翻譯的情況下:

CGContextTranslateCTM(context, x, y); 

編輯2:

看起來你需要使用CTFontRef,而不是一個UIFont。有關示例,請參閱here(請參閱Gordon Apple Wed Jun 23 10:40:23 2010發佈)。

編輯3:

除非特別需要使用NSAttributedString,我會建議使用更簡單的NSString drawInRect:withFont:lineBreakMode:對齊:方法。它爲您創建一個CATextLayer,但更易於使用:

UIFont *font = [UIFont fontWithName:m_font_name size:30.f]; 
    [m_text drawInRect:text.frame withFont:font lineBreakMode:UILineBreakModeWordWrap alignment:UITextAlignmentLeft]; 

編輯4:

嘗試設置你的字典裏是這樣的:

CTFontRef ctFont = CTFontCreateWithName((__bridge CFStringRef)fontName, pointSize,NULL); 
    CGColorRef color = textColor.CGColor; 

    NSDictionary *attributesDict = [NSDictionary dictionaryWithObjectsAndKeys: 
            (__bridge id)ctFont, (id)kCTFontAttributeName, 
            color, (id)kCTForegroundColorAttributeName,nil]; 
+0

酷。現在座標空間是完美的。但仍然無法根據NSAttributedString中設置的屬性調整CATextLayer的大小或設置CATextLayer的.fontSize屬性。 – nikj

+0

我編輯顯示如何控制位置。至於大小,我不明白什麼是錯的。字體是否正確?它的尺寸是多少,你想要做成多大? –

+0

嘿傑斯華,我已更新帖子,請看看。 – nikj