Работа с точками или пикселями при использовании UIFont

Я пытался расположить строку в вертикальном центре CGRect в моем методе drawRect:(CGRect).

CGRect имеет такой размер:

CGRect rect = CGRectMake(0.0f, 0.0f, rectWidth, rectHeight);

Чтобы нарисовать строку так, чтобы она была по центру, я сначала попробовал это:

CGFloat diffHeightRectAndFont = rectHeight - font.capHeight;
[str drawAtPoint:CGPointMake(0.0f, diffHeightRectAndFont * 0.5f) withFont:font];

Я сначала предположил, что это найдет разницу в высоте между моим прямоугольником и шрифтом, а затем смещение шрифта на половину этой высоты должно дать позицию y в «наилучшем месте».

Однако capHeight указывается в пунктах, а rectHeight — в пикселях, поэтому это решение работает для шрифтов размером 12–15. После этого разница начала позиционировать строку за пределами прямоугольника.

Я просмотрел это несколько раз, и единственным способом последовательного правильного позиционирования строки оказался этот «хак», который действителен, но не творит чудес с читабельностью кода:

CGFloat diffHeightRectAndFont = rectHeight - [[NSString stringWithString:@"F"] sizeWithFont:font].height;

Есть ли более прямой способ получить высоту заглавной буквы в пикселях с помощью определенного шрифта?

Заранее спасибо:)


person RickiG    schedule 15.04.2011    source источник


Ответы (1)


Я знаю, что немного поздно. но тем не менее мой ответ моя помощь кому-то другому.

NSString имеет метод sizeWithFont: (задокументированный здесь), который, я думаю, можно использовать для этого. Он возвращает структуру CGSize, поэтому вы можете сделать что-то похожее на следующее, чтобы найти высоту текста внутри вашей метки.

CGSize textSize = [[текст метки] sizeWithFont:[шрифт метки]];

CGFloat heightOfStringWithSpecifiedFont = textSize.height;

UILabel имеет свойство шрифта, которое вы можете использовать для динамического получения сведений о шрифте для вашей метки, как я делаю выше.

Надеюсь это поможет :)

person Pavan    schedule 29.08.2012