¿Hay alguna forma de calcular de manera confiable la altura de una UITextView?

He intentado sizeWithFont:constrainedToSize:lineBreakMode y sizeToFit , los cuales no devuelven el resultado correcto.

Se supone que la propiedad contentSize debe devolver la altura correcta, pero no funciona hasta que se visualice la vista de text en la pantalla, y necesito calcular la altura antes de que la vista de text esté visible (determina la altura de una UITableViewCell .

¿Alguien ha encontrado algún otro método, una vista de text personalizado o similar, que calcule correctamente la altura de un UITextView?

EDITAR Debería aclarar que quiero la altura ideal basada en el contenido de la vista de text.

IOS 7 ya no es compatible con la propiedad contentSize . Intenta usar esto

 CGFloat textViewContentHeight = textView.contentSize.height; textViewContentHeight = ceilf([textView sizeThatFits:textView.frame.size].height + 9); 

esto solucionó mi problema

Aquí está el código que funcionó para mí:

 + (CGFloat)heightOfComment:(NSString *)comment { UILabel *label = PrototypeCell.commentLabel; // NOTE: The height of the comment should always be at least the height of // one line of text. if (comment.length == 0) comment = @" "; return [comment sizeWithFont:label.font constrainedToSize:label.frame.size lineBreakMode:label.lineBreakMode].height; } 

La key para hacer que funcionara fue if (comment.length == 0) comment = @" "; .

Cuando las técnicas que implican sizeToFit: y layouSubview no funcionan, utilizo esto:

 - (CGFloat)measureHeightOfUITextView:(UITextView *)textView { if ([textView respondsToSelector:@selector(snapshotViewAfterScreenUpdates:)]) { // This is the code for iOS 7. contentSize no longer returns the correct value, so // we have to calculate it. // // This is partly borrowed from HPGrowingTextView, but I've replaced the // magic fudge factors with the calculated values (having worked out where // they came from) CGRect frame = textView.bounds; // Take account of the padding added around the text. UIEdgeInsets textContainerInsets = textView.textContainerInset; UIEdgeInsets contentInsets = textView.contentInset; CGFloat leftRightPadding = textContainerInsets.left + textContainerInsets.right + textView.textContainer.lineFragmentPadding * 2 + contentInsets.left + contentInsets.right; CGFloat topBottomPadding = textContainerInsets.top + textContainerInsets.bottom + contentInsets.top + contentInsets.bottom; frame.size.width -= leftRightPadding; frame.size.height -= topBottomPadding; NSString *textToMeasure = textView.text; if ([textToMeasure hasSuffix:@"\n"]) { textToMeasure = [NSString stringWithFormat:@"%@-", textView.text]; } // NSString class method: boundingRectWithSize:options:attributes:context is // available only on ios7.0 sdk. NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; [paragraphStyle setLineBreakMode:NSLineBreakByWordWrapping]; NSDictionary *attributes = @{ NSFontAttributeName: textView.font, NSParagraphStyleAttributeName : paragraphStyle }; CGRect size = [textToMeasure boundingRectWithSize:CGSizeMake(CGRectGetWidth(frame), MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:attributes context:nil]; CGFloat measunetworkingHeight = ceilf(CGRectGetHeight(size) + topBottomPadding); return measunetworkingHeight; } else { return textView.contentSize.height; } } 

La altura no está disponible hasta que se extienda UITextview. En iOS 6, addSubview (a un UIScrollView, por ejemplo) le dio valores de layout (es decir, frame.size.height). En iOS 7, esto no siempre sucede, y para sizeToFit, lo mismo es cierto.

Encontré algunas soluciones, prefiero la que hace sizeToFit, luego layoutIfNeeded antes de leer la altura (ahora cambiada):

 ... [scrollView1 addSubview: myTextView]; [myTextView sizeToFit]; //added [myTextView layoutIfNeeded]; //added CGRect frame = myTextView.frame; ... 

Esto es de la respuesta aceptada aquí , vea las notas. Mi bash de explicación aquí es, en el caso, esto no debería ser válido para UITextviews que se agregan a UITableViewCells en lugar de UIScrollViews (por alguna razón).