我需要將文本繪製到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];
在此先感謝
尼克
酷。現在座標空間是完美的。但仍然無法根據NSAttributedString中設置的屬性調整CATextLayer的大小或設置CATextLayer的.fontSize屬性。 – nikj
我編輯顯示如何控制位置。至於大小,我不明白什麼是錯的。字體是否正確?它的尺寸是多少,你想要做成多大? –
嘿傑斯華,我已更新帖子,請看看。 – nikj