2009-06-29 4 views

ответ

62

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

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

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

+7

Также стоит отметить, что iPhone не является единственным устройством для iPhone. IPod touch составляет 160 dpi. Итак, уже не все устройства iPhone-OS имеют одинаковое разрешение. Если Apple когда-либо удваивает его, вводит планшет, вводит наручные часы или что-то еще, и вы принимаете фиксированные количества пикселей, вы ввернуты. Независимо от разрешения, потому что, если вы этого не сделаете, ваше приложение когда-нибудь сломается. –

+6

Эй, угадайте, что - Apple представила планшет с разным разрешением dpi :-) – philsquared

+0

также, Apple сделала телефон и ipod с более высоким разрешением на dpi ... ваше приложение наверняка сломается :) –

0

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

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

Convert Pixels to Points

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

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

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

+4

Я уверен, что люди не затыкать мониторы в своих iPhone'ов. –

+3

Что делать, если Apple изменит разрешение iPhone без изменения размера физического экрана? ИЦП изменится, и поэтому любая точка конверсии пикселей, сделанная на прежнем PPI, будет избыточной. – Mathew

+0

MatW - Я согласен с тем, что стоит рассмотреть, но в этом случае, скорее всего, мне придется повторно протестировать приложение. Я предполагаю, что у многих приложений есть проблемы. – Ian1971

3

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

Здесь Link

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

+2

Ссылка не работает. – shim

0

Я добавлю их, как я понять их:

A sizedToFit UILabel с 12pt systemFont является 15px высока.

31

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

Шаги:

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

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

Сравнения:

+3

и 125% для каждого пробела, кажется, идеально подходят – 2012-08-07 09:13:22

+1

не уверены, что он отвечает на вопрос, но это именно то, что я искал, вы должны в конечном итоге переместить этот ответ на «как подобрать размер шрифта в Photoshop и iOS/xcode» –

+0

работы для меня. Конечно, это относится к разрешениям 1x, а не 2x (Retina). Так, например, на макете iPad, используйте разрешение 768x1024 при 144 dpi для соответствия размерам шрифта. –

5

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

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