2017-02-01 2 views
2

Я работаю над Mac-приложением, которое позволяет пользователю значительно приближать контент. Мне нужно измерить размер текста, который я делаю. Когда я масштабирую шрифт для увеличения, размер точки шрифта очень мал (т. Е. 0,001). Когда я использую [NSString sizeWithAttributes:], чтобы получить размер строки, я получаю правильную ширину, и я всегда получаю 1.0 для высоты. У меня также есть приложение iOS, и этот класс рендеринга используется как на iOS, так и на Mac. На iOS, когда я использую UIFont с размером точки .001, я получаю правильную высоту, когда звоню sizeWithAttributes.sizeWithAttributes дает неправильную высоту с NSFont на маке, когда размер точки очень мал

+0

В какой момент вы называете это в жизненном цикле просмотра и используете ли вы автоматическую компоновку? –

+0

Это слой. Я называю это в слое '- (void) drawLayer: (CALayer *) inContext: (CGContextRef) ctx', который является эквивалентом уровня' drawRect: 'на' NSView'. Я использую auto-layout для размещения 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)); 

доходность по прошивке 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);  
} 
Смежные вопросы