ios - attributed - ¿Cómo puedo hacer que un texto de diseño de UITextView sea igual a un UILabel?
swift webkit view load html (2)
Tengo una UILabel
que necesito convertir a un UITextView
por razones. Cuando hago esto, el texto no se posiciona igual, a pesar de usar la misma fuente (personalizada).
Encontré que si pongo:
textView.textContainer.lineFragmentPadding = 0;
textView.textContainerInset = UIEdgeInsetsZero;
Esto hace que el texto se acerque mucho, pero si superpongo el UITextView
sobre la parte superior de la UILabel
, veo que la posición del texto se aleja cada vez más con cada nueva línea.
La UILabel
es verde, el UITextView
es negro. Esto es usar NSParagraphStyle
para establecer la altura de línea mínima y máxima en 15.
He jugado configurando el estilo de párrafo y la altura de línea mínima / máxima, pero no he podido coincidir exactamente. No soy una impresora, por lo que no entiendo necesariamente todos los términos relacionados con la fuente en la documentación de NSLayoutManager
y NSTextContainer
y todo eso.
Solo necesito soportar iOS 7 y superiores.
No voy a cambiar a un widget personalizado loco basado en CoreText o utilizar alguna biblioteca aleatoria de terceros. Estoy bien con lo suficientemente cerca si tengo que hacerlo. Pero parece que debería haber alguna combinación de propiedades aleatorias para hacer que el diseño sea el mismo.
He podido "suplantar" con éxito una UILabel multilínea no editable (como sucede, en una subclase UITableViewCell) con una UITextView multilínea editable equivalente utilizando 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 al realizar 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];
}
Tomé la solución para el interlineado que se encuentra en este enlace y la apliqué a su problema. Me las arreglé para hacerlo increíblemente cerca ajustando la propiedad lineSpacing
. Probé con HelveticaNeue tamaño 13 y logré alinearlo como se muestra en la siguiente captura de pantalla.
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];