2012-08-08 11 views
23

¿Hay una manera de "top align" un UILabel, es decir hace el palillo de texto al principio de la etiqueta de vista? ¿A diferencia del centro alineado verticalmente, o flotar en el centro de la vista, como es el valor predeterminado?Top alineado UILabel, hace el palillo de texto al principio de la etiqueta de vista -ios

Aquí está una imagen de tres etiquetas, alineado a la izquierda, derecha y centro, y una UITextView que está alineado el centro y la parte superior. El texto del textView se pega a la parte superior, independientemente del tamaño vertical de la vista. ¿Puedo hacer lo mismo con una etiqueta?

enter image description here

+0

He aquí una respuesta que he dado a una pregunta similar: http://stackoverflow.com/questions/1054558/vertically-align-text-within -a-uilabel/1054681 # 1054681 –

+0

Este enlace lo hizo por mí. Gracias Nevan King! Cualquiera que tenga el mismo problema que yo puede ir al enlace de arriba, o ver mi respuesta a continuación, y creo que encontrará la solución. – Mrwolfy

+1

QUICK TRICK ... simplemente sizeToFit – Fattie

Respuesta

8

No hay manera de establecer la alineación vertical de un UILabel por defecto en iOS. En cambio, querrá usar uno de los métodos sizeWithFont proporcionados por NSString. El que use depende de si desea una etiqueta de varias líneas o una sola línea. sizeWithFont:forWidth:lineBreakMode: se puede utilizar para etiquetas de una sola línea, mientras que sizeWithFont:constrainedToSize:lineBreakMode: se puede utilizar para etiquetas de varias líneas. Puede cargar fácilmente el parámetro de fuente con la propiedad font de la etiqueta en cuestión. Puede mirar here para obtener más detalles sobre el uso de estas funciones.

Estos métodos devolverán una estructura CGSize con el tamaño mínimo para su etiqueta basado en el texto en el NSString. Una vez que tenga el tamaño correcto para la etiqueta, puede colocarlo fácilmente en la parte superior de su supervista y parecerá estar alineado al principio.

+2

También puede llamar a sizeToFit en la etiqueta para establecer el marco en su contenido. –

11

que utiliza la respuesta vinculado anteriormente a partir nevan king en un comentario a mi pregunta: Vertically align text to top within a UILabel

El código que he utilizado es aquí:

- (void)setUILabelTextWithVerticalAlignTop:(NSString *)theText { 
    CGSize labelSize = CGSizeMake(250, 300); 
    CGSize theStringSize = [theText sizeWithFont:targetLabel.font constrainedToSize:labelSize lineBreakMode:targetLabel.lineBreakMode]; 
    targetLabel.frame = CGRectMake(targetLabel.frame.origin.x, targetLabel.frame.origin.y, theStringSize.width, theStringSize.height); 
    targetLabel.text = theText; 
} 

//linked to a button that sets the text from a UITextView to the label. 
- (IBAction)setText:(id)sender { 

    [sourceText resignFirstResponder]; 
    [self setUILabelTextWithVerticalAlignTop:sourceText.text]; 
    [targetLabel setNumberOfLines:0]; 
    [targetLabel sizeToFit]; 

} 

Aquí es el proyecto:

owolf.net/uploads/StackOverflow/verticalAlignUILabel.zip

6

He reemplazado UILabel con UITextView, porque en UITextView, el texto se queda en la parte superior.

Sólo una sugerencia, puede ser útil para alguien.

+0

Útil para mí :) ¿Pero cómo es que sea multilínea? Parece que no puedo encontrar una opción que permita esto:/ –

+0

Sí, funciona pero por favor dígame cómo debo cambiar el tamaño de la fuente. Tengo mi TextView en una celda personalizada. – mars

24

Hay una solución para ello:

  1. Establecer una altura & ancho constraint a su UILabel con una constante = < a la altura máxima | ancho que desee.
  2. Establezca number of lines en cero.
  3. Establezca la altura en storyboard para ajustarse a una sola línea.
  4. En su código después de ajustar el texto de UILabel llamada sizeToFit.

Esto haría que su UILabel para cambiar el tamaño dentro de los límites de la anchura máxima & altura que desee y el texto será siempre superior alineado.

+0

Establecer también la restricción para la altura en> = cualquiera que sea la altura original permitirá que la etiqueta crezca y se mantenga arriba a la izquierda con el texto en el contenedor. – TomG103

+0

Se metió en esto con un 'UICollectionViewCell'. El tamaño regular ToFit no funcionaba. Su sugerencia de autodiseño funcionó en esta instancia. ¡Gracias! –

+1

Gracias por su publicación, funciona como un encanto en iOS 11 para aquellos que se preguntan :) –

0

Haz una subclase de UILabel

.h archivo

@property (nonatomic, assign) UIControlContentVerticalAlignment verticalAlignment; 

archivo .m

- (void) drawTextInRect:(CGRect)rect 
{ 
    if(_verticalAlignment == UIControlContentVerticalAlignmentTop || _verticalAlignment == UIControlContentVerticalAlignmentBottom)  
    { 
     // If one line, we can just use the lineHeight, faster than querying sizeThatFits 
     const CGFloat height = floorf(((self.numberOfLines == 1) ? ceilf(self.font.lineHeight) : [self sizeThatFits:self.frame.size].height)); 
      rect.origin.y = floorf(((self.frame.size.height - height)/2.0f) * ((_verticalAlignment == UIControlContentVerticalAlignmentTop) ? -1.0f : 1.0f)); 
    } 
    [super drawTextInRect:rect]; 
} 


- (void) setVerticalAlignment:(UIControlContentVerticalAlignment)newVerticalAlignment 
{ 
    _verticalAlignment = newVerticalAlignment; 
    [self setNeedsDisplay]; 
} 

que utiliza este para la alineación vertical.

1

Hay una solución fácil para los casos donde la altura de una etiqueta no tiene que ser constante: ponga su Label en un Stack View. Asegúrese de agregar constantes iniciales y finales al Stack View. Aquí está una captura de pantalla de cómo hacerlo en el guión gráfico:

enter image description here

Cuestiones relacionadas