当点大小非常小时,sizeWithAttributes 在 mac 上使用 NSFont 给出错误的高度



我正在开发一个Mac应用程序,该应用程序可以让用户放大内容。 我需要测量我呈现的文本的大小。 当我缩放字体以进行缩放时,字体的点大小非常小(即 0.001)。 当我使用 [NSString sizeWithAttributes:] 来获取字符串的大小时,我得到了正确的宽度,并且我总是得到 1.0 的高度。 我还有一个iOS应用程序,这个渲染类在iOS和Mac上都使用。 在 iOS 上,当我使用磅值为 .001 的UIFont时,当我调用 sizeWithAttributes 时,我会得到正确的高度。

我遇到了同样的问题。以下示例代码

#if TARGET_OS_IOS == 0
#define UIFont NSFont
#define NSStringFromCGSize NSStringFromSize
#endif
UIFont *uiFont = [UIFont fontWithName:@"Courier" size:19];
CGSize boxSize = [@"1" sizeWithAttributes:@{NSFontAttributeName:uiFont}];
NSLog(@"boxSize %@", NSStringFromCGSize(boxSize));

在 iOS boxSize {11.40185546875, 19} 上产生收益 ,在 macOS boxSize {11.40185546875, 24} .

我的解决方法:使用周大福。

CTFontRef _contentFont = CTFontCreateWithName((__bridge CFStringRef)@"Courier", 19, NULL);
CGGlyph glyphs[1];
UniChar chars[1];
chars[0] = '1';
bool rc = CTFontGetGlyphsForCharacters(_contentFont, chars, glyphs, 1);
if (rc) {
  double advance = CTFontGetAdvancesForGlyphs(_contentFont, kCTFontOrientationDefault, glyphs, NULL, 1);
  boxSize.width = advance;
  boxSize.height = CTFontGetAscent(_contentFont) + CTFontGetDescent(_contentFont);    
}

最新更新