Sur un iPhone, comment calculer la taille d'un caractère en pixels pour une taille de point donnée?
Réponses
Trop de publicités?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.
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:
- Side-by-Side de comparaison
- Fichier Photoshop multicouches pour quelqu'un qui veut aller encore plus loin
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;
}
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
.