NSTableView : mettre comme background une image pour chaque row ?

apocaalypsoapocaalypso Membre
17:09 modifié dans API AppKit #1
Bonjour,

J'ai un petit soucis, j'aimerais que pour chaque ligne de ma NSTableView j'ai un background, c'est à  dire une image dans le sens horizontale, mais je ne trouve pas quelle méthode de NSTableView utiliser pour cela.
Pour changer simplement la couleur du texte je me débrouille mais pour établir une image de fond pour chaque ligne je n'y arrives pas.

Merci d'avance !

Réponses

  • Philippe49Philippe49 Membre
    17:09 modifié #2
    NSTableViewCell ... backgroundView et selectedBackgroundView par exemple
  • apocaalypsoapocaalypso Membre
    17:09 modifié #3
    Merci Philippe mais je ne trouve pas NSTableViewCell dans la doc.
  • Philippe49Philippe49 Membre
    17:09 modifié #4
    Désolé, je suis reparti sur Mac, ...
    C'est UITableViewCell évidemment, ce qui est demandée dans la méthode tableView:cellForRowAtIndexPath:

    Dans cette méthode tu configures la cell qui t'est demandée en mettant une imageView en backgroundView, et une dans selectedBackgroundView
  • apocaalypsoapocaalypso Membre
    17:09 modifié #5
    dans 1252611343:

    Désolé, je suis reparti sur Mac, ...
    C'est UITableViewCell évidemment, ce qui est demandée dans la méthode tableView:cellForRowAtIndexPath:

    Dans cette méthode tu configures la cell qui t'est demandée en mettant une imageView en backgroundView, et une dans selectedBackgroundView


    Non mais tu es bien sur Mac là   :)
  • 17:09 modifié #6
    mais philippe.. on EST dans la section Mac là ..  :p :p
    Bon tu veux quoi exactement? Juste des row alternative "basique"? Parce que ça c'est en option depuis IB en cochant "alternative rows" ou un truc du genre.
    Après ça me regarde pas pourquoi tu veux mettre un background.. mais ça fait pas un peu crade?  :o
  • apocaalypsoapocaalypso Membre
    17:09 modifié #7
    Oui je voudrais personnaliser en quelque sorte la table view.
    Mettre une image pour chaque row en background.
  • 17:09 modifié #8
    bha je vois rien d'autre qu'un simple sous-classage de NSCell.. après, on se demmerde!  :)beta: c'est pas bien compliqué, t'as des tonnes d'exemples sur les forums pour les tableview avec des cell persos.
    Mais j'insiste, une Image ça fait un peu crade? Je peux comprendre que tu veuilles changer la couleur.. mais la changer par une image oO
  • Philippe49Philippe49 Membre
    17:09 modifié #9
    dans 1252611636:

    Non mais tu es bien sur Mac là   :)


    Ah oui, bon ben j'vais aller me coucher moi maintenant ... Vous avez une aspirine ...  :) ?
  • apocaalypsoapocaalypso Membre
    17:09 modifié #10
    Bah comme dans Ecoute par exemple, lorsque tu sélectionne un artiste, la ligne devient bleue avec une image de gradient (bg-fm.png).
    C'est ce que je veux faire, mais juste sans que l'on est besoin de le sélectionné.
  • AliGatorAliGator Membre, Modérateur
    17:09 modifié #11
    Bah c'est pas NSTableViewCell, c'est NSCell.

    Toute la doc sur les TableViews
  • 17:09 modifié #12
    Bha tu sous classe NSCell comme j'ai dit ><

    <br />- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView<br />{<br />	<br />	<br />	NSImage *gradient;<br />	if ( [[controlView window] isMainWindow] &amp;&amp;[[controlView window] isKeyWindow]) {<br />		if([NSColor currentControlTint]==NSGraphiteControlTint)<br />			gradient = [NSImage imageNamed:@&quot;selectedg.png&quot;]; // Graphite<br />		else<br />			gradient = [NSImage imageNamed:@&quot;selectedb.png&quot;]; // Aqua<br />&nbsp; &nbsp; }else<br />		gradient = [NSImage imageNamed:@&quot;selectedbg.png&quot;]; // Arriere plan = gris<br />	<br />	[gradient setFlipped:YES];<br />	int i;<br />&nbsp; &nbsp; <br />	<br />	<br />&nbsp; &nbsp; if ([self isHighlighted]) {<br />&nbsp; &nbsp; &nbsp; &nbsp; [controlView lockFocus];<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; NSSize gradientSize = [gradient size];<br />&nbsp; &nbsp; &nbsp; &nbsp; for (i = cellFrame.origin.x; i &lt; (cellFrame.origin.x + cellFrame.size.width+10); i += gradientSize.width) <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [gradient drawInRect:NSMakeRect(i, cellFrame.origin.y, gradientSize.width, cellFrame.size.height)<br />						fromRect:NSMakeRect(0, 0, gradientSize.width, gradientSize.height)<br />					&nbsp;  operation:NSCompositeSourceOver<br />						fraction:1.0];<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp;  [controlView unlockFocus];<br />&nbsp;  }<br />&nbsp;  <br />&nbsp; [super drawInteriorWithFrame:cellFrame inView:controlView];<br /><br />}<br />
    
  • Philippe49Philippe49 Membre
    17:09 modifié #13
    dans 1252614623:


    <br />- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView<br />{<br />	<br />	<br />...&nbsp; &nbsp; <br />	<br />	<br />&nbsp; &nbsp; &nbsp; &nbsp; for (i = cellFrame.origin.x; i &lt; (cellFrame.origin.x + cellFrame.size.width+10); i += gradientSize.width) <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [gradient drawInRect:NSMakeRect(i, cellFrame.origin.y, gradientSize.width, cellFrame.size.height)<br />						fromRect:NSMakeRect(0, 0, gradientSize.width, gradientSize.height)<br />					&nbsp;&nbsp; operation:NSCompositeSourceOver<br />						fraction:1.0];<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp;&nbsp; [controlView unlockFocus];<br />&nbsp;&nbsp; }<br />&nbsp;&nbsp; <br />...<br /><br />}<br />
    



    Cela ne marchait pas avec un [NSColor colorWithPatternImage:gradient]  ?
  • 17:09 modifié #14
    Y'a souvent des bug avec cette méthode je trouve en fait.  >:) c'est pour ça que je reste sur la vieille.
  • Philippe49Philippe49 Membre
    17:09 modifié #15
    C'est marrant j'aurais plutôt craint un trou/un recouvrement entre deux images successives avec la boucle, compte-tenu de l'addition de flottant .
  • Philippe49Philippe49 Membre
    17:09 modifié #16
    dans 1252615392:

    Y'a souvent des bug avec cette méthode je trouve en fait.  >:) c'est pour ça que je reste sur la vieille.

    Quel type de bug as-tu remarqué ? Le début du motif en (0.,0.) ?
  • 17:09 modifié #17
    Sur Mac nom de dieu! :p
    Non mais c'est juste qu'un jour j'ai eu un problème avec, ducoup je l'ai plus jamais réutilisé :p
  • Philippe49Philippe49 Membre
    17:09 modifié #18
    dans 1252648174:

    Sur Mac nom de dieu! :p

    Là  je l'ai fait exprès  :) pour tester CGContextSetStrokePattern()

  • apocaalypsoapocaalypso Membre
    17:09 modifié #19
    Je voudrais savoir également comme je pourrais faire pour centrer le texte de ma row de la table view verticalement ?
    C'est à  dire qu'il y est autant d'espace entre le haut et le bas de la row et le texte ? Parce que le texte est coincé en haut...
  • Philippe49Philippe49 Membre
    17:09 modifié #20
    Tu recalcules cellFrame à  l'aide de cellSizeForBounds: avant l'appel à  super de drawInteriorWithFrame:inView:
  • apocaalypsoapocaalypso Membre
    17:09 modifié #21
    Merci.
    Dans quelle méthode ? En sous-classant NSCell ?
  • Philippe49Philippe49 Membre
    17:09 modifié #22
    Oui dans la sous-classe de NSCell et la méthode que t'as fourni EagleLouk
    <br />- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView<br />{<br />&nbsp; &nbsp;  // calculer la bonne cellFrame<br />&nbsp; &nbsp;  ....<br /><br />&nbsp; &nbsp;  // appel à  super<br />&nbsp; &nbsp; [super drawInteriorWithFrame:cellFrame inView:controlView];	<br />}
    

  • apocaalypsoapocaalypso Membre
    17:09 modifié #23
    Merci Philippe, j'ai fait :
    - (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView<br />{<br />	// calculer la bonne cellFrame<br />	[self cellSizeForBounds:NSMakeRect(0, 50*i, 169, 100)];<br />	<br />	// appel à  super<br />&nbsp; &nbsp; [super drawInteriorWithFrame:NSMakeRect(0, 50*i, 169, 100) inView:controlView];<br />	i++;<br />}<br />
    


    mais le problème c'est que lorsque je clique sur l'une des row le titre disparaà®t  ???
  • Philippe49Philippe49 Membre
    17:09 modifié #24
    Euh, c'est quoi le 'i' ?


    cellSizeForBounds:

    Returns the minimum size needed to display the receiver, constraining it to the specified rectangle.

    - (NSSize)cellSizeForBounds:(NSRect)aRect

    Parameters
    aRect
    The size of the cell,
Connectez-vous ou Inscrivez-vous pour répondre.