Una simple prueba de que es un error: Hacer un proyecto nuevo con sólo una subvista (UITextView) y poner lo siguiente en:

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    paragraphStyle.lineHeightMultiple = 50.f;
    paragraphStyle.lineSpacing = 100.f;
    paragraphStyle.minimumLineHeight = 200.f;
    paragraphStyle.maximumLineHeight = 500.f;

    UIFont *font = [UIFont fontWithName:@"AmericanTypewriter" size:24.f];

    self.textView.attributedText = [[NSAttributedString alloc] initWithString:
    @"This is a test.\n Will I pass?" attributes:
    @{NSParagraphStyleAttributeName : paragraphStyle, NSFontAttributeName : font}];
}

Interlineado es el mismo como si el atributo no estaban allí. Tiene algo tiene este funcione correctamente? Me puse en ridículo números para demostrar que eso no va a cambiar…

  • Estoy teniendo el mismo problema..¿has encontrado una solución?
  • La solución parece ser esperar hasta que Apple lo arregla. Una alternativa sería el uso de DTCoreText y aplicar su propia selección. La mayoría de la selección de código está disponible en una Manzana de la muestra denominada SimpleTextInput (está deshabilitado por defecto, pero está ahí).
InformationsquelleAutor borrrden | 2012-09-24

6 Comentarios

  1. 24

    Este es un error en NSHTMLWriter que es la clase privada que UITextView utiliza para convertir attributedText en HTML. Internamente se muestra este código HTML a través de un UIWebDocumentView. Leer más sobre el funcionamiento interno de UITextView en mi valoración crítica aquí: http://www.cocoanetics.com/2012/12/uitextview-caught-with-trousers-down/

    El problema viene de un fácil perderse especialidad en la fuente CSS abreviada. Si especifica un tamaño de pixel con la fuente de la taquigrafía, a continuación, este se establece el tamaño de fuente, así como la línea-altura. Desde NSHTMLWriter pone la fuente DESPUÉS de la línea-altura de este, hace que la línea-altura para ser cancelados por el tamaño de la fuente.

    Ver aquí para mi Radar que incluye el análisis completo del error: http://www.cocoanetics.com/2012/12/radar-uitextview-ignores-minimummaximum-line-height-in-attributed-string/

    Sugiero a usted un reporte de bug así y hablar de mi Radar #12863734.

    • Me encantaría, pero en realidad nunca he sido capaz de iniciar sesión en el sitio web de informe de error…le envié un correo a quejarse, pero nunca recibí una respuesta :-S. Esto es interesante, aunque!
    • Usted debe llamar por teléfono DTS, que puede ayudar a usted allí. Número de teléfono, dependiendo de su país en el sitio web.
    • Por favor, considere la posibilidad de publicar seguimiento si Apple nunca responde. Gracias por esto!
    • Fijo en iOS 7.
    • En iOS 7, tengo una similar, posiblemente relacionados con el problema aquí: stackoverflow.com/questions/19232006/…
  2. 23

    No sé si esto es suficiente para sus fines, pero puedo ajustar el espaciado de línea por el mínimo y máximo de la altura de la línea. Además de utilizar un tipo de letra lo puse en la font propiedad de la vista de texto en lugar de pasarlo como el valor de NSFontAttributeName en el diccionario de atributos. (Tal vez esta parte no está (bien) documentado?)

    Acerca de sus atributos

    lineSpacing se calcula a partir de la parte inferior de la línea en la parte inferior de la parte superior de la línea y que el espacio está limitado a valores de entre minimumLineHeight y miximumLineHeight. Lo que estoy tratando de decir es que tal vez algunos valores en sus atributos son la cancelación de o primordial otros.

    También si sólo necesita ajustar el espacio entre la línea usted probablemente no necesite utilizar paragraphStyle.lineHeightMultiple 🙂

    El código

    Esto funcionó para mí:

    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    paragraphStyle.minimumLineHeight = 35.f;
    paragraphStyle.maximumLineHeight = 35.f;
    
    UIFont *font = [UIFont fontWithName:@"AmericanTypewriter" size:18.f];
    NSString *string = @"This is a test.\nWill I pass?\n日本語のもじもあるEnglish\nEnglish y Español";
    NSDictionary *attributtes = @{
        NSParagraphStyleAttributeName : paragraphStyle,
    };
    self.textView.font = font;
    self.textView.attributedText = [[NSAttributedString alloc] initWithString:string
                                     attributes:attributtes];

    NSParagraphStyle espaciado de línea ignorado

    Notas Adicionales

    No parece ser una situación con el Japonés/Chino y tal vez otros personajes mezclados con caracteres del alfabeto en la misma línea. Esto hará que la línea de un mayor líder a resolver que usted necesita para establecer el mínimo y máximo de la altura de la línea, como yo hice.
    Usted puede ver el problema al renderizar mi ejemplo sin atributos.

    • Esto podría ser suficiente. Voy a mirar en él cuando vuelva a la oficina.
    • Pensé que debería comentar que esto no va a funcionar ya que voy a mezclar fuentes en la misma etiqueta :-S (Cursiva, normal, etc).
    • Este enfoque debe trabajar como siempre y cuando utilice el mismo tamaño de fuente. Cursiva y habituales resultará en la misma altura de la línea.
    • Cuando me puse la fuente a través de NSFontAttributeName, el espaciado de línea comienza a ser ignorado de nuevo..ese es el gran problema (no hay otra manera de mezclar estilos en la misma etiqueta). stackoverflow.com/questions/13298748/…
    • ¿alguna vez encontrar una solución a todo esto, me pregunto?
  3. 8

    Configuración maximumLineHeight parece resolver este problema para mí;

    CGFloat fontSize = 22.f;
    titleLabel.font = [UIFont boldSystemFontOfSize:fontSize];
    NSMutableParagraphStyle *paragraphStyle = [[[NSMutableParagraphStyle  alloc] init] autorelease];
    paragraphStyle.maximumLineHeight = fontSize/2;
    titleLabel.attributedText = [[[NSAttributedString alloc]
                                  initWithString:@"This is a test.\nWill I pass?"
                                  attributes: @{ NSParagraphStyleAttributeName : paragraphStyle,
                                                 NSFontAttributeName : titleLabel.font}]
                                 autorelease];

    NSParagraphStyle espaciado de línea ignorado

  4. 5

    Para esta cadena en particular que se necesita para establecer paragraphSpacing lugar. ¿Qué hay acerca de lineSpacing, creo que simplemente no es compatible aún en iOS.

    • Buen consejo acerca de espaciado de párrafo +1. Sin embargo, estoy buscando para dejar de usar UIWebView…así hasta UITextView puede hacer con CSS línea-altura, no puedo…
    • También, espaciado de línea funciona si puedo quitar el atributo font.
    • ver mi respuesta para conocer el motivo.
  5. 0

    Como nacho4d respondió, en iOS 6 necesita utilizar minimumLineHeight y maximumLineHeight y definir la fuente directamente en UITextView, no en NSAttributedString como la altura de la línea en ese caso será reemplazado.

    Por favor, tenga en cuenta que al definir la fuente en UITextView, el «editable» propiedad de UITextView debe establecer , en otro caso atribuido texto no se vería afectada.

    Estas cuestiones están presentes sólo en la iOS 6. En de iOS 7 y por encima de todo está bien;

  6. 0

    En mi caso, ninguno de los párrafo estilo estaba trabajando. La solución fue establecer atributos de texto en la etiqueta DESPUÉS de hacer cualquier marco de los ajustes en la etiqueta. 🙂

Dejar respuesta

Please enter your comment!
Please enter your name here