2012-09-08 24 views
9

En iOS 5.UILabel y numberOfLines y sizeToFit:

que tienen un elemento UILabel que se coloca inicialmente en una punta. Quiero que la ubicación x permanezca fija. Quiero que tome 1 línea o 2 líneas. Si hay más de dos líneas, debe usar la configuración de salto de línea para mostrar las elipsis.

utilizo numberOfLines propiedad y -sizeToFit

Si fijo la propiedad del UILabel numberOfLines a 0, se va a ver correctamente que de algún texto, no hay suficiente espacio y se ajustará a una segunda línea después de llamar -sizeToFit pero en el raro caso de que la línea sea lo suficientemente larga como para estirar a 3 líneas, obtengo tres líneas, que no quiero. Si configuro la propiedad numberOfLines en 2, en realidad estira todo en una línea y alarga mi marco inicial en la punta para que sea mucho más ancho.

CGRect titleFrame = [[self titleLabel] frame]; 
[[self titleLabel] setNumberOfLines:0]; 
[[self titleLabel] setText:newProductTitleText]; 
[[self titleLabel] sizeToFit]; 
CGRect newTitleFrame = [[self titleLabel] frame]; 

El CGRect está allí para que yo pueda calcular cosas después del hecho. Por lo tanto, establecer numberOfLines en 0 funciona, y no cambiará el original.x original en el marco, y dividirá el texto largo en varias líneas, pero no lo restringirá a 2 líneas. Configuración numberOfLines propiedad a 2, que, cuando leí la documentación de Apple

Esta propiedad controla el número máximo de líneas hay que utilizar con el fin de ajustar el texto de la etiqueta en su rectángulo delimitador. El valor predeterminado para esta propiedad es 1. Para eliminar cualquier límite máximo y usar tantas líneas como sea necesario, establezca el valor de esta propiedad en 0.

Parece que debería ser capaz de establecer esto en dos y aún haz que funcione Yo esperaría sizeToFit de ampliar en un positivo X y dirección Y cuando se expande para adaptarse a todo el texto, sino que se expande en una dirección X negativa cuando numberOfLines se establece en distinto de 0.

ETA: los puntales "de tamaño automático" son establecer en la parte superior e izquierda para arreglarlo en un min x, y.

Gracias por cualquier idea.

+0

Creo que este hilo puede ayudar a http://stackoverflow.com/questions/5041874/uilabels-sizetofit-sizethatfits-ignore-the-numberoflines-property/13786846 # 13786846 –

+2

Esta es una pregunta antigua, y probablemente no relevante para iOS actual, pero no veo cómo es un duplicado. Leí la pregunta que se afirma que es un duplicado y es una pregunta diferente.Éste pregunta acerca de la X negativa establecida por '-sizeToFit' y no sobre la alineación vertical del texto en un UILabel. – chadbag

Respuesta

0

que tenía un problema similar donde -[UILabel sizeToFit] no estaba respetando el ancho máximo puse cuando numberOfLines se ajustó a 2. Aquí es cómo se resolvió el problema:

CGFloat titleMaxWidth = 200; 
    CGFloat titleMinHeight = 30; 
    CGFloat titleMaxHeight = 40; 
    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 5, titleMaxWidth, titleMaxHeight)]; // alternatively, you could do this in a nib 
    titleLabel.numberOfLines = 0; 
    titleLabel.text = @"The title label will be sized appropriately with this technique."; 
    titleLabel.font = [UIFont boldSystemFontOfSize:16]; 
    [titleLabel sizeToFit]; 
    titleLabel.numberOfLines = 2; 
    if (titleLabel.height > titleMaxHeight) 
    { 
     titleLabel.height = titleMaxHeight; 
    } 
    else if (titleLabel.height < titleMinHeight) 
    { 
     titleLabel.height = titleMinHeight; 
    } 

Como se puede ver, yo también quería un mínimo La altura para mi etiqueta, como -sizeToFit, a menudo hace que la etiqueta sea muy pequeña, pero puede ignorar ese código si no le importa una altura mínima. El "número mágico" de 40 para titleMaxHeight proviene de la experimentación y de descubrir que una etiqueta de 2 líneas con esta fuente solo necesita 40px. En este código, -sizeToFit se usa principalmente para mantener el texto dentro del ancho y determinar si la altura inicial de 40 se puede reducir cuando tenemos una pequeña cadena de texto.

0

que utiliza la propiedad UIFont lineHeight:

CGFloat labelHeight = label.font.lineHeight*label.numberOfLines;