J'ai du mal à comprendre exactement ce que signifie la taille en points dans UIFont
. Ce ne sont pas des pixels et cela ne semble pas être la définition standard du point, c'est-à-dire qu'ils se rapportent au 1/72e de pouce.
J'ai calculé la taille des pixels en utilisant -[NSString sizeWithFont:]
de polices de différentes tailles et a obtenu les éléments suivants:
| Point Size | Pixel Size |
| ---------- | ---------- |
| 10.0 | 13.0 |
| 20.0 | 24.0 |
| 30.0 | 36.0 |
| 40.0 | 47.0 |
| 50.0 | 59.0 |
| 72.0 | 84.0 |
| 99.0 | 115.0 |
| 100.0 | 116.0 |
(J'ai fait [@"A" sizeWithFont:[UIFont systemFontOfSize:theSize]]
)
Et en regardant le 72.0
taille en points, ce n'est pas 1 pouce car il s'agit d'un appareil avec un DPI de 163, donc 1 pouce serait 163,0 pixels, non?
Quelqu'un peut-il expliquer ce qu'est un "point" en termes de UIFont
? c'est-à-dire que ma méthode ci-dessus est fausse et vraiment si j'utilisais autre chose, je verrais quelque chose à propos de la police est de 163 pixels à 72 points? Ou est-ce purement qu'un point est défini à partir d'autre chose?
Une police a un système de coordonnées interne, pensez-y comme un carré d'unité, dans lequel les coordonnées vectorielles d'un glyphe sont spécifiées à n'importe quelle taille arbitraire pour tous les glyphes de la police + - toute quantité de marge choisie par le concepteur de polices.
À 72,0 points, le carré d'unité de la police est d'un pouce. Le glyphe x de police y a une taille arbitraire par rapport à ce pouce carré. Ainsi, un concepteur de polices peut créer une police qui apparaît grande ou petite par rapport aux autres polices. Cela fait partie du "caractère" de la police.
Donc, dessiner un 'A' à 72 points vous indique qu'il sera deux fois plus élevé qu'un 'A' dessiné à 36 points dans la même police - et absolument rien d'autre sur la taille réelle du bitmap.
ie Pour une police donnée, le seul moyen de déterminer la relation entre la taille du point et les pixels est de la mesurer.
Je ne sais pas comment -[NSString sizeWithFont:]
mesure la hauteur. Utilise-t-il la hauteur de ligne ou la différence entre les pics des beziers? Quel texte avez-vous utilisé?
Je crois -[UIFont lineHeight]
serait préférable de mesurer la hauteur.
Modifier: Notez également qu'aucune des méthodes de mesure ne renvoie la taille en pixels. Il renvoie la taille en points
. Vous devez multiplier le résultat par [UIScreen mainScreen].scale
.
Notez la différence entre typographic points
utilisé lors de la construction de la police et points
à partir d'iOS default logical coordinate space
. Malheureusement, la différence n'est pas expliquée très clairement dans la documentation.
Je me suis d'abord demandé si cela avait quelque chose à voir avec la façon dont [les pixels CSS sont définis à 96 par "pouce"] [1] alors que les points de disposition de l'interface utilisateur sont définis à 72 par "pouce". (Où, bien sûr, un "pouce" n'a rien à voir avec un pouce physique.) Pourquoi les normes Web prendraient-elles en compte les activités UIKit? Eh bien, vous remarquerez peut-être lors de l'examen des traces de pile dans le débogueur ou les rapports d'erreur qu'il y a du code WebKit sous-jacent à beaucoup d'UIKit, même lorsque vous n'utilisez pas UIWebView
. En fait, cependant, c'est plus simple que cela.
Tout d'abord, la taille de la police est mesurée du plus bas descendant au plus haut ascendant dans le texte latin normal - par ex. du bas du "j" au haut du "k", ou pour une mesure commode en un seul caractère, la hauteur de "ƒ". (C'est U + 0192 "LETTRE MINUSCULE LATINE F CROCHET", facilement tapé avec l'option-F sur un clavier Mac américain. Les gens l'ont utilisé pour abréger "dossier" en arrière quand.) Vous remarquerez que lorsqu'il est mesuré avec ce schéma, la hauteur en pixels (sur un écran 1x) correspond à la taille de police spécifiée - par exemple avec [UIFont systemFontOfSize:14]
, "ƒ" mesurera 14 pixels. (La mesure du "A" majuscule ne représente qu'une partie arbitraire de l'espace mesuré dans la taille de la police. Cette partie peut changer à des tailles de police plus petites; lors du rendu des vecteurs de police en pixels, le "conseil" modifie les résultats pour produire un texte à l'écran plus lisible. .)
Cependant, les polices contiennent toutes sortes de glyphes qui ne rentrent pas dans l'espace défini par cette métrique. Il y a des lettres avec des signes diacritiques au-dessus d'un ascendant dans les langues d'Europe de l'Est, et toutes sortes de signes de ponctuation et de caractères spéciaux qui tiennent dans une "boîte de mise en page" beaucoup plus grande. (Voir la section Symboles mathématiques dans la fenêtre des caractères spéciaux de Mac OS X pour de nombreux exemples.)
Dans le CGSize
renvoyé par -[NSString sizeWithFont:]
, la largeur représente les caractères spécifiques de la chaîne, mais la hauteur ne reflète que le nombre de lignes. La hauteur de ligne est une métrique spécifiée par la police et liée à la "boîte de mise en page" englobant les plus grands caractères de la police.
Je suis d'accord, c'est très déroutant. J'essaie de vous donner quelques explications de base ici pour rendre les choses plus claires.
Tout d'abord, la chose DPI (point par pouce) vient de l'impression, sur des papiers physiques. La police aussi. Le point unitaire a été inventé pour décrire la taille d'impression physique du texte, simplement parce que le pouce est trop grand pour les tailles de texte habituelles. Ensuite, les gens ont inventé le point, c'est-à-dire la longueur de 1/72 pouce (en fait évolué dans l'histoire), pour décrire facilement la taille du texte. Alors oui, si vous écrivez un document dans Word ou dans un autre logiciel de traitement de texte pour l'impression, vous obtiendrez un texte d'une hauteur d'un pouce si vous utilisez une police de 72 points.
Deuxièmement, la hauteur théorique du texte est généralement différente des traits rendus que vous pouvez réellement voir à vos yeux. L'idée originale de la hauteur du texte provenait des glyphes réels utilisés pour l'impression. Toutes les lettres sont gravées sur des blocs de glyphes, qui partagent la même hauteur - ce qui correspond à la hauteur du point de police. Cependant, en fonction de différentes lettres et de différentes polices, la partie visible réelle du texte peut être un peu plus courte que la hauteur théorique. Helvetica Neue est en fait très standard. Si vous mesurez le haut d'une lettre "k" au bas d'une lettre "p", il correspondra à la hauteur de police.
Troisièmement, l'affichage de l'ordinateur a foiré le DPI, ainsi que la définition du point en même temps. La résolution des écrans d'ordinateur est décrite par leurs pixels natifs, tels que 1024 x 768 ou 1920 x 1080. Le logiciel ne se soucie en fait pas de la taille physique de vos moniteurs, car tout serait très flou s'ils mettent à l'échelle le contenu de l'écran comme l'impression sur papier - juste la résolution physique n'est pas assez élevée pour que tout soit fluide et légitime. Le logiciel utilise une manière très simple et morte: DPI fixe pour n'importe quel moniteur que vous utilisez. Pour Windows, c'est 96DPI; pour Mac, c'est 72DPI. Cela dit, peu importe combien de pixels font un pouce sur votre moniteur, le logiciel l'ignore. Lorsque le système d'exploitation rend le texte en 72 pt, il serait toujours 96px haut sur Windows et 72px haut sur Mac. (C'est pourquoi les documents Microsoft Word sont toujours plus petits sur Mac et vous devez généralement zoomer à 125%.)
Enfin, sur iOS, c'est très similaire, peu importe qu'il s'agisse d'iPhone, iPod touch, iPad ou Apple Watch, iOS utilise le 72DPI fixe pour l'écran non rétinien, 144DPI pour l'affichage @ 2x retina et 216DPI pour l'affichage de la rétine @ 3x utilisé sur l'iPhone 6 Plus.
Oubliez le vrai pouce. Il n'existe que sur l'impression réelle, pas pour l'affichage. Pour les logiciels affichant du texte sur votre écran, il s'agit simplement d'un rapport artificiel aux pixels physiques.
La vérité, d'après ce que j'ai pu constater, est que UIFont
ment. Tout UIKit
prend des libertés avec les polices. Si vous voulez la vérité, vous devez utiliser CoreText
, mais dans beaucoup de cas, ce sera plus lent! (Donc, dans le cas de votre table de hauteur de pixels, je pense que c'est qu'il ajoute une sorte de facteur + bx où x est la taille en points.
Alors pourquoi fait-il ça? La vitesse! UIKit
arrondit les trucs et les violons avec un espacement pour pouvoir mettre en cache les bitmaps. Ou du moins, c'était mon coup de cœur!