J'essaie d'obtenir la largeur d'un NSString (ex. NSString * myString = @ "hello"). Y a-t-il un moyen de faire cela?
Merci.
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;
}
UIFont * font = [UIFont systemFontOfSize:15];
CGSize stringSize = [aString sizeWithFont:font];
CGFloat width = stringSize.width;
Envoyez à la chaîne un message sizeWithAttributes:
en passant un dictionnaire contenant les attributs avec lesquels vous souhaitez mesurer la chaîne.
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
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;
}
quant à iOS 7 et plus, c'est la bonne façon:
NSString * buttonTitle = @"demo title";
CGSize stringSize = [buttonTitle sizeWithAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:17.0f]}];
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)))
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];
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];