Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 使用CGContextShowGlyphsAtPoint绘制文本-如何获取字体尺寸?_Objective C_Cocoa_Macos_Core Graphics - Fatal编程技术网

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

Objective c 使用CGContextShowGlyphsAtPoint绘制文本-如何获取字体尺寸?,objective-c,cocoa,macos,core-graphics,Objective C,Cocoa,Macos,Core Graphics,希望这相当简单。基本上,我正在NSView上绘制一些文本,需要知道绘制的标志符号的物理高度和宽度 字体是固定宽度的,所以我不需要担心字距,我所需要做的就是确保每个字形在其空间内水平和垂直居中 这不是实际的代码,但我已经以一种更容易理解我试图实现的方式重新编写了它 CGFontRef myFontRef = CGFontCreateWithDataProvider(myFontDataProvider); CGContextSetFont(thisContext, myFontRef); CGFl

希望这相当简单。基本上,我正在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应该是什么

提前感谢所有愿意提供帮助的人。

部分原因在于-以下是我的想法:

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);
我不太喜欢这样做,但它现在正在发挥作用。至少可以为每个窗口调整大小计算一次,这还不错


谢谢你的帮助

可以通过以下方式计算单个图示符的宽度:

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

尽管存在NSView,但这并不是真正的Cocoa或Objective-C。添加了通用osx标记。您是否有意使用纯核心图形来绘制图示符(可能是为了性能或使用纯CGContext或其他原因)?否则,您可以使用一些更高级别的API(如NSText NSString和NSAttributedString或CoreText)进行文本测量。在核心图形中也可能有,不过我现在还不知道。IIRC,它的文本处理相当简单。@NSGod:性能非常重要,但如果我能使CoreText适合固定大小,我可能会再次研究它。我们已经解决了如何计算它的宽度:通过将绘图模式设置为KCGTVISIBLE,并使用CGContextGetTextPosition计算出下一个字符的绘制位置,现在只需要计算出高度。谢谢你的回复!我不明白你在用textOffsetX和Y做什么?你是说,x和y?如果是这样的话,我还是不确定。