boundingRectWithSize no respeta el ajuste de palabras

Creo un UITextView, le agrego text y lo pongo en la vista (con un contenedor)

UITextView *lyricView = [[UITextView alloc] initWithFrame:screen]; lyricView.text = [NSString stringWithFormat:@"\n\n%@\n\n\n\n\n\n", lyrics]; [container addSubview:lyricView]; [self.view addSubview:container]; 

Luego obtengo el tamaño para usar con un button y lo agrego a UITextView

 CGRect size = [lyrics boundingRectWithSize:CGSizeMake(lyricView.frame.size.width, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[lyricView font]} context:nil]; UIButton *doneButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [doneButton setFrame:CGRectMake(56, size.size.height + 55, 208, 44)]; [doneButton setTitle:@"Done" forState:UIControlStateNormal]; [lyricView addSubview:doneButton]; 

Esto funciona en la mayoría de los casos . Esto respetará \ n saltos de línea (como he agregado en mi stringWithFormat), pero no respetará los ajustes de palabras añadidos automáticamente por la vista de text. De modo que si las lyrics tienen una línea que no cabe en la pantalla, UITextView la ajustará (como se supone que es), pero el size es ahora un poco más corto de lo que debería ser porque no respetaba el ajuste de la vista de text.

Puede distinguir boundingRectWithSize para procesar la cadena en el modo de ajuste de palabras. NSParagraphStyle agregar un atributo NSParagraphStyle al parámetro de attributes, con su lineBreakMode establecido en NSLineBreakByWordWrapping . Asi que:

 NSMutableDictionary *attr = [NSMutableDictionary dictionary]; // ...whatever other attributes you need... NSMutableParagraphStyle *paraStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; paraStyle.lineBreakMode = NSLineBreakByWordWrapping; [attr setObject:paraStyle forKey:NSParagraphStyleAttributeName]; 

luego use attr como el argumento de attributes a boundingRectWithSize .

Puede extender / generalizar fácilmente esta técnica para leer otros attributes, incluidos los attributes de estilo de párrafo existentes desde cualquier fuente que tenga sentido.

Debe usar (NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading) para el parámetro de options .

Hice más investigación y terminé encontrando esto .

 CGSize textSize = [textView sizeThatFits:CGSizeMake(textView.frame.size.width, FLT_MAX)]; CGFloat textHeight = textSize.height; 

Espero que esto ayude a alguien!