12
votes

* Calcul de la hauteur de texte en cacao (pour Mac, pas iOS)

Comment puis-je calculer la hauteur d'une chaîne dans une étiquette particulière (NstextField), pour une largeur fixe donnée?

J'ai googlé de différentes méthodes et essayé Cette méthode d'Apple . Cela fonctionne, sauf que la hauteur devient une ligne trop courte pour des chaînes plus longues. Ainsi, il semble y avoir des inexactitudes dans les méthodes actuelles.

J'ai aussi eu le même problème avec un autre code que j'ai googlé.

Est-ce que quelqu'un ici a un code précis pour la recherche de la hauteur de texte (donnée une largeur particulière)?


0 commentaires

6 Réponses :


2
votes

Jetez un coup d'œil sur le KIT DE L'APPLICATION NSSTRING ADDITIONS Référence . Il semble que - tailleWITHATtributes: ou - LimiteDrectWithSize: Options: Attributs: pourrait faire ce que vous voulez.


0 commentaires

19
votes

J'ai résolu le problème à l'aide de la chaîne NS (attribuée) String + Geometrics Catégorie fournie à http: // www.sheepysystems.com/sourcecode/sourcecode/sourceStringgeDeRetS.html dans le fichier d'en-tête de cette catégorie est une bonne explication de la façon dont ces choses fonctionnent. Spécifiquement, ils mentionnent que l'on devrait utiliser NStextView au lieu de NStextField car il est pratiquement impossible d'obtenir une hauteur précise pour ces derniers.

Ainsi, j'ai remplacé mon NStextView. Tout d'abord, j'ai fait mon nstextView ressemblant à mon NSTextField avec ce code: p> xxx pré>

Puis j'ai eu la hauteur avec ce code: p>

NSDictionary *attributes
  = [NSDictionary dictionaryWithObjectsAndKeys:
     [textView font],NSFontAttributeName,nil];
NSAttributedString *attributedString
  = [[NSAttributedString alloc] initWithString:
     [textView string] attributes:attributes];
CGFloat height = [attributedString heightForWidth:
                 [textView frame].size.width];


4 commentaires

Grand travail résolvant votre propre problème. Cela ressemble également à des informations utiles. S'il vous plaît n'oubliez pas d'accepter l'une de ces réponses afin que la question ne semble pas «sans réponse».


Oui, je vais faire ça. Mais je dois attendre 2 jours après avoir posté (22 heures à partir de maintenant) avant que je puisse le faire.


[TextView Setfont: [NSFont SystemFontfsize: 13] Plage: NSMakerange (0, [Longueur sale])]; C'est la ligne la plus importante ici. Avec la sortie, vous obtiendrez de mauvaises hauteurs même si la vue de texte du générateur d'interface est définie sur la même police et la même taille. J'ai également dû écrire cette ligne après chaque SetString dans ma tableView ou bien les choses seraient géniales.


@Segev fantastique, merci! Je vais toujours obtenir des valeurs de hauteur étrange (deux fois la taille du texte réel). J'ai essayé votre méthode de réglage de la police de l'étiquette après définir la chaîne de texte et fonctionnait parfaitement. Bugs étranges dans xcode / macos je suppose ...: /



9
votes

(une solution à Swift est à la fin de la poste)

J'ai essayé toutes ces méthodes et aucune n'a travaillé pour moi. La manière «officielle» (comme mentionné par OP) était hors du temps pour mon NstextField code>. Passer à NStextView code> était impossible à cause de xcode / ib toujours em> Crashing après avoir ajouté un "NStextView dans un NSScrollView". P>

Longue histoire courte, j'ai trouvé cela moyen facile de déterminer la hauteur de mon nstextfield code> mais cela peut être très facilement adapté à la largeur. p> xxx pré>

Ce code a fonctionné pour chaque test cas qui a échoué avec les autres méthodes. J'espère que ça aidera quelqu'un. Il fait toujours me sentir sacrément stupide quand je prends 2 heures pour trouver la solution à un problème apparemment facile p>

LÉGÈRE EDIT strong>:. Une fois de plus près cela ne fonctionne que si vous lisez le StringValue Code> du NStextField code> Avant de demander à la cellule de calculer sa hauteur. J'ai donc ajouté la ligne suivante nonsensique forte> de la ligne forte> avant le calcul réel: p> xxx pré>

Je sais que c'est vraiment vraiment em> mal mais à Ce point que je ne me soucie plus. Je veux juste une solution fiable. N'hésitez pas à bowervote-moi ou mieux encore em>: suggérer une meilleure solution. P>

Swift strong> (merci IPHAAW d'avoir apporté ceci à mon ATTENTION!) P>

myTextField.cell!.cellSizeForBounds(NSMakeRect(CGFloat(0.0), CGFloat(0.0), width, CGFloat(FLT_MAX))).height


2 commentaires

Merci pour cette solution facile. Mais pourquoi le casting? C'est totalement bon sans. Pour moi, cela fonctionne sans la ligne "absurde".


Codage vigoureux où dois-je mettre ce code pour travailler? Je mets ceci dans cellforview mais ut n'a pas fonctionné



0
votes

La réponse du codage vigoureux fonctionne si bien! Est-ce vraiment mauvais? Il semble fonctionner parfaitement. Enfin après avoir passé de nombreuses heures d'autres solutions.

Voici ma traduction rapide du code: p>

myTextField.cell!.cellSizeForBounds(NSMakeRect(CGFloat(0.0), CGFloat(0.0), width, CGFloat(FLT_MAX))).height


0 commentaires

5
votes

Merci vraiment à IPHAAW et Enchilada pour cette petite solution vraiment cool. J'ai trouvé si bien fonctionné lors de la configuration des hauteurs de la rangée, etc. que j'ai converti la rapidité d'IPHAAW en quelques extensions NStextField. Profitez

extension NSTextField {
func bestheight(text: String, width: CGFloat) -> CGFloat {

    self.stringValue = text
    let getnumber = self.cell!.cellSizeForBounds(NSMakeRect(CGFloat(0.0), CGFloat(0.0), width, CGFloat(FLT_MAX))).height

    return getnumber
   }
}

extension NSTextField {
func bestwidth(text: String, height: CGFloat) -> CGFloat {

    self.stringValue = text
    let getnumber = self.cell!.cellSizeForBounds(NSMakeRect(CGFloat(0.0), CGFloat(0.0), CGFloat(FLT_MAX), height)).width

    return getnumber
   }
}


0 commentaires

3
votes

Ceci est Réponse de Artbykgh pour SWIFT 4 +:

extension NSTextField {
    func bestHeight(for text: String, width: CGFloat) -> CGFloat {
        stringValue = text
        let height = cell!.cellSize(forBounds: NSRect(x: 0, y: 0, width: width, height: .greatestFiniteMagnitude)).height

        return height
    }

    func bestWidth(for text: String, height: CGFloat) -> CGFloat {
        stringValue = text
        let width = cell!.cellSize(forBounds: NSRect(x: 0, y: 0, width: .greatestFiniteMagnitude, height: height)).width

        return width
    }
}


0 commentaires