9
votes

Comment vérifier si NStextField tronque déjà le texte (... à la fin)

J'ai cherché sur la façon de jouer cela, mais je ne trouve aucune réponse.
J'aimerais savoir si mon Nstextfield tronque déjà le texte (... à la fin) sans avoir à vérifier la longueur de son StringValue . Je dois faire cela pour savoir si je dois définir une info-bulle sur mon Nstextfield (agissant comme une simple étiquette).
La raison pour laquelle je ne veux pas vérifier la longueur de mon StringValue de My Textfield 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!


0 commentaires

4 Réponses :


3
votes

Votre meilleur pari pourrait être d'utiliser un 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>

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 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>

Je suppose que vous pouvez également faire des hypothèses sur la zone de texte relatif à la taille de la taille du NStextField code> et utilisez la taille / code> nstring code> méthode conjointement avec cela, mais ce n'est pas aussi propre. p>

EDIT 2: STRUT> J'ai réalisé que je n'ai pas répondu à l'intérêt de l'OP En tronquant le texte en utilisant des ellipses. Le code exemple ci-dessous utilise la troncature dans le 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];


5 commentaires

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: de la classe NSMuTableParaStyle 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 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.



0
votes

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): xxx

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.


0 commentaires

15
votes

Pour les futurs visiteurs, vous pouvez utiliser le - [NSCell ExpansionFramewithframe: Siview:] Méthode pour déterminer si la troncature a lieu. De l'en-tête:

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. ... ... si le cadre n'est pas trop petit, retourner un rect vide, et aucune vue d'appoint d'outil d'expansion sera montré. Par défaut, Nscell renvoie Nszerorect, tandis que certaines sous-classes (tels que NStextFieldCell) retournera le cadre approprié lorsque vous avez besoin.

En bref, vous pouvez dire si un NStextField est tronquant comme ceci: xxx


2 commentaires

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.



-1
votes

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
}


0 commentaires