J'ai cherché sur la façon de jouer cela, mais je ne trouve aucune réponse.
J'aimerais savoir si mon Nstextfield code> tronque déjà le texte (... à la fin) sans avoir à vérifier la longueur de son
StringValue code>. Je dois faire cela pour savoir si je dois définir une info-bulle sur mon
Nstextfield code> (agissant comme une simple étiquette).
La raison pour laquelle je ne veux pas vérifier la longueur de mon StringValue de My Textfield CODE> C'est parce qu'il y a des caractères qui occupent plus d'espace que d'autres, donc ce n'est pas très précis
Merci! P>
4 Réponses :
Votre meilleur pari pourrait être d'utiliser un Si la largeur code> Conteaux code> est inférieure à la taille code> largeur alors le texte sera tronqué. p> EDIT EDIT: FORT> excuses, ce n'est que VRAI avec no Je suppose que vous pouvez également faire des hypothèses sur la zone de texte relatif à la taille de la taille du nstextview code> au lieu d'un
nstextfield code>. Si vous utilisez un
nstextview code>, vous pouvez obtenir le
nstextContainer code> du
nstextview code> à l'aide de la propriété
textContainer code>. Le conteneur peut vous dire le
conteneuriser code> (l'espace que le texte est dessiné).
nstring code> Les objets répondent à la méthode
Taillewithattributes: code>. Vous pouvez utiliser la structure
NSSIZE code> résultante pour saisir la largeur du texte si elle est dessinée avec les attributs donnés. Voir la section "Constantes" du Nsattributedstring kit d'application ajoute référence pour déterminer quels attributs sont pertinents. P>
linefragmentPadding code>, mais le
linefragmentPadding code> n'est pas zéro. Sous-ci soustrayez le
textContainer.linefragmentPadding code> à partir de
conteneurersize.width code> ou utilisez le
NStextContainer CODE>
SETLLINEFRAGMENTPADDing: Code> Pour la définir sur 0 code>. p>
NStextField code> et utilisez la taille
/ code>
nstring code> méthode conjointement avec cela, mais ce n'est pas aussi propre. p>
nstextview code>. J'ai aussi pensé que je pourrais aussi bien lancer dans certains codes qui rend le
nstextview code> un peu plus similaire à l'apparence du
NStextField code> en le mettant à l'intérieur d'un
NSBox code>. Ajout d'une vérification de la taille Pour déterminer si une info-bulle doit être affichée serait une addition simple au code ci-dessous à l'aide des informations déjà mentionnées ci-dessus. P>
NSString* string = @"Hello World.";
// get the size the text will take up using the default font
NSSize textBounds = [string sizeWithAttributes:@{}];
// Create a border view that looks more or less like the border used around
// text fields
NSBox* borderView = [[NSBox alloc] initWithFrame:NSMakeRect(10, 10, 60, textBounds.height+4)];
[borderView setBoxType:NSBoxCustom];
[borderView setBorderType:NSBezelBorder];
[borderView setContentViewMargins:NSMakeSize(0, 0)];
[borderView setFillColor:[NSColor whiteColor]];
// Create the text view
NSTextView* textView = [[NSTextView alloc] initWithFrame:NSMakeRect(0, 0, 60, textBounds.height)];
[textView setTextContainerInset:NSMakeSize(2, 0)];
[textView.textContainer setLineFragmentPadding:0];
[textView setEditable:YES];
// Set the default paragraph style so the text is truncated rather than
// wrapped
NSMutableParagraphStyle* parStyle = [[NSMutableParagraphStyle alloc] init];
[parStyle setLineBreakMode:NSLineBreakByTruncatingTail];
// Do not let text get squashed to fit
[parStyle setTighteningFactorForTruncation:0.0];
[textView setDefaultParagraphStyle:parStyle];
[parStyle release];
// Set text
[textView setString:string];
// add NSTextView to border view
[borderView addSubview:textView];
[textView release];
// add NSBox to view you want text view displayed in
[self addSubview:borderView];
[borderView release];
N'oubliez pas que le NSTExtField rétrécira légèrement le texte s'il est proche de s'adapter sans tronquer. Les deux champs de texte ont la même police.
@Johnsauer bon point. Cela se produit également pour NStextViews. C'est le comportement par défaut de l'algorithme tronquant d'essayer de se rapprocher des caractères avant de tronquer. Dans ma deuxième modification, j'arrête cela de se produire en utilisant le SettighingFactorForRuncation: Code> de la classe
NSMuTableParaStyle code> classe.
merci pour votre réponse, je vais essayer dès que possible et je vous ferai savoir
Peut-être que je me trompe mais je pense que cette réponse ne répond pas à la question initiale ... non?
@Regis_ag OP voulait faire quelque chose que je suis sûr que je ne peux pas être fait. Il n'y a pas de méthode pour déterminer si un nstextfield code> tronque son texte. Donc, j'ai fourni la meilleure solution que je pouvais pour afficher du texte modifiable, de tronquer le débordement et de déterminer si le débordement se produira.
Je pense que vous pouvez le faire en consultant le cadre de l'éditeur de champ du champ de texte. Vous vérifiez sa largeur dans ControlTextDidBeting, puis à nouveau dans ControlTextDidentiviting. Si la dernière valeur est plus grande, le texte a été tronqué. Ce qui suit est mis en œuvre dans le délégué du champ de texte (j'ai créé un ivar pour initialeWidth): Cela semble fonctionner la plupart du temps, y compris si vous tapez dans une longue chaîne, puis supprimez jusqu'à ce que Il convient à nouveau. Dans quelques cas, cela m'a donné le message de journal lorsque j'étais un personnage au-delà de la fin du champ de texte, mais je n'ai pas reçu les ellipsis lors de l'édition terminée. P> P>
Pour les futurs visiteurs, vous pouvez utiliser le permet à la cellule de renvoyer une structure de cellule d'expansion si la cellule cellule est
trop petit pour tout le contenu dans la vue. ... En bref, vous pouvez dire si un - [NSCell ExpansionFramewithframe: Siview:] Code> Méthode pour déterminer si la troncature a lieu. De l'en-tête:
NStextField code> est tronquant comme ceci: p>
C'est la meilleure solution
Pourriez-vous s'il vous plaît fournir une solution Swift 3? Je n'ai pas pu adapter le code Obj-C.
STROIFT 4 SOLUTION À L'UTILISATION IPMCC comme base
Il redimensionnera une à une à une jusqu'à ce qu'elle ajustée ou fontiser = 3 p>
var size_not_ok = true var conter = 0 let mininum_font_size = 3 // will resize ultil 3 while size_not_ok || conter < 15 { // will try 15 times maximun let expansionRect = le_nstextfield.expansionFrame(withFrame: le_nstextfield.frame) let truncated = !NSEqualRects(NSRect.zero, expansionRect) if truncated { if let actual_font_size : CGFloat = le_nstextfield.font?.fontDescriptor.object(forKey: NSFontDescriptor.AttributeName.size) as? CGFloat { le_nstextfield.font = NSFont.systemFont(ofSize: actual_font_size - 1) if actual_font_size < mininum_font_size { break } } } else { size_not_ok = false } conter = conter + 1 }