web-dev-qa-db-fra.com

Taille de la police en pixels

Sur un iPhone, comment calculer la taille d'un caractère en pixels pour une taille de point donnée?

36
Ian1971

Les tailles de points sont définies comme 1/72 de pouce . Autrement dit, une police de caractères de 72 points correspond à environ 1 pouce de la descente la plus basse à la plus haute ascension. Ainsi, la hauteur maximale d'un glyphe dans une police de 72 points est d'environ 1 pouce.

La page Spécifications techniques Apple de l'iPhone affirme que l'iPhone actuellement a une résolution de 163 pixels par pouce. Donc 72 points correspondent à 163 pixels, soit environ 2,2639 pixels par point. Rappelez-vous simplement que chaque glyphe varie en hauteur et en largeur, il s'agit donc d'une estimation très grossière de la taille. En général, la distance entre lignes de base sera un peu plus grande que la taille de la police, de sorte que les lignes de texte ne se plantent pas les unes dans les autres.

Si vous avez besoin de mesures exactes (et vous en avez probablement besoin), vous devrez alors mesurer les glyphes de police à l'aide des informations métriques sur la police. Vous pouvez le faire en utilisant Les ajouts UIKit de NSString, qui vous permettront de mesurer la taille d’une chaîne donnée lors du rendu à l’écran.

62
Naaff

Pour faire correspondre les tailles de police (en points) sur l'iPhone4 aux tailles de police (en points) de Photoshop, vous devez définir votre document Photoshop sur 144 dpi. J'ai effectué un certain nombre de tests et c'est la résolution qui produit des résultats 1: 1.

Pas:

  • Faites une capture d'écran de «Paramètres» Général »Accessibilité» Gros texte » sur un iPhone4
  • Ouvrez la capture d'écran dans Photoshop
  • Changez la résolution de 72 dpi à 144 dpi avec “Rééchantillonner l'image” désactivé
  • Retapez le texte dans Photoshop (en points) pour qu'il corresponde à la taille de la capture d'écran.

J'ai passé en revue un certain nombre de résolutions différentes, y compris la résolution de 163 dpi mentionnée dans la réponse ci-dessus, et j'ai constaté que la résolution 144 dpi produit des résultats 1: 1. J'ai également testé cela par rapport à une application native où je connais la taille des points et où la résolution de 144 dpi correspond également.

31
Kai

Notre graphiste était très spécifique sur certains périphériques pour utiliser des tailles de pixel au lieu de la taille du point . La fonction ci-dessous renverra une police basée sur la taille du pixel . Elle utilise une méthode de force brute pour trouver la police de style closet, mais met en cache les résultats afin que la prochaine fois, le retour sera très rapide. J'apprécie toujours les commentaires sur la façon dont ce code pourrait être amélioré. J'utilise cette fonction en tant que membre statique de la classe appelée utils . Vous pouvez facilement coller dans n'importe quelle classe que vous utilisez . J'espère que cela vous aidera. 

/** 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;
}
5
bret

Je crois que vous recherchez les extensions UIFontNSString qui vous permettent de calculer la taille d'une chaîne à partir d'une UIFont.

Voici le Link

Plus précisément, les méthodes sizeWithFont.

3
CynicismRising

Le moyen le plus simple d'obtenir la hauteur en pixels d'une police et d'une taille données consiste à utiliser la méthode boundingRect sur NSString. (J'utilise @"Ap" ici pour m'assurer qu'il contient un descendant et un ascender.)

- (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;
}
1
voidStern

Vous ne pouvez pas convertir de manière fiable des points en pixels, car le nombre de points par pouce (ppp) varie d’un moniteur à l’autre. Avoir une lecture;

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

Convertir des pixels en points

Cela dit, certaines personnes ont rassemblé quelques tables de référence et calculatrices qui pourraient vous aider à démarrer.

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

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

0
Mathew

Je vais les ajouter comme je les ai compris:

Un UILabel de sizeToFit avec un systemFont de 12pt a 15px de haut.

0
mxcl