Подтвердить что ты не робот

Размер шрифта в пикселях

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Шаги:

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

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

Сравнения:

Ответ 3

Наш графический художник был очень специфичен на некоторых устройствах, чтобы использовать размеры пикселей вместо размера точки. Функция ниже вернет шрифт, основанный на размере пикселя. Он использует метод грубой силы, чтобы найти шрифт шкафа, но затем кэширует результаты, поэтому в следующий раз возврат будет очень быстрым. Я всегда ценю комментарии о том, как этот код можно улучшить. Я использую эту функцию как статический член класса в классе, называемом 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;
}

Ответ 4

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

Вот Ссылка

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

Ответ 5

Самый простой способ получить высоту пикселя для данного шрифта и размера - использовать метод 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;
}

Ответ 6

Вы не можете надежно преобразовать точки в пиксели, поскольку 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/

Ответ 7

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

A размерная UILabel размером с 12pt systemFont высотой 15px.