Como obter a largura de um NSString?

Eu estou tentando obter a largura de um NSString (ex. NSString * myString = @ “hello”). Existe uma maneira de fazer isso?

Obrigado.

Aqui está uma abordagem relativamente simples. Basta criar um NSAttributedString com a fonte apropriada e perguntar por seu tamanho:

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

Envie a string uma mensagem sizeWithAttributes: passando um dictionary contendo os atributos com os quais deseja medir a string.

Eu não sei se você deve usar isso no cocoa touch. se for, então:

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

não vai funcionar.

no toque do cacau, você precisa adicionar o quadro do coretext e importar o header e escrever seu código da seguinte forma:

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

mas, GEE !!!!!

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

não há tamanho este método em NSMutableAttributedString!

finalmente, isso funcionaria

 [self.caption sizeWithFont:font].width 

quanto ao ios 7 e acima esta é a maneira correta:

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

Usando a string atribuída do UILabel:

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

Aqui está a solução de Stephen no Clozure Common Lisp, ao usar a ponte do Objective C. Me deparei com este post ao procurar uma solução, e acabei de rewrite a versão de Stephen, que funcionou bem para mim. Outros usuários do Clozure podem achar isso útil:

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

Desculpe a minha pergunta não foi detalhada o suficiente e não é exatamente o que eu estou tentando fazer. Eu estou usando um armazenamento de texto, gerenciador de layout e um contêiner de texto. A solução é usar o gerenciador de layout para determinar o retângulo que limita o retângulo. Aqui está o código.

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

O UIKit tem uma boa adição ao NSString, fazendo o sizeWithAttributes: um pouco mais claro:

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

Apenas no caso de você estar se perguntando como verificar um tamanho de etiqueta, você deve usar o UIFont, em vez do NSFont (nem mesmo se existe)