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:

     
      
  1. Appelez la fonction CGContextGetTextPosition pour obtenir la position de texte actuel.
  2.   
  3. Définir le mode de dessin de texte à l'aide de la fonction kCGTextInvisible CGContextSetTextDrawingMode.
  4.   
  5. Dessine le texte en appelant la fonction CGContextShowText pour dessiner le texte à la position du texte actuel.
  6.   
  7. Déterminer la position de texte final en appelant la fonction CGContextGetTextPosition.
  8.   
  9. Soustraire la position à partir de la position de fin pour déterminer la largeur du texte.
  10.   

Voici mes questions:

  1. 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);
    
  2. Je lis que ATSUI est obsolète et va être remplacé par Core Text. Est-ce vrai et si oui, est-il dans iOS?

Était-ce utile?

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 ()

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top