Вопрос по iphone, cocoa, font-size – Размер шрифта в пикселях

36

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

Ваш Ответ

7   ответов
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;
}
цикл навсегда ...
62

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

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

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

@philsquared, что не имеет значения, потому что система предполагает, что вы всегда кодируете для 72 dpi, а затем автоматически повышаете масштаб во время выполнения.
Эй, угадайте, что - Apple представила ремешок для часов для своего iPod Nano, так что технически они также выпустили наручные часы. :)
Эй, угадай, что - Apple представила планшет с другим dpi :-)
Кроме того, Apple сделала телефон и Ipod с более высоким dpi ... Ваше приложение обязательно сломается :)
Также стоит отметить, что iPhone не является единственным устройством iPhone-OS. IPod touch имеет разрешение 160 точек на дюйм. Итак, уже не все устройства iPhone-OS имеют одинаковое разрешение. Если Apple когда-нибудь удвоит его, представит планшет, представит наручные часы или что-то еще, и вы предполагаете фиксированное количество пикселей, вы ввернуты. Будьте независимы от разрешения, потому что если вы этого не сделаете, ваше приложение когда-нибудь сломается.
0

поскольку 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/

Что если Apple изменит разрешение iPhone без изменения физического размера экрана? ИЦП будет меняться, и поэтому любые преобразования в пиксели, сделанные на старом ИЦП, будут избыточными.
Майк Дэниелс: это не имеет значения. Не все устройства iPhone-OS имеют одинаковое разрешение; iPod touch имеет несколько более низкое разрешение. Более того, когда-нибудь Apple может добавить приложениям возможность обращаться к телевизору или монитору, к которому устройство подключено через док-станцию.
Я уверен, что люди не подключают мониторы к своим iPhone.
MatW - я согласен, что это нужно учитывать, но в этом случае мне, скорее всего, придется все равно протестировать свое приложение. Я предполагаю, что довольно много приложений там будут иметь проблемы. Ian1971
Питер Хоси не знает, о чем говорит. Все устройства iPhone OS имеют одинаковые метрики, когда речь идет о пикселях. И я съем свою шляпу, если какое-либо будущее устройство iOS не сделает этого.
3

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

ЗдесьСсылка на сайт

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

Ссылка не работает.
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;
}
31

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

Steps:

Take a screenshot of “Settings » General » Accessibility » Large Text” on an iPhone4 Open the screenshot in Photoshop Change the resolution from 72dpi to 144dpi with “Resample Image” off Retype the text in Photoshop (in Points) to match size in the screenshot

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

Это работает лучше для меня. Конечно, это относится к разрешениям 1x, а не 2x (Retina). Так, например, на макете iPad используйте разрешение 768x1024 при 144 dpi, чтобы соответствовать размеру шрифта.
Ссылки не работают.
не уверен, что он отвечает на вопрос, но это именно то, что я искал, в конечном итоге вы должны переместить этот ответ в раздел "как соответствовать размеру шрифта в Photoshop и iOS / xcode".
144 работает для iPhone 4s & amp; 5, но похоже, что для соответствия iPhone 6 и 6+ требуется разрешение 216 точек на дюйм в Photoshop.
и 125% на каждый пробел, кажется, идеально подходит
0

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

Похожие вопросы