iOS: Comment mesurez-vous la largeur et la hauteur d'une chaîne en utilisant Quartz?
-
06-09-2019 - |
Question
Avant de poser mes questions, c'est de la documentation d'Apple re: comment déterminer la largeur d'une chaîne en utilisant Quartz:
Si les mesures de texte sont importants pour votre application, il est possible pour les calculer à l'aide des fonctions Quartz 2D. Cependant, vous pouvez d'abord envisager d'utiliser ATSUI, dont la force est en mise en page de texte et la mesure. ATSUI a plusieurs fonctions qui obtiennent des mesures de texte. ne pas ne pouvez-vous obtenir des paramètres de texte après la mise en page, mais dans les rares cas vous en avez besoin, vous pouvez obtenir des mesures de texte avant de mise en page. contrairement à Quartz, pour lequel vous devez effectuer les calculs vous-même, ATSUI calcule les mesures pour vous. Par exemple, vous pouvez obtenir le rectangle englobant l'image pour le texte en appelant la fonction ATSUI ATSUMeasureTextImage.
Si vous décidez que le texte Quartz convient à vos besoins mieux que ATSUI (ou Cocoa), vous pouvez suivre ces étapes pour mesurer la largeur du texte avant Quartz dessine:
- Appelez la fonction CGContextGetTextPosition pour obtenir la position de texte actuel.
- Définir le mode de dessin de texte à l'aide de la fonction kCGTextInvisible CGContextSetTextDrawingMode.
- Dessine le texte en appelant la fonction CGContextShowText pour dessiner le texte à la position du texte actuel.
- Déterminer la position de texte final en appelant la fonction CGContextGetTextPosition.
- Soustraire la position à partir de la position de fin pour déterminer la largeur du texte.
Voici mes questions:
-
Est-ce vraiment la meilleure façon de déterminer la largeur d'une chaîne à l'aide de base Graphics? Il semble peu solide et que mon texte éléments coexiste graphiques 2D, je voudrais utiliser le même contexte pour tous les rendus. J'espérais qu'il y aurait une méthode compacte, comme:
CGContextGetTextWidthAndHeight(context, text);
-
Je lis que ATSUI est obsolète et va être remplacé par Core Text. Est-ce vrai et si oui, est-il dans iOS?
La solution
Sur l'iPhone SDK, il y a une famille de méthodes sur NSString
qui offrent ce que vous voulez.
d'iOS 7.0, ces méthodes sont :
- boundingRectWithSize:options:attributes:context:
- sizeWithAttributes:
Sur les anciennes versions d'iOS que nous avions ces derniers, maintenant dépréciée:
– sizeWithFont:
– sizeWithFont:forWidth:lineBreakMode:
– sizeWithFont:constrainedToSize:
– sizeWithFont:constrainedToSize:lineBreakMode:
– sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode:
Autres conseils
Lors de l'exécution d'opérations de dessin sur les threads autres que le thread d'interface utilisateur, vous devez utiliser la technique que vous avez décrit. Ceci est particulièrement important de noter lors de l'utilisation des choses comme CATiledLayer, qui réalise qu'il est rendu de manière asynchrone sur des fils de fond, ou lors de l'élaboration des graphiques personnalisés en arrière-plan pour toute autre raison.
Je suis d'accord avec PGB quand vous faites des graphiques « simples » et vous êtes assuré d'être en cours d'exécution sur le thread principal. Cependant, sizeWithFont fait la même chose que la technique que vous avez décrit - il est fait simplement pour vous en utilisant UIGraphicsGetCurrentContext ()
.