NSTextField & limitation

08:40 modifié dans API AppKit #1
Salut à  tous,

Me revoilà  encore avec mes smileys :p
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.

Réponses

  • AliGatorAliGator Membre, Modérateur
    08:40 modifié #2
    Je ne sais pas réellement comment il faut faire mais moi je m'orienterais sur la NSCell de ton contrôle NSTextField puisque c'est eux qui gèrent la partie interface/affichage.
    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.
  • 08:40 modifié #3
    Je te tiens au courant ;)
  • 08:40 modifié #4
    Alors concernant setControlView, ça fait bien ce que je pensais, ça réduit simplement la taille du textField.
    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 :)
  • AliGatorAliGator Membre, Modérateur
    08:40 modifié #5
    Oui mais bon le code était un peu bourrin vu qu'ils calculaient le wrapping à  la main c'est vrai que c'était pas classe non plus... Alors que je suis sûr qu'on peut faire autrement en indiquant que la taille dans laquelle rendre le texte est juste plus petite que la taille de ton NSTextField apparent...

    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 ?
  • 08:40 modifié #6
    Nickel Ali :)
    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 :

    <br />- (NSRect)drawingRectForBounds:(NSRect)theRect<br />{<br />	return NSMakeRect(theRect.origin.x+2,theRect.origin.y+2,theRect.size.width-20,theRect.size.height-4);<br />}<br />
    


    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
  • AliGatorAliGator Membre, Modérateur
    08:40 modifié #7
    dans 1229077563:

    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
    Heu c'est pour ça que je te conseillais de récupérer le [super drawingRectForBounds:theRect] !
    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
    - (NSRect)drawingRectForBounds:(NSRect)theRect<br />{<br />	NSRect r = [super drawingRectForBounds:theRect];<br />        r.size.width -= 20;<br />        return r;<br />	// return NSMakeRect(r.origin.x,r.origin.y,r.size.width-20,r.size.height);<br />}
    
  • 08:40 modifié #8
    Yep j'ai fait ça par la suite :) Merci encore  o:)
Connectez-vous ou Inscrivez-vous pour répondre.