使用CGContextShowGlyphsAtPoint绘制文本 - 如何获取字体尺寸?

时间:2011-01-30 23:40:26

标签: objective-c cocoa macos core-graphics

希望这很简单。基本上,我正在将一些文本绘制到NSView上,并且需要知道正在绘制的字形的“物理”高度和宽度。

字体是固定宽度的,所以我不需要担心字距,我需要做的就是确保每个字形在其“空间”内水平和垂直居中

这不是实际的代码,但我重新编写它的方式应该会让我更容易理解我想要实现的目标。

CGFontRef myFontRef = CGFontCreateWithDataProvider(myFontDataProvider);
CGContextSetFont(thisContext, myFontRef);
CGFloat fontSize = 1.0; //will be changeable later
CGContextSetFontSize(thisContext, fontSize);
CGRect charBounds = CGRectMake(x, y, widthPerChar, heightPerChar);
//paint charBounds with background colour
CGFloat textX = x + 2;
CGFloat textY = y + 5;
CGContextShowGlyphsAtPoint(thisContext, textX, textY, (CGGlyph *)displayedString, 1);

如果我能够计算显示的字形的宽度,那么很容易找出textX和textY应该是什么。

感谢任何愿意提供帮助的人。

2 个答案:

答案 0 :(得分:0)

this code部分解决了 - 这就是我想出的:

CGContextSetTextDrawingMode(thisContext, kCGTextInvisible);            
CGContextShowGlyphsAtPoint(thisContext, 1, 1, (const CGGlyph *)"x", 1);
CGPoint postPosition = CGContextGetTextPosition(thisContext);
CGFloat textOffsetX = ((postPosition.x - 1) / 2);
CGFloat textOffsetY = (fontSize * 5);
CGContextSetTextDrawingMode(thisContext, kCGTextFillStroke);

不喜欢这样做,但它现在正在运作。至少可以为每个窗口调整大小计算一次,这不是太糟糕。

感谢您的帮助!

答案 1 :(得分:0)

您可以通过以下方式计算单个字形的宽度:

CGRect units;
 CGFontGetGlyphBBoxes(font, &glyph, 1, &units);
 float width = units.size.width/CGFontGetUnitsPerEm(font)*fontSize;