web-dev-qa-db-fra.com

Comment obtenir la largeur d'un NSString?

J'essaie d'obtenir la largeur d'un NSString (ex. NSString * myString = @ "hello"). Y a-t-il un moyen de faire cela? 

Merci.

29
David

Voici une approche relativement simple. Créez simplement un NSAttributedString avec la police appropriée et demandez sa taille:

- (CGFloat)widthOfString:(NSString *)string withFont:(NSFont *)font {
     NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:font, NSFontAttributeName, nil];
     return [[[NSAttributedString alloc] initWithString:string attributes:attributes] size].width;
 }
57
Stephen Poletto
UIFont * font = [UIFont systemFontOfSize:15];

CGSize stringSize = [aString sizeWithFont:font]; 

CGFloat width = stringSize.width;
14
joker

Envoyez à la chaîne un message sizeWithAttributes: en passant un dictionnaire contenant les attributs avec lesquels vous souhaitez mesurer la chaîne.

3
Peter Hosey

je ne sais pas si vous êtes supposé utiliser ceci dans le contact de cacao. si c'est le cas, alors:

- (CGFloat)widthOfString:(NSString *)string withFont:(NSFont *)font {
     NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:font, NSFontAttributeName, nil];
     return [[[NSAttributedString alloc] initWithString:string attributes:attributes] size].width;
 }

ne travaillera pas.

dans Cocoa Touch, vous devez ajouter un cadre coretext et importer l'en-tête .__ et écrire votre code comme ceci:

UIFont *font = [UIFont fontWithName:@"HelveticaNeue-BoldItalic" size:DEFAULT_FONT_SIZE];
//    NSLog(@"%@", NSFontAttributeName);
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:font, (NSString     *)kCTFontAttributeName, nil];

mais, GEE !!!!!

NSMutableAttributedString *as = [[NSMutableAttributedString alloc] initWithString:self.caption attributes:attributes];
[as size].width;

il n'y a pas de taille cette méthode dans NSMutableAttributedString!

enfin, cela fonctionnerait

[self.caption sizeWithFont:font].width
3
Bruce Lee

En utilisant la chaîne attribuée à UILabel:

- (CGSize)getStringSizeWithText:(NSString *)string font:(UIFont *)font{

    UILabel *label = [[UILabel alloc] init];
    label.text = string;
    label.font = font;

    return label.attributedText.size;
}
2
Amr Lotfy

quant à iOS 7 et plus, c'est la bonne façon:

NSString * buttonTitle = @"demo title";
CGSize stringSize = [buttonTitle sizeWithAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:17.0f]}];
2
Eli

Voici la solution de Stephen dans Clozure Common LISP, lorsque vous utilisez le pont Objective C. Je suis tombé sur ce billet lorsque je cherchais une solution et je venais de réécrire la version de Stephen qui fonctionnait très bien pour moi. Les personnes utilisant Clozure pourraient trouver cela utile:

(defun string-width (str font)
  (let* ((dict (#/dictionaryWithObjectsAndKeys: ns:ns-mutable-dictionary
                font #$NSFontAttributeName
                ccl:+null-ptr+))
         (attr (#/initWithString:attributes: (#/alloc ns:ns-attributed-string)
                (ccl::%make-nsstring str)
                dict))
         (size (#/size attr)))
    (ns:ns-size-width size)))
0
Clayton Stanley

Désolé, ma question n'était pas assez détaillée et ce n'est pas exactement ce que j'essaie de faire. J'utilise un stockage de texte, un gestionnaire de disposition et un conteneur de texte. La solution consiste à utiliser le gestionnaire de disposition pour déterminer le rectangle qui délimite le rect. Voici le code. 

NSTextStorage *textStorage = [[NSTextStorage alloc] initWithString:@"hello"];
NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init];
NSTextContainer *textContainer = [[NSTextContainer alloc] init];

[layoutManager addTextContainer:textContainer];
[textContainer release];

[textStorage addLayoutManager:layoutManager];
[layoutManager release];

//Figure out the bounding rectangle
NSRect stringRect = [layoutManager boundingRectForGlyphRange:NSMakeRange(0, [layoutManager numberOfGlyphs]) inTextContainer:textContainer];
0
David

UIKit a un ajout intéressant à NSString, ce qui rend sizeWithAttributes: un peu plus léger:

CGSize titleSize = [title sizeWithFont:titleFont 
                     constrainedToSize:contentCellSize 
                         lineBreakMode:UILineBreakModeWordWrap];
0
Mullzk