Fonte incorrecte dans NSView

15:33 modifié dans API AppKit #1
Bonjour à  tous,

J'ai quelques misères avec NSView lorsque je veux écrire une chaà®ne de caractères.
La photo jointe montre l'éditeur de code d'XDev. A coté du texte, une vue affiche soit
le numéro de la ligne soit le point d'arrêt. Le problème est que la fonte de caractère
employée pour écrire le numéro de ligne est incorrecte.
J'effectue l'appel suivant dans drawRect de la sous classe NSView:

lineNumber = [NSString stringWithFormat:@&quot;%d&quot;,i];<br />...<br />[lineNumber drawInRect:theFrame withAttributes:attributes];


lineNumber est une NSString contenant le numéro de la ligne.
Le dernier argument est obtenu de la manière suivante. On dispose d'un objet NSFont, font.

attributes = [[font fontDescriptor] fontAttributes];


La trace indique bien Monaco 10, ce qui est conforme.

J'ai essayé de forcer à  l'aide des instructions suivantes:

-(void)drawRect:(NSRect)frame<br />{<br />	...<br />	[NSGraphicsContext saveGraphicsState];	<br />	font = [[_codeEditor helper] textFont];	<br />	[font set];	<br />	...<br />	[NSGraphicsContext restoreGraphicsState];<br />} /* drawRect */<br />

sans résultat !

Si quelqu'un a déjà  eû le problème, as-t-il trouvé une solution ?

Par avance merci de votre aide.

Réponses

  • NoNo Membre
    juillet 2008 modifié #2
    dans 1216102453:

    J'ai quelques misères avec NSView lorsque je veux écrire une chaà®ne de caractères.
    La photo jointe montre l'éditeur de code d'XDev. A coté du texte, une vue affiche soit
    le numéro de la ligne soit le point d'arrêt. Le problème est que la fonte de caractère
    employée pour écrire le numéro de ligne est incorrecte.
    J'effectue l'appel suivant dans drawRect de la sous classe NSView:

    lineNumber = [NSString stringWithFormat:@&quot;%d&quot;,i];<br />...<br />[lineNumber drawInRect:theFrame withAttributes:attributes];
    


    lineNumber est une NSString contenant le numéro de la ligne.
    Le dernier argument est obtenu de la manière suivante. On dispose d'un objet NSFont, font.

    attributes = [[font fontDescriptor] fontAttributes];
    


    La trace indique bien Monaco 10, ce qui est conforme.


    La méthode drawInRect:withAttributes: de NSString est mal employée.
    Le 2nd argument withAttributes: attend un dictionnaire (NSDictionary) contenant les différents attributs à  appliquer au texte lors de son dessin.

    Toi, tu y passes directement l'objet NSFont, ce qui n'est pas permis.

    Change ton code par :
    lineNumber = [NSString stringWithFormat:@&quot;%d&quot;,i];<br />police= [[font fontDescriptor] fontAttributes];<br />attributes:[NSDictionary dictionaryWithObject:police forKey:@&quot;NSFontAttributeName&quot;];<br />[lineNumber drawInRect:theFrame withAttributes:attributes];
    
  • schlumschlum Membre
    15:33 modifié #3
    Euh non, "fontAttributes" renvoie bien un NSDictionary avec les attributs de la police.
  • juillet 2008 modifié #4
    Bonjour No,

    Je ne passe pas l'objet font mais bien le dictionnaire descriptif de la fonte sous la forme d'un NSDictionary.

    attributes = [[font fontDescriptor] fontAttributes];

    Il n'y a pas d'erreur à  ce sujet. La trace m'indique:

    2008-07-15 09:44:36.803 XDev[640] attributes = {
        NSFontFamilyAttribute = Monaco;
        NSFontNameAttribute = Monaco;
        NSFontSizeAttribute = 10;
    }

    Ce qui est conforme.

    Merci de ton aide.

    Quelqu'un a-t-il une idée de la solution ?
  • NoNo Membre
    juillet 2008 modifié #5
    LISEZ LA DOC !

    Peu importe ce que renvoie fontAttributes...

    Les attributs stylés d'une chaà®ne sont :
    1. stockées dans un NSDictionary,
    2. avec des clés normalisées.

    Il faut une clé de nom NSFontAttributeName et dont l'objet associé est un onglet NSFont pour modifier la police. C'est écrit noir sur blanc dans la doc, donc inutile de tergiverser.

    Où se trouve la clé NSFontAttributeName dans le dictionnaire que renvoie fontAttributes ?

    <br />policeMonaco10= [NSFont fontWithDescriptor:font size:10];<br />// ou<br />policeMonaco10= [NSFont fontWithName:@&quot;Monaco&quot; size:10];<br />attributes:[NSDictionary dictionaryWithObject:policeMonaco10 forKey:@&quot;NSFontAttributeName&quot;];<br />[...]<br />[[NSString stringWithFormat:@&quot;%d&quot;,i] drawInRect:theFrame withAttributes:attributes];<br />
    
  • Philippe49Philippe49 Membre
    15:33 modifié #6
    dans 1216110348:

    policeMonaco10= [NSFont fontWithDescriptor:font size:10];
    // ou
    policeMonaco10= [NSFont fontWithName:@Monaco size:10];
    attributes:[NSDictionary dictionaryWithObject:policeMonaco10 forKey:@NSFontAttributeName];
    [...]


    @NSFontAttributeName ou plus simplement NSFontAttributeName

    C'est quand même un piège vicieux que fontAttributes aient les noms de clés inverses !
  • 15:33 modifié #7
    Salut Philippe,

    @No

    La clé dont tu parles est applicable aux objets NSAttributedString et non pas aux NSString ! Je travaille avec la doc de Panther.
    J'ai essayé ton code, il ne fonctionne pas.
  • Philippe49Philippe49 Membre
    15:33 modifié #8
    Essaye ainsi :

    - (void)drawRect:(NSRect)rect {
    NSRect frame=NSMakeRect(20.,20.,100.,100.);
    NSString * theString=[NSString stringWithFormat:@%d,11];
    NSFont * font =[NSFont systemFontOfSize:24.];
    NSMutableDictionary * atts=[NSMutableDictionary dictionaryWithCapacity:2];
    [atts setObject:font forKey:NSFontAttributeName];
    [atts setObject:[NSColor redColor] forKey:NSForegroundColorAttributeName];
    NSLog(@%@",atts);
    [theString drawInRect:frame withAttributes:atts];
    }
  • schlumschlum Membre
    15:33 modifié #9
    En plus No et Philippe49, vous êtes en train de confondre macro et valeur...

    NSFontAttributeName vaut la chaà®ne @NSFont
  • Philippe49Philippe49 Membre
    15:33 modifié #10
    dans 1216112689:

    En plus No et Philippe49, vous êtes en train de confondre macro et valeur...
    NSFontAttributeName vaut la chaà®ne @NSFont


    Effectivement, il vaut mieux toujours utiliser les noms des constantes que leurs valeurs.
  • 15:33 modifié #11
    @ Philippe

    Tu viens une deuxième fois à  mon secours ! Je te remercie. La solution fontionne correctement.

    A une prochaine fois ... et merci encore.
Connectez-vous ou Inscrivez-vous pour répondre.