39 votes

Taille de la base de police en pixels.

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

65voto

Naaff Points 6637

Tailles sont à 1/72 de pouce. C'est un 72-point de la police est d'environ 1 pouce à partir du bas de la descente la plus haute ascension. Donc, la hauteur maximale d'un glyphe dans un 72pt de la police est d'environ 1 pouce.

Apple iphone page spécifications techniques affirme que l'iPhone actuellement a une résolution de 163 pixels par pouce. Donc, 72 points est de 163 pixels, soit environ 2.2639 pixels par point. Rappelez-vous simplement que chaque glyphe varie en hauteur et en largeur, donc c'est une estimation très approximative de la taille. En général, la distance entre les lignes de base sera un peu plus grand que la taille du point, de sorte que les lignes de texte ne tombe pas en panne les uns dans les autres.

Si vous avez besoin d'effectuer des mesures exactes (et vous n'avez probablement), alors vous aurez besoin pour réellement mesurer les glyphes de police à l'aide de la police métrique de l'information. Vous pouvez le faire en utilisant NSString de UIKit ajouts, ce qui vous permettra de mesurer la taille d'une chaîne particulière lors du rendu à l'écran.

32voto

Kai Points 191

Pour faire correspondre les tailles de police (en Points) sur l'iPhone4 avec des tailles de police (en Points) dans Photoshop, vous devez configurer votre document Photoshop pour 144dpi. J'ai exécuté un certain nombre de tests et c'est la résolution qui produit 1:1.

Étapes:

  • Prendre une capture d'écran "Réglages » Général » Accessibilité » Grand Texte" sur un iPhone4
  • Ouvrez la capture d'écran dans Photoshop
  • Changer la résolution de 72dpi pour 144dpi avec "Rééchantillonnage" off
  • Retaper le texte dans Photoshop (en Points) pour correspondre à la taille de la capture d'écran

Je suis passé par un certain nombre de résolutions différentes, y compris le 163dpi qui a été mentionné dans la réponse ci-dessus, et j'ai trouvé que 144dpi produit 1:1 résultats. J'ai également testé cette contre une application native où je sais que la taille et la 144dpi était le match de trop.

Comparaisons:

5voto

bret Points 188

Notre graphiste a été très précis sur certains appareils à utiliser des tailles de pixel au lieu de la taille en points. La fonction ci-dessous sera de retour d'une police basée sur la taille du pixel. Il utilise une méthode de force brute pour trouver le placard de la police, mais met ensuite les résultats la prochaine fois que le retour va être très rapide. J'ai toujours apprécié les commentaires sur la façon dont ce code peut être amélioré. J'utilise cette fonction en tant que membre de classe statique dans la classe appelée utils. Vous pouvez facilement coller dans l'une des classes que vous utilisez. Espérons qu'il est de peu d'aide.

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

3voto

CynicismRising Points 724

Je pense que vous recherchez les extensions UIFont NSString qui vous permettent de calculer la taille d'une chaîne avec un UIFont .

Voici le lien

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

0voto

mxcl Points 5921

Je les ajouterai au fur et à mesure que je les découvrirai:

Un UILabel de tailleToFit avec une police système de 12 points est de 15 pixels de haut.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X