2012-01-05 3 views
4

Я использую -[NSString sizeWithFont], чтобы получить высоту текста. Символ 't' явно выше, чем 'm', но -sizeWithFont возвращает ту же высоту для обеих этих строк. Вот код:Как вычислить точную высоту текста с помощью UIKit?

UIFont* myFont = [UIFont fontWithName:@"Helvetica" size:1000.0]; 
NSString* myStr = @"m"; 
CGSize mySize = [myStr sizeWithFont:myFont]; 

С 'т', как показано на рисунке, она возвращает {834, 1151}. С myStr = @"t" вместо этого, это {278, 1151}. Меньшая ширина отображается, как ожидалось, но не высота.

Есть ли какая-либо другая функция, плотно обертывающая текст? Я идеально ищу что-то, что эквивалентно Paint.getTextBounds() для Android.

+0

'sizeWithFont' возвращает максимально возможный размер для любого символа этого шрифта. Похоже на то, что вы действительно хотите сделать, это добраться до сырых глифов и получить высоту каждого персонажа. –

ответ

1

Хммм ... Предполагаю, что вы будете работать только с отдельными персонажами. sizeWithFont, как отмечено выше, возвращает высоту самого большого символа этого шрифта, поскольку текстовое поле будет такой высотой, независимо от того, что вы делаете. Вы могли бы получить КРУПНЕЙШИЕ значения высоты (UIFont's CGFloat capHeight), но похоже, что вы будете работать со всеми типами текста.

Я хотел бы взглянуть на структуру CoreText. Запустите here и зачитайте. Неизбежно вы получите что-то в этом роде:

CGFloat GetLineHeightForFont(CTFontRef iFont) 
{ 
    CGFloat lineHeight = 0.0; 

    check(iFont != NULL); 
    lineHeight += CTFontGetLeading(iFont); 
    return lineHeight; 
} 
3

Информация, полученная вами от этого метода, - это в основном высота строки для шрифта (т. Е. Это восхождение плюс спуск для выбранного шрифта). Он не основан на отдельных символах, он основан на определенных показателях шрифта. Вы можете получить большую часть информации о метрике шрифта из класса UIFont (например, метод -ascender дает вам высоту зажима для шрифта). В основном, вы будете иметь дело с общим объемом вертикального пространства, необходимого для рисования глифов с высотами и наименьшими descenders для этого шрифта. Невозможно получить информацию об отдельных глифах из UIFont. Если вам нужна эта информация, вам нужно взглянуть на структуру CoreText, которая дает вам большую гибкость в том, как вы рисуете и размещаете глифы, но гораздо сложнее в использовании.

Дополнительную информацию о работе с текстом в приложении можно найти в разделе Drawing and Managing Text раздела Text, Web, and Editing Programming Guide. Это также хороший отправной пункт для большинства фреймворков и классов, которые вам понадобятся, если вы поедете по маршруту UIKit или CoreText.

Смежные вопросы