gpt4 book ai didi

cocoa - CATextLayer 中不需要的填充

转载 作者:行者123 更新时间:2023-12-03 16:55:09 24 4
gpt4 key购买 nike

我在 CATextLayer 中绘制字符时遇到问题,使得图层的大小恰好等于字符的大小。

我使用下面的代码来获取与字符串中的字符对应的字形的大小。目前我忽略了变音符号,因此我假设字形和字符之间存在一对一的相关性。

我还获得了尺寸为 128pt 的 Helvetica 字体的几个字符的良好边界框值:

Character | x   | y     | width | height |
B | 9.4 | 0.0 | 70.8 | 91.8 |
y | 1.3 | -27.4 | 61.2 | 96.0 |

我不确定表达坐标的坐标系原点位于哪里。我假设 (0,0) 位于最左侧并且垂直位于字体的基线上。这就是为什么 'y' 的 y 值为负。

我使用此代码来计算大写 B 的大小并相应地调整其 CATextLayer 的大小。

- (CATextLayer *) testTextLayer
{
CATextLayer *l = [CATextLayer layer];
l.string = @"B";
NSUInteger len = [l.string length];
l.fontSize =128.f;
CGColorRef blackColor = CGColorCreateGenericGray(0.f, 1.f);
l.foregroundColor = blackColor;
CGColorRelease(blackColor);

// need to set CGFont explicitly to convert font property to a CGFontRef
CGFontRef layerFont = CGFontCreateWithFontName((CFStringRef)@"Helvetica");
l.font = layerFont;

// get characters from NSString
UniChar *characters = (UniChar *)malloc(sizeof(UniChar)*len);
CFStringGetCharacters((__bridge CFStringRef)l.string, CFRangeMake(0, [l.string length]), characters);

// Get CTFontRef from CGFontRef
CTFontRef coreTextFont = CTFontCreateWithGraphicsFont(layerFont, l.fontSize, NULL, NULL);

// allocate glyphs and bounding box arrays for holding the result
// assuming that each character is only one glyph, which is wrong
CGGlyph *glyphs = (CGGlyph *)malloc(sizeof(CGGlyph)*len);
CTFontGetGlyphsForCharacters(coreTextFont, characters, glyphs, len);

// get bounding boxes for glyphs
CGRect *bb = (CGRect *)malloc(sizeof(CGRect)*len);
CTFontGetBoundingRectsForGlyphs(coreTextFont, kCTFontDefaultOrientation, glyphs, bb, len);
CFRelease(coreTextFont);

l.position = CGPointMake(200.f, 100.f);

l.bounds = bb[0];

l.backgroundColor = CGColorCreateGenericRGB(0.f, .5f, .9f, 1.f);

free(characters);
free(glyphs);
free(bb);

return l;
}

这是我从上面的代码中得到的结果。在我看来,大小是正确的,但是角色周围存在某种填充。

Result of the B on a CATextLayer

现在我的问题

  1. 我对字形边界框原点的假设正确吗?
  2. 如何在没有这种填充的情况下绘制字母,使其完全适合图层?或者,如何控制这种填充?

也许我在这里遗漏了一个明显的观点。在设置图层的大小和字体后,现在有没有办法以定义的方式收缩图层围绕字符(意味着使用可选的填充,有点像CSS)?

<小时/>

最佳答案

如何使用 CTFontCreatePathForGlyph 从字形创建 CGPath,然后使用 CGPathGetBoundingBox 获取其边界框?

另一种方法是以某种方式创建一个 CTRun 并使用 CTRunGetImageBounds 函数,该函数也返回一个“紧密”的边界框,但这可能需要比使用上述方法,您需要有一个图形上下文。

关于cocoa - CATextLayer 中不需要的填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10473847/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com