2009-07-19 7 views
2

Est-ce possible d'obtenir les coordonnées de l'endroit où le texte est dessiné dans les contrôles Cocoa standard (non personnalisés)? En fait, j'ai besoin d'une ligne de base du texte, la valeur de décalage de l'axe y (par rapport à l'origine y du rectangle de la vue). C'est ce que l'interface Builder affiche dans le volet de conception lorsque Mise en page-> Afficher les rectangles de disposition sélectionnés.Cocoa contrôle l'emplacement du texte?

Répondre

2

Malheureusement, il n'y a pas une seule solution qui fonctionne pour tous les contrôles et cellules. Vous devriez être en mesure d'obtenir une bonne approximation de cette information avec ces méthodes:

-[NSCell titleRectForBounds:] 
-[NSCell font] 
-[NSFont ascender] 

Voici un code qui fonctionne pour NSButton/NSButtonCell

NSRect titleRect = [[button cell] titleRectForBounds:[button bounds]]; 
CGFloat baseline = ceil(NSMinY(titleRect) + [[[button cell] font] ascender]); 

À ce stade, la ligne de base est (les limites du bouton) espace de coordonnées. Vous pourriez vouloir le convertir dans un autre espace avec - [NSView convertPoint: toView:];

De plus, ce "ceil" est une approximation. Tous les contrôles ne le feront pas. Certains peuvent se poser ou utiliser une autre fonction d'arrondi. Ou ils pourraient mettre en forme leur titre complètement différemment, et cette approximation ne fonctionnera pas.

+2

Cela peut être une vraie douleur pour bien faire. Dans Adobe Lightroom, nous avons notre propre système de disposition pour les contrôles. Un outil qui était un réel avantage pour vérifier où la ligne de base pour le texte dessinait était d'ajouter du code de débogage en utilisant poseAs: et en insérant du code de dessin global pour recouvrir le dessin normal. Essentiellement, nous pouvons l'activer dans les versions de débogage pour montrer où se trouve la ligne de base sur tous les contrôles qui nous intéressent. Si vous en faites beaucoup, cela peut vous faire gagner du temps. Je ne peux pas partager de code en raison de la nature exclusive, désolé. –

+0

poseAs: était obsolète dans Leopard;) – IlDan

Questions connexes