Cómo obtener el tamaño de un NSString

Un “quicky”: ¿cómo puedo obtener el tamaño (ancho) de un NSString?

Estoy tratando de ver si el ancho de una cuerda para ver si es más grande que un ancho dado de la pantalla, caso en que tengo que “cortarlo” y anexarlo con “…”, obteniendo el comportamiento habitual de un UILabel. string.length no funcionará, ya que AAAAAAAA y iiiiii tienen la misma longitud pero diferentes tamaños (por ejemplo).

Estoy como atrapado.

Muchas gracias.

Este es un enfoque diferente. Averigüe el tamaño mínimo del texto para que no se ajuste a más de una línea. Si se ajusta a más de una línea, puede averiguar usando la altura.

Puedes 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 es el ancho de la pantalla con un pequeño espacio para los márgenes. Debe sustituir sus propios valores por fuente y tamaño, y por lineBreakMode si no está utilizando IB.

Ahora myStringSize contendrá una height que puedes myStringSize con la altura de algo que sabes que tiene solo 1 línea de alto (usando la misma fuente y tamaño). Si es más grande, necesitarás cortar el texto. Tenga en cuenta que debe agregar un … a la cadena antes de volver a verificarla (al agregar la … podría volver a sobrepasar el límite).

Coloque este código en un bucle para cortar el texto, luego vuelva a verificar la altura correcta.

Use el siguiente método.

C objective

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

Debe usar Core Graphics para medir la cadena, tal como se representa en la fuente y el tamaño especificados. Vea las respuestas para Medir el ancho de píxel de una cuerda para un recorrido.

 sizeWithFont:constrainedToSize:lineBreakMode 

está en desuso ahora Use el siguiente fragmento de código,

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