【发布时间】:2018-05-16 16:16:38
【问题描述】:
我一直在尝试精确测量字形边界,但此代码打印出 916!!!它的实际宽度是 69。
- (void)drawRect:(NSRect)dirtyRect {
CGContextRef main = [[NSGraphicsContext currentContext] graphicsPort];
CGContextSetTextMatrix(main, CGAffineTransformIdentity);
CGGlyph g;
CGPoint p = CGPointMake(100, 100);
CGRect rect = CGRectMake(0, 0, 0, 0);
CGFontRef font = CGFontCreateWithFontName((CFStringRef)@"Arial");
g = CGFontGetGlyphWithGlyphName(font, CFSTR("L"));
CGContextSetFont(main, font);
CGContextSetTextPosition(main, 0, 0);
CGContextSetFontSize(main, 200);
CGContextSetRGBFillColor(main, 0, 0, 1, 1);
CGContextShowGlyphsAtPositions(main, &g, &p, 1);
CGFontGetGlyphBBoxes(font, &g, 1, &rect);
printf("%f", rect.size.width);
}
【问题讨论】:
-
您真正想做什么? TextKit 可能会更容易做到这一点。
-
因为我想渲染单个字形并快速更改它们
-
这没什么好解释的。这里发生了什么是 TextKit 甚至 NSString 都做不到的?
-
如果您的性能需求如此紧张以至于基本的
NSString绘图无法满足您的要求,那么您可以接受每次使用相同字体调用CGFontCreateWithFontName的绘图方法似乎很奇怪。上面的代码真的比[NSString drawAtPoint:withAttributes:]快很多吗(具有一组静态定义的属性,因此您不必每次都重新计算字体对象?)或者您真的需要像连字这样的字形? (也许您当前的示例具有误导性,因为它使用“L?”)(不要减损 LGP 的答案,我敢肯定这是您需要的。) -
这只是我自己测试的简单示例
标签: objective-c cocoa core-graphics core-text