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
constraintaltura y anchura para suUILabelcon una constante <= hasta la altura máxima | ancho que desee. - Establecer el
number of linesa cero. - Establece la altura en el
storyboardpara que quepa solo una línea. - En su código después de configurar el texto de
UILabelllamadasizeToFit.
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.