Вопрос

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

Это было полезно?

Решение

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

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

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

Другие советы

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

Шаги:

  • Сделайте снимок экрана «Настройки»Основные»Доступность»Крупный текст» на айфоне4
  • Откройте скриншот в Фотошопе
  • Измените разрешение с 72dpi на 144dpi с помощью «Изменить образец изображения» выключенный
  • Повторно введите текст в Photoshop (в точках), чтобы размер соответствовал размеру на скриншоте.

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

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

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

Здесь Связь

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

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

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

Буду добавлять по мере разбирания:

Размер UILabel ToFit с системным шрифтом 12pt имеет высоту 15 пикселей.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top