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?
2
A
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.
Questions connexes
- 1. Changer la couleur du curseur de texte (caret) dans Cocoa?
- 2. Cocoa: Création d'une vue de texte personnalisée
- 3. Récupération du texte sélectionné du contrôle Webbrowser dans .net (C#)
- 4. Contrôle Cocoa pour les mots-clés/tags
- 5. Contrôle Cocoa pour la configuration des raccourcis
- 6. Contrôle de visualisation du texte diff pour WinForms ou WPF
- 7. Contrôle du correcteur d'orthographe de la zone de texte Asp.Net
- 8. C#: rotation du texte dans un contrôle personnalisé
- 9. Mettre en surbrillance du texte dans un contrôle Webbrowser .net
- 10. Chargement du texte de la mémoire dans le contrôle WebBrowser
- 11. Comment placer du texte autour d'un contrôle utilisateur?
- 12. Comment faire une recherche plein texte dans Cocoa?
- 13. Direction de texte actuelle (support BiDi) dans Cocoa?
- 14. Contrôle du calendrier pour le cacao tactile
- 15. Comment implémenter la barre d'outils du navigateur dans Cocoa?
- 16. Sélectionner le texte du contrôle dans la ligne du tableau avec JQuery
- 17. Comment tamponner une image et du texte dans l'ASP: Contrôle du menu
- 18. Contrôle du menu: Comment rendre l'article entier cliquable, pas seulement du texte
- 19. Sélection du texte d'un JLabel?
- 20. Contrôle du rendu d'un contrôle personnalisé
- 21. Obtenir du texte brut à partir du texte démarqué
- 22. Google Search Engine - Cocoa
- 23. Contrôle du WCml XmlSerializer
- 24. Boutons du contrôle gridview
- 25. Winforms RichTextBox Taille du texte?
- 26. Set texte RTF en WPF RichTextBox contrôle
- 27. Contrôle de zone de texte dans DataGridView
- 28. Comment puis-je lire le texte du cache dans le champ du nom d'utilisateur du contrôle de connexion ASP.NET
- 29. Analyse du texte SQL
- 30. Formatage du texte Zend_PDF
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é. –
poseAs: était obsolète dans Leopard;) – IlDan