2013-07-02 41 views
0

我使用這些功能在圖像上繪製文本:的iOS:CGContext上SetTextDrawingMode不同的字符會導致崩潰/沒有文本繪製

char* text = (char *)[text1 cStringUsingEncoding:NSASCIIStringEncoding]; 
CGContextSelectFont(context, "Helvetica", fontSize, kCGEncodingMacRoman); 
CGContextSetTextDrawingMode(context, kCGTextFill); 
CGContextSetRGBFillColor(context, 0.0, 0.1, 0.1, 1); 
CGContextShowTextAtPoint(context, 5, 20, text, strlen(text)); 

它正常工作,除非我有字符,如「U」,「 ö「,」ä「等與strlen等 - 它會導致崩潰。所以我試圖在此行之前使用此字符串來獲取字符串的長度

char* text = (char *)[text cStringUsingEncoding:NSASCIIStringEncoding]; 
by doing this: 
int length = [text length]; 
and then replace strlen(text) with length. 

它不會導致崩潰,但不會繪製文本。我認爲這裏的罪魁禍首是人物。 我試過

kCGEncodingMacRoman 
kCGEncodingFontSpecific 

但沒有什麼幫助。你能和我一起嗎?謝謝。

更新: @馬丁R:

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
CGContextRef context = CGBitmapContextCreate(NULL, 90.0f, 90.0f, 8, 4 * 90.0f, colorSpace,  kCGImageAlphaPremultipliedFirst); 
CGContextDrawImage(context, CGRectMake(0, 0, 90.0f, 90.0f), img.CGImage); 

CGContextSetTextDrawingMode(context, kCGTextFill); 
CGContextSetRGBFillColor(context, 0.8, 0.1, 0.1, 1); 
[text1 drawAtPoint:(CGPoint){5, 20} withFont:[UIFont fontWithName:@"Helvetica" size:10.0f]]; 
CGImageRef finalImage = CGBitmapContextCreateImage(context); 

CGContextRelease(context); 
CGColorSpaceRelease(colorSpace); 

UIImage *image = [UIImage imageWithCGImage:finalImage]; 
CGImageRelease(finalImage); 

return image; 
+0

我認爲它是一個錯字或複製/粘貼錯誤,您在'char * text =(char *)[text ...]'兩側使用'text'? –

回答

1

CGContextShowTextAtPoint()根據CGContextSelectFont()指定的編碼參數,這是蘋果羅馬你的情況解釋給定的文本。所以,你應該 轉換使用

NSString *string = @"äöü"; 
const char *text = [string cStringUsingEncoding:NSMacOSRomanStringEncoding]; 

或者字符串,你可以使用的NSStringdrawAtPoint:withFont:方法,其中 自動處理Unicode字符:

NSString *string = @"äöü€"; 
[string drawAtPoint:CGPointMake(5, 20) withFont:[UIFont fontWithName:@"Helvetica" size:12]]; 
+0

@Unheilig:不與CGContextShowTextAtPoint()。對於CGContextSelectFont(),您只能選擇kCGEncodingFontSpecific(非常無用)和kCGEncodingMacRoman(不包含日文字符,並且存在例如歐元/€字符的問題)。 - 正確的解決方案是使用drawAtPoint:withFont :. –

+0

@Unheilig:查看更新的答案。但請注意,方向不同,您可能需要修改轉換矩陣。 –

+1

@Unheilig:1)是的,它適用於所有Unicode字符(如果字體中可用)。 - 2)當我測試'drawAtPoint'解決方案時,文本與'CGContextShowTextAtPoint()'方法相比是顛倒的。也許你只是在你的項目中嘗試它。 –