iphone objective-c ios xcode
owolf.net/uploads//verticalAlignUILabel.zip

iphone - UILabel alineado arriba, hacer que el texto se pegue a la parte superior de la vista de etiqueta-ios



objective-c xcode (7)

¿Hay alguna forma de "alinear por encima" una UILabel, es decir, que el texto se mantenga en la parte superior de la vista de etiqueta? A diferencia del centro alineado verticalmente, o flotar en el centro de la vista, ¿cuál es el valor predeterminado?

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


Hacer una subclase de UILabel

archivo .h

@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]; }

Utilicé esto para la alineación vertical.


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


Hay una solución para ello:

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

Esto haría que su UILabel de tamaño dentro de los límites del ancho y la altura máximos que desea y el texto siempre estará alineado por la parte superior.


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

Solo una sugerencia, puede ser útil para alguien.


Lo que hice en mi aplicación fue establecer la propiedad de línea de UILabel en 0, así como crear una restricción inferior de UILabel y asegurarme de que esté configurada en> = 0 como se muestra en la imagen a continuación.


Utilicé la respuesta vinculada anteriormente de nevan king en un comentario a mi pregunta: alinear verticalmente el texto con la parte superior dentro de una UILabel

El código que utilicé está 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í está el proyecto:

owolf.net/uploads//verticalAlignUILabel.zip


No hay forma de establecer la alineación vertical de una UILabel por defecto en iOS. En su lugar, deseará usar uno de los métodos sizeWithFont proporcionados por NSString . La opción que utilice dependerá de si desea una etiqueta de varias líneas o de una sola línea. sizeWithFont:forWidth:lineBreakMode: se puede utilizar para etiquetas de una sola línea, mientras que sizeWithFont:constrainedToSize:lineBreakMode: se puede usar para etiquetas de varias líneas. Puede cargar fácilmente el parámetro de fuente con la propiedad de font de la etiqueta en cuestión. Puede buscar here 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 la NSString . Una vez que tenga el tamaño correcto para la etiqueta, puede colocarlo fácilmente en la parte superior de la vista de supervisión y parecerá estar alineado por la parte superior.