Как рассчитать точную высоту текста с помощью UIKit? - PullRequest
4 голосов
/ 06 января 2012

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

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

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

Плотно ли переносит какая-то другая функция текст? В идеале я ищу что-то эквивалентное Android Paint.getTextBounds ().

Ответы [ 2 ]

3 голосов
/ 06 января 2012

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

1 голос
/ 06 января 2012

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

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

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

    check(iFont != NULL);
    lineHeight += CTFontGetLeading(iFont);
    return lineHeight;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...