2017-02-01 40 views
2

我正在開發一個mac應用程序,該應用程序可以讓用戶放大內容。我需要測量我呈現的文字的大小。縮放縮放字體時,字體的磅值很小(即0.001)。當我使用[NSString sizeWithAttributes:]來獲得字符串的大小時,我得到正確的寬度,並且我總是得到1.0的高度。我也有一個iOS應用程序,這個渲染類用於iOS和Mac。在iOS上,當我使用UIFont且點大小爲.001時,我會在撥打sizeWithAttributes時獲得正確的高度。sizeWithAttributes在點的大小非常小時給出了NSFont在mac上的錯誤高度

+0

你在視圖生命週期中調用了哪個點,並且使用了自動佈局? –

+0

這是在一個圖層中。我在' - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx'中調用它,這是'NSView'上'drawRect:'層的等價層。我確實使用自動佈局來定位包含這些圖層的NSView。 –

+0

你知道了嗎?你可以在一個更小的,孤立的應用程序(你可以分享)重現嗎?我懷疑這是AppKit中的一個錯誤。你可以通過緩存最初的寬高比來自行解決問題嗎? –

回答

1

我有同樣的問題。下面的示例代碼

#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}

我的解決方法: 使用CTFont。

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);  
} 
相關問題