¿Cómo puedo hacer que un text de layout de UITextView sea el mismo que un UILabel?

Tengo una UILabel que necesito convertir a UITextView porque razones. Cuando hago esto, el text no se posiciona igual, a pesar de usar la misma fuente (personalizada).

Descubrí que si establecía:

 textView.textContainer.lineFragmentPadding = 0; textView.textContainerInset = UIEdgeInsetsZero; 

Esto hace que el text esté muy cerca, pero si superpongo el UITextView sobre el UILabel , veo que el posicionamiento del text se separa más con cada nueva línea.

Captura de pantalla que muestra la deriva de texto.

El UILabel es verde, el UITextView es negro. Esto está utilizando NSParagraphStyle para establecer la altura mínima y máxima de línea en 15.

He jugado con la configuration del estilo de párrafo y la altura mínima / máxima de línea, pero no pude coincidir exactamente. No soy una impresora, así que no comprendo necesariamente todos los términos relacionados con fonts en la documentation de NSLayoutManager y NSTextContainer y todo eso.

Solo necesito admitir iOS 7 y versiones posteriores.

No voy a cambiar a un loco widget basado en CoreText o usar alguna biblioteca de terceros aleatoria. Estoy bien, lo suficientemente cerca si es necesario. Pero parece que debería haber alguna combinación de properties aleatorias para hacer que el layout sea el mismo.

Tomé la solución para el espaciado entre líneas que se encuentra en este enlace y la aplicé a su problema. lineSpacing increíblemente ajustando la propiedad lineSpacing . Probé con HelveticaNeue tamaño 13 y logré alinearlo como se muestra en la captura de pantalla a continuación.

 textView.textContainer.lineFragmentPadding = 0; textView.textContainerInset = UIEdgeInsetsZero; NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; paragraphStyle.lineSpacing = -0.38; NSDictionary *attrsDictionary = @{ NSFontAttributeName: [UIFont fontWithName:@"HelveticaNeue" size:13.0f], NSParagraphStyleAttributeName: paragraphStyle}; textView.attributedText = [[NSAttributedString alloc] initWithString:textView.text attributes:attrsDictionary]; 

Captura de pantalla

He podido 'suplantar' con éxito una UILabel multilínea no editable (como sucede, en una subclass UITableViewCell) con una ITUextView multilínea editable equivalente usando lo siguiente:

 _textView = UITextView.new; _textView.font = _label.font; _textView.textColor = _label.textColor; _textView.textAlignment = _label.textAlignment; _textView.backgroundColor = UIColor.clearColor; _textView.textContainer.lineFragmentPadding = 0; _textView.textContainerInset = UIEdgeInsetsZero; 

y para que se comporte bien cuando realice ediciones reales, agregue lo siguiente a su UITextViewDelegate:

 - (void)textViewDidChange:(UITextView *)textView { ... [textView scrollRangeToVisible:NSMakeRange(textView.text.length, 0)]; [textView scrollRectToVisible:[textView caretRectForPosition:textView.endOfDocument] animated:NO]; }