Come ottenere la larghezza di una NSString?

Sto cercando di ottenere la larghezza di una NSString (ad esempio NSString * myString = @ “ciao”). C’è un modo per fare questo?

Grazie.

Ecco un approccio relativamente semplice. Basta creare una stringa NSAttribuita con il carattere appropriato e chiedere la sua dimensione:

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

Invia la stringa a sizeWithAttributes: messaggio, passando un dizionario contenente gli attributi con cui vuoi misurare la stringa.

non so se si supponga di utilizzare questo nel touch di cocoa. se lo è, allora:

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

non funzionerà

nel touch di cocoa, devi aggiungere il framework di coretext e importare l’intestazione e scrivere il tuo codice in questo modo:

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

ma, GEE !!!!!

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

non c’è dimensione in questo metodo in NSMutableAttributedString!

finalmente, questo funzionerebbe

 [self.caption sizeWithFont:font].width 

come per iOS 7 e fino questo è il modo corretto:

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

Usando la stringa attribuita da UILabel:

 - (CGSize)getStringSizeWithText:(NSString *)string font:(UIFont *)font{ UILabel *label = [[UILabel alloc] init]; label.text = string; label.font = font; return label.attributedText.size; } 

Ecco la soluzione di Stephen in Clozure Common Lisp, quando si utilizza il bridge Objective C. Mi sono imbattuto in questo post quando ho cercato una soluzione, e ho appena riscritto la versione di Stephen che ha funzionato bene per me. Altri che usano Clozure potrebbero trovare utile questo:

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

Spiacente, la mia domanda non è stata sufficientemente dettagliata e non è esattamente quello che sto cercando di fare. Sto usando una memoria di testo, un gestore di layout e un contenitore di testo. La soluzione è utilizzare il gestore di layout per determinare il rettangolo che limita il rettangolo. Ecco il codice.

 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 ha una bella aggiunta a NSString, rendendo sizeWithAttributes: un po ‘più leggero:

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

Nel caso ti stia chiedendo come controllare la dimensione di una etichetta, dovresti usare UIFont, invece di NSFont (non sono nemmeno sicuro se esiste)