Я работаю над Mac-приложением, которое позволяет пользователю значительно приближать контент. Мне нужно измерить размер текста, который я делаю. Когда я масштабирую шрифт для увеличения, размер точки шрифта очень мал (т. Е. 0,001). Когда я использую [NSString sizeWithAttributes:]
, чтобы получить размер строки, я получаю правильную ширину, и я всегда получаю 1.0 для высоты. У меня также есть приложение iOS, и этот класс рендеринга используется как на iOS, так и на Mac. На iOS, когда я использую UIFont
с размером точки .001, я получаю правильную высоту, когда звоню sizeWithAttributes
.sizeWithAttributes дает неправильную высоту с NSFont на маке, когда размер точки очень мал
2
A
ответ
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);
}
В какой момент вы называете это в жизненном цикле просмотра и используете ли вы автоматическую компоновку? –
Это слой. Я называю это в слое '- (void) drawLayer: (CALayer *) inContext: (CGContextRef) ctx', который является эквивалентом уровня' drawRect: 'на' NSView'. Я использую auto-layout для размещения NSView, который содержит эти слои. –
Вы уже поняли это? Можете ли вы воспроизвести это в небольшом изолированном приложении (которое вы могли бы поделиться)? Я подозреваю, что это ошибка в AppKit. Можете ли вы работать, возможно, кэшируя начальное соотношение ширины и высоты и определяя высоту самостоятельно? –