带核心图形的绘图文本

问题描述:

我需要将中心文本绘制到CGContext。带核心图形的绘图文本

我开始使用可可方法。我创建了一个用的NSCell文本,并试图由此绘制:

NSGraphicsContext* newCtx = [NSGraphicsContext 
    graphicsContextWithGraphicsPort:bitmapContext flipped:true]; 
[NSGraphicsContext saveGraphicsState]; 
[NSGraphicsContext setCurrentContext:newCtx]; 
[pCell setFont:font]; 
[pCell drawWithFrame:rect inView:nil]; 
[NSGraphicsContext restoreGraphicsState]; 

但CGBitmapContext似乎并不具备渲染它的文本。可能是因为我必须为inView:参数传递nil。

所以,我想切换文本渲染到核芯显卡:

最简单的方法似乎是使用CGContextSelectFont利用其Postscript名称来选择字体和字号,但CGContextShowTextAtPoint只需要非Unicode字符,没有明显的方法将文本合并到矩形中,或者计算一行文本的范围以手动布局矩形。

然后,可以创建一个CGFont,并设置cia CGContextSetFont。绘制此文本需要CGContextShowGlyphsAtPoint,但CGContext似乎缺少计算生成文本的边界矩形或将文本包装为矩形的函数。另外如何将字符串转换为CGGlyphs数组并不明显。

下一个选项是尝试使用CoreText来呈现字符串。但是Core Text类非常复杂,虽然有示例显示如何以指定字体显示文本,但是没有示例演示如何计算CoreText字符串的边界矩形。

所以:

  • 给定一个CGFont一个CGContext上我怎么计算一些文本的边界矩形,以及如何变换文本字符串到CGGlyphs数组?
  • 给定一个字符串,一个CGContext和一个附注名称和点大小,我需要创建什么Core Text对象来计算字符串的边界矩形,和/或绘制包装到CGContext的矩形的字符串。
  • 给定一个字符串和NSFont - 如何将字符串呈现到CGBitmapContext上?我已经知道如何获得它的范围。
+0

你能画一个想要的结果的例子吗? – hfossli 2010-12-20 14:15:37

我会继续你的上述方法,但使用NSAttributedString代替。

NSGraphicsContext* newCtx = [NSGraphicsContext graphicsContextWithGraphicsPort:bitmapContext flipped:true]; 
[NSGraphicsContext saveGraphicsState]; 
[NSGraphicsContext setCurrentContext:newCtx]; 
NSAttributedString *string = /* make a string with all of the desired attributes */; 
[string drawInRect:locationToDraw]; 
[NSGraphicsContext restoreGraphicsState]; 

我终于在4天的搜索后找到了答案。我真的希望苹果能做出更好的文档。所以我们去

我假设你已经有CGFontRef与你。如果不让我知道,我会告诉你如何从资源包加载到CgFontRef中的ttf。

下面的代码片段来计算任意字符串的范围与任何CGFontref

 int charCount = [string length]; 
     CGGlyph glyphs[charCount]; 
     CGRect rects[charCount]; 

     CTFontGetGlyphsForCharacters(theCTFont, (const unichar*)[string cStringUsingEncoding:NSUnicodeStringEncoding], glyphs, charCount); 
     CTFontGetBoundingRectsForGlyphs(theCTFont, kCTFontDefaultOrientation, glyphs, rects, charCount); 

     int totalwidth = 0, maxheight = 0; 
     for (int i=0; i < charCount; i++) 
     { 
      totalwidth += rects[i].size.width; 
      maxheight = maxheight < rects[i].size.height ? rects[i].size.height : maxheight; 
     } 

     dim = CGSizeMake(totalwidth, maxheight); 

重复使用相同的功能CTFontGetGlyphsForCharacters获得的字形。从CGFontRef得到CTFontRef使用CTFontCreateWithGraphicsFont()函数

还记得NSFont和CGFontRef是免费电话桥接,这意味着它们可以浇铸成彼此,他们将无缝地工作而无需任何额外的工作。