/ / Comment effectuer le redimensionnement de NSTableCellView en fonction de la taille de son NSTextField? - objectif-c, macos, cacao, nstableview

Comment redimensionner NSTableCellView en fonction de la taille de son NSTextField? - objectif-c, macos, cacao, nstableview

Je sais que dans une vue de table basée sur une vue, la ligneclasse les sous-classes NSTableCellView de NSView. Cette classe contient deux propriétés, un NSTextField et un NSImageView. J'utilise uniquement le NSTextField sans vue d'image. Cependant, certaines cellules de ma vue tabulaire doivent contenir plusieurs lignes de texte, tandis que d'autres ne peuvent contenir qu'une ou deux lignes. J'ai besoin de pouvoir redimensionner les vues NSTableCellView individuelles en fonction de la taille de leur propriété textField NSTextField.

Par conséquent, je devais faire ce qui suit:

  1. Obtenez le frameSize du NSTextField dans la vue des cellules du tableau.
  2. Définissez le frameSize du NSTableCellView sur le frameSize du NSTextField (celui que nous avons obtenu dans le premier ensemble)

Cependant, cette approche n'a pas fonctionné. J'ai commencé à penser que mon approche pour redimensionner NSTableCellView est incorrecte. Voici le code que j'ai utilisé:

[tableCellView setFrameSize:[[tableCellView textField] frame].size];
[tableCellView setNeedsDisplay:YES];

Y a-t-il un problème avec cette approche? Je m'attendrais à ce que la cellule se redimensionne, mais elle ne fonctionne pas? Qu'est-ce qui ne va pas?

Merci.

Réponses:

2 pour la réponse № 1

[edit] J'aurais dû commencer par dire que la taille du textField n'a pas grand-chose à voir avec la taille qu'il faudrait pour afficher tout son contenu.

J'utilise ce code pour déterminer la hauteur d'une chaîne en fonction de la largeur d'une cellule de tableau:

- (CGFloat) displayStringHeightWithWidth:(CGFloat)width
{
CGSize size = NSMakeSize(width,0);
NSRect bounds = [self.displayString boundingRectWithSize:size
options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading];
return bounds.size.height;
}

Idéalement, vous pouvez l'adapter à la recherche de la hauteur de textField.stringValue ou textField.attributedStringValue. Non pas que ce qui précède soit également d'OSX, pas d'iOS, donc YMMV sur certains des peluches.

Cela change donc votre algorithme en:

  1. Obtenez la largeur de la colonne du tableau
  2. Obtenir la hauteur du rectangle de délimitation requis pour le texte du champ de texte
  3. Dites à la table que la hauteur de ligne est celle que vous avez trouvée dans 2

Maintenant. Concernant # 3. Je crois que vous avoir utiliser la tableView: heightOfRow: dans le protocole NSTableViewDelegate ainsi que d'appeler la table "s noteHeightOfRowsWithIndexesChanged: pour que les hauteurs de ligne changent. La tableView" ne sait pas autrement que la hauteur de votre cellule a changé. Notez la discussion dans la documentation. Il se pourrait que votre méthode fonctionne sans le délégué et en disant simplement au tableau que les hauteurs de ligne pour les lignes que vous modifiez sont sales ... mais je ne m'y attendrais pas vraiment.