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 para ello:
- Establezca una
constraint
altura y anchura para suUILabel
con una constante <= hasta la altura máxima | ancho que desee. - Establecer el
number of lines
a cero. - Establece la altura en el
storyboard
para que quepa solo una línea. - En su código después de configurar el texto de
UILabel
llamadasizeToFit
.
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.
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:
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.