Размер шрифта в пикселях - PullRequest
36 голосов
/ 29 июня 2009

На iPhone как рассчитать размер символа в пикселях для заданного размера точки?

Ответы [ 7 ]

62 голосов
/ 29 июня 2009

Размеры точек определены как 1/72 дюйма . То есть шрифт с 72 точками составляет приблизительно 1 дюйм от самого низкого спуска до самого высокого подъема. Таким образом, максимальная высота глифа в шрифте 72pt составляет около 1 дюйма.

Страница технических характеристик Apple iphone утверждает, что iPhone в настоящее время имеет разрешение 163 пикселей на дюйм. Таким образом, 72 точки - это 163 пикселя, или около 2,2639 пикселей на точку. Просто помните, что каждый глиф различается по высоте и ширине, так что это очень приблизительная оценка размера. Как правило, расстояние между базовыми линиями будет немного больше, чем размер шрифта, поэтому строки текста не будут сталкиваться друг с другом.

Если вам нужны точные измерения (и вы, вероятно, делаете это), вам нужно будет измерить глифы шрифта, используя информацию о метрике шрифта. Вы можете сделать это, используя USSit дополнения NSString , которые позволят вам измерить размер конкретной строки при визуализации на экране.

32 голосов
/ 24 мая 2011

Чтобы сопоставить размеры шрифта (в точках) на iPhone4 с размерами шрифта (в точках) в Photoshop, необходимо установить для документа Photoshop значение 144 dpi. Я провел несколько тестов, и это разрешение дает результаты 1: 1.

Шаги:

  • Сделайте снимок экрана «Настройки» Общие »Специальные возможности» Большой текст » на iPhone4
  • Открыть скриншот в Photoshop
  • Измените разрешение с 72 dpi на 144 dpi с помощью «Resample Image» off
  • Повторите ввод текста в Photoshop (в точках), чтобы соответствовать размеру на скриншоте

Я прошел через несколько разных разрешений, в том числе 163 точек на дюйм, которые были упомянуты в ответе выше, и я обнаружил, что 144 точек на дюйм дает результаты 1: 1. Я также проверил это на нативном приложении, где я знаю размеры точек, и 144dpi было там же.

5 голосов
/ 27 февраля 2014

Наш художник-график очень определенно использовал на некоторых устройствах размеры пикселей вместо размера точек. Функция ниже вернет шрифт в зависимости от размера пикселя. Он использует метод грубой силы, чтобы найти закрытый шрифт, но затем кэширует результаты, поэтому в следующий раз возврат будет очень быстрым. Я всегда ценю комментарии о том, как этот код можно сделать лучше. Я использую эту функцию в качестве статического члена класса в классе с именем utils. Вы можете легко вставить в любой класс, который вы используете. Надеюсь, что это поможет.

/** return a font as close to a pixel size as possible
example:
    UIFont *font = [Utils fontWithName:@"HelveticaNeue-Medium" sizeInPixels:33];
 @param fontName name of font same as UIFont fontWithName
 @param sizeInPixels size in pixels for font
 */
+(UIFont *) fontWithName:(NSString *) fontName sizeInPixels:(CGFloat) pixels {
    static NSMutableDictionary *fontDict; // to hold the font dictionary
    if ( fontName == nil ) {
        // we default to @"HelveticaNeue-Medium" for our default font
        fontName = @"HelveticaNeue-Medium";
    }
    if ( fontDict == nil ) {
        fontDict = [ @{} mutableCopy ];
    }
    // create a key string to see if font has already been created
    //
    NSString *strFontHash = [NSString stringWithFormat:@"%@-%f", fontName , pixels];
    UIFont *fnt = fontDict[strFontHash];
    if ( fnt != nil ) {
        return fnt; // we have already created this font
    }
    // lets play around and create a font that falls near the point size needed
    CGFloat pointStart = pixels/4;
    CGFloat lastHeight = -1;
    UIFont * lastFont = [UIFont fontWithName:fontName size:.5];\

    NSMutableDictionary * dictAttrs = [ @{ } mutableCopy ];
    NSString *fontCompareString = @"Mgj^";
    for ( CGFloat pnt = pointStart ; pnt < 1000 ; pnt += .5 ) {
        UIFont *font = [UIFont fontWithName:fontName size:pnt];
        if ( font == nil ) {
            NSLog(@"Unable to create font %@" , fontName );
            NSAssert(font == nil, @"font name not found in fontWithName:sizeInPixels" ); // correct the font being past in
        }
        dictAttrs[NSFontAttributeName] = font;
        CGSize cs = [fontCompareString sizeWithAttributes:dictAttrs];
        CGFloat fheight =  cs.height;
        if ( fheight == pixels  ) {
            // that will be rare but we found it
            fontDict[strFontHash] = font;
            return font;
        }
        if ( fheight > pixels ) {
            if ( lastFont == nil ) {
                fontDict[strFontHash] = font;
                return font;
            }
            // check which one is closer last height or this one
            // and return the user
            CGFloat fc1 = fabs( fheight - pixels );
            CGFloat fc2 = fabs( lastHeight  - pixels );
            // return the smallest differential
            if ( fc1 < fc2 ) {
                fontDict[strFontHash] = font;
                return font;
            } else {
                fontDict[strFontHash] = lastFont;
                return lastFont;
            }
        }
        lastFont = font;
        lastHeight = fheight;
    }
    NSAssert( false, @"Hopefully should never get here");
    return nil;
}
3 голосов
/ 30 июня 2009

Я полагаю, вы ищете расширения UIFont NSString, которые позволят вам вычислить размер строки с учетом UIFont.

Вот ссылка

В частности, sizeWithFont методы.

1 голос
/ 05 октября 2016

Самый простой способ получить высоту пикселя для данного шрифта и размера - это использовать метод boundingRect в NSString. (Я использую @"Ap" здесь, чтобы убедиться, что он содержит по убыванию и по возрастанию.)

- (CGFloat)heightForFont:(UIFont *)font
{
    NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init];
    CGRect boundingRect = [@"Ap" boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX) options:NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:context];
    return boundingRect.size.height;
}
0 голосов
/ 23 февраля 2011

Я добавлю их, когда выясню:

SizeToFit UILabel с системным шрифтом 12pt имеет высоту 15px.

0 голосов
/ 29 июня 2009

Вы не можете надежно преобразовать точки в пиксели, поскольку ppi (точки на дюйм) будет изменяться от монитора к монитору. Прочитайте;

http://hsivonen.iki.fi/units/

Преобразование пикселей в точки

Тем не менее, некоторые люди собрали несколько справочных таблиц и калькуляторов, которые могут помочь вам начать;

http://www.unitconversion.org/typography/postscript-points-to-pixels-x-conversion.html

http://sureshjain.wordpress.com/2007/07/06/53/

...