Como obter o tamanho de um NSString

Um “quicky”: como posso obter o tamanho (largura) de um NSString?

Eu estou tentando ver se a largura da string de uma string para ver se é maior do que uma determinada largura de canvas, caso em que eu tenho que “cortar” e anexá-lo com “…”, obtendo o comportamento usual de um UILabel. string.length não faz o truque, já que AAAAAAAA e iiiiii têm o mesmo comprimento, mas tamanhos diferentes (por exemplo).

Eu estou meio preso.

Muito obrigado.

    Esta é uma abordagem diferente. Descubra o tamanho mínimo do texto para que ele não seja quebrado em mais de uma linha. Se envolver mais de uma linha, você pode descobrir usando a altura.

    Você pode usar este código:

    CGSize maximumSize = CGSizeMake(300, 9999); NSString *myString = @"This is a long string which wraps"; UIFont *myFont = [UIFont fontWithName:@"Helvetica" size:14]; CGSize myStringSize = [myString sizeWithFont:myFont constrainedToSize:maximumSize lineBreakMode:self.myLabel.lineBreakMode]; 

    300 é a largura da canvas com um pequeno espaço para margens. Você deve replace seus próprios valores por fonte e tamanho, e pelo lineBreakMode se não estiver usando o IB.

    Agora myStringSize irá conter uma height que você pode checar com a altura de algo que você sabe que tem apenas 1 linha de altura (usando a mesma fonte e tamanho). Se for maior, você precisará cortar o texto. Note que você deve adicionar um … à string antes de verificá-la novamente (adicionando o … pode empurrá-lo para o limite novamente).

    Coloque este código em um loop para cortar o texto e, em seguida, verifique novamente a altura correta.

    Use o método abaixo.

    Objetivo-C

     - (CGSize)findHeightForText:(NSString *)text havingWidth:(CGFloat)widthValue andFont:(UIFont *)font { CGSize size = CGSizeZero; if (text) { CGRect frame = [text boundingRectWithSize:CGSizeMake(widthValue, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{ NSFontAttributeName:font } context:nil]; size = CGSizeMake(frame.size.width, frame.size.height + 1); } return size; } 

    Swift 3.0

     func findHeight(forText text: String, havingWidth widthValue: CGFloat, andFont font: UIFont) -> CGSize { var size = CGSizeZero if text { var frame = text.boundingRect(withSize: CGSize(width: widthValue, height: CGFLOAT_MAX), options: .usesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil) size = CGSize(width: frame.size.width, height: frame.size.height + 1) } return size } 

    Você precisa usar o Core Graphics para medir a string, conforme processado na fonte e no tamanho especificados. Veja as respostas para Medindo a largura de pixels de uma string para uma passagem.

     sizeWithFont:constrainedToSize:lineBreakMode 

    está obsoleto agora. Use abaixo o trecho de código,

     UIFont *font=[UIFont fontWithName:@"Arial" size:16.f]; NSString *name = @"APPLE"; CGSize size = [name sizeWithAttributes:@{NSFontAttributeName:font}];