NSTextField & limitation
Salut à tous,
Me revoilà encore avec mes smileys
Maintenant j'aimerai faire comme iChat, c'est à dire faire en sorte que le texte tapé dans le TextField ne touche pas le smiley (voir la capture).
Je suppose que ça doit être tout con à faire ?
Louka.
Me revoilà encore avec mes smileys
Maintenant j'aimerai faire comme iChat, c'est à dire faire en sorte que le texte tapé dans le TextField ne touche pas le smiley (voir la capture).
Je suppose que ça doit être tout con à faire ?
Louka.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Les cells d'un NSTextField sont de la classe NSTextFieldCell (dérivant de NSActionCell qui dérivent de NSCell).
Dans NSActionCell tu peux modifier la "controlView" qui est une NSView, je me demande si c'est pas là dessus qu'il faut jouer, en modifiant sa frame pour réduire un peu sa largeur sur la droite et donc faire en sorte qu'il laisse une marge à droite pour ne pas dessiner sur ton smiley. Ou sinon il y a [tt]setControlSize:[/tt] de NSCell qui me semble même sans doute encore mieux adapté.
Après à vérifier que c'est bien de ce côté qu'il faut creuser, je pense que c'est une bonne piste mais ce n'est peut-être pas exactement ces méthodes-là , faut vérifier leur comportement etc.
Pour ControlSize, c'est différent, en fait d'après ce que j'ai lu c'est simplement la taille "normalisée" du textField. Reglable depuis IB dans la fenêtre inspecteur du textField -> Size. On peut choisir entre Regular, Small, Mini.
Donc pour l'instant je ne vois pas.
Je sais pas si tu te souviens y'a pas longtemps tu m'as envoyé sur un code source fourni par Apple lorsque je cherchais à remplacer la fin d'un NSAttributedString par des points de suspension. Il me semble que ce code permettait les sauts de ligne à partir d'une certaine largeur atteinte. C'est exactement ce qu'il me faudrait pour le cas de mon ptit smiley dans un coin du textField
Peut-être sous-classer NSTextFieldCell et surcharger [tt]drawingRectForBounds:[/tt] pour qu'il retourne le [tt][super drawingRectForBounds:theRect];[/tt] mais que tu rognes ensuite sur sa droite ? Ca me parait pas mal comme piste ça, non ?
Le seul problème c'est que ça superposé le nouveau rectangle sur le textField, ducoup on perdait le focus bleue autour. Il m'a suffit de faire ça en fait :
J'ai donc réduit la hauteur de 4, pour augmenter l'origine y de 2 afin d'éviter que ça prenne exactement la meme taille que le textField. De meme pour l'origine X
Et enfin, j'ai changé la largeur afin de limiter la droite comme je le souhaitais
Parce que, comme expliqué dans la doc Apple, par défaut le rectangle retourné est un "inset" du rectangle passé en paramètre, pour justement prendre en compte les bords puisque c'est le rectangle "intérieur" (comprendre "à l'intérieur du cadre qui supporte le focus") et non "extérieur" qu'il faut renvoyerÂ
Normalement donc [tt][super drawingRectForBounds:theRect][/tt] te renvoie déjà un rectangle un peu réduit par rapport à theRect, et au moins en passant par là tu as la valeur générique (même si elle change selon le type ou des paramètres du champ etc) et pas un +2 en dur ! Il te suffit d'enlever ensuite tes quelques pixels à droite et le tour est joué ;D