ios - Centro verticalmente en UILabel con autoenlace
(5)
En mi experiencia, solo puede establecer la propiedad -[UILabel baselineAdjustment]
en UIBaselineAdjustmentAlignCenters
para lograr el efecto que está describiendo.
De la docs :
ajuste de línea de base
Controla cómo se ajustan las líneas de base de texto cuando el texto debe reducirse para encajar en la etiqueta.
@property(nonatomic) UIBaselineAdjustment baselineAdjustment
Discusión
Si la propiedad
adjustsFontSizeToFitWidth
se establece enYES
, esta propiedad controla el comportamiento de las líneas de base de texto en situaciones donde se requiere un ajuste del tamaño de fuente. El valor predeterminado de esta propiedad esUIBaselineAdjustment
AlignBaselines
. Esta propiedad es efectiva solo cuando la propiedadnumberOfLines
se establece en1
.
y
UIBaselineAdjustmentAlignCenters
Ajuste el texto basado en el centro de su cuadro delimitador.
EDITAR: agregar un controlador de vista completo que demuestra esto:
@interface TSViewController : UIViewController
@end
@implementation TSViewController
- (void) addLabelWithFrame: (CGRect) f baselineAdjustment: (UIBaselineAdjustment) bla
{
UILabel* label = [[UILabel alloc] initWithFrame: f];
label.baselineAdjustment = bla;
label.adjustsFontSizeToFitWidth = YES;
label.font = [UIFont fontWithName: @"Courier" size: 200];
label.text = @"00";
label.textAlignment = NSTextAlignmentCenter;
label.backgroundColor = [UIColor lightGrayColor];
label.userInteractionEnabled = YES;
[self.view addSubview: label];
UIView* centerline = [[UIView alloc] initWithFrame: CGRectMake(f.origin.x, f.origin.y+(f.size.height/2.0), f.size.width, 1)];
centerline.backgroundColor = [UIColor redColor];
[self.view addSubview: centerline];
UITapGestureRecognizer* tgr = [[UITapGestureRecognizer alloc] initWithTarget: self action: @selector(onTap:)];
[label addGestureRecognizer: tgr];
}
- (void) viewDidLoad
{
[super viewDidLoad];
[self addLabelWithFrame: CGRectMake(0, 0, 320, 200)
baselineAdjustment: UIBaselineAdjustmentAlignCenters];
[self addLabelWithFrame: CGRectMake(0, 220, 320, 200)
baselineAdjustment: UIBaselineAdjustmentAlignBaselines];
}
- (void) onTap: (UITapGestureRecognizer*) tgr
{
UILabel* label = (UILabel*)tgr.view;
NSString* t = [label.text stringByAppendingString: @":00"];
label.text = t;
}
@end
Esto es un poco diferente de todas las demás preguntas de "Cómo centrar el texto en una UILabel
" aquí ...
Tengo una UILabel
con algo de texto, quiero centrar el texto verticalmente en la UILabel
. ¿Cuál es el problema, ¿verdad? Ese es el defecto. El problema viene porque mi texto es dinámico y tengo la función de autocontrol activado. A medida que el texto crece, el tamaño de la fuente se reduce. Obtienes este comportamiento.
Tenga en cuenta que la línea de base de la fuente no se ha movido, quiero que se mueva para que los números se UILabel''s
verticalmente en el marco de la UILabel''s
.
Fácil, ¿verdad? Acabo de recordar el centro original del marco en viewDidLoad
self.workoutTimeCenter = _workoutTimeLabel.center;
y luego llamo a sizeToFit
después de cambiar el texto, ¿verdad?
[_workoutTimeLabel sizeToFit];
_workoutTimeLabel.center = _workoutTimeCenter;
Bueno, sizeToFit
hizo, supongo, exactamente lo que debía hacer, cambiar el tamaño del marco para que el texto se ajuste sin encogerse.
¿Cómo puedo centrar verticalmente el texto en una UILabel
respetando las líneas de base y el autoenlace? (Tenga en cuenta que una solución iOS5 y posterior está bien, e incluso puedo lidiar con una solución iOS6 y posterior).
Tratar
yourLabel.textAlignment = UITextAlignmentCenter;
Trate de implementar esta lógica:
-(void)adjustLabel1Text1:(NSString *)text1
{
UILabel *lbl_first = [UIFont fontWithName:@"Helvetica" size:12];
text1 = [text1 stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
float hedingLblHeight = [self calculateHeightOfTextFromWidth:text1 : [UIFont fontWithName:@"Helvetica" size:12] :118 :UILineBreakModeWordWrap];
lbl_first.text=text1;
[lbl_first setFrame:CGRectMake(lbl_first.frame.origin.x, lbl_first.frame.origin.y, 118, hedingLblHeight)];
lbl_first.lineBreakMode = UILineBreakModeWordWrap;
lbl_first.numberOfLines = 0;
[lbl_first sizeToFit];
//////////Adjust the lable or any UIControl below this label accordingly.
float endResultHeight=[self calculateHeightOfTextFromWidth:text2 : [UIFont fontWithName:@"Helvetica" size:15] :299 :UILineBreakModeWordWrap];
if(hedingLblHeight>secondImgTitleHeight)
{
[lbl_endResult setFrame:CGRectMake(lbl_endResult.frame.origin.x, lbl_first.frame.origin.y+lbl_first.frame.size.height+5, 299, endResultHeight)];
}
else
{
[lbl_endResult setFrame:CGRectMake(lbl_endResult.frame.origin.x, lbl_first.frame.origin.y+lbl_first.frame.size.height+5, 299, endResultHeight)];
}
lbl_endResult.lineBreakMode=UILineBreakModeWordWrap;
lbl_endResult.numberOfLines = 0;
[lbl_endResult sizeToFit];
}
-(float) calculateHeightOfTextFromWidth:(NSString*)text : (UIFont*) withFont:(float)width :(UILineBreakMode)lineBreakMode
{
CGSize suggestedSize = [text sizeWithFont:withFont constrainedToSize:CGSizeMake(width, FLT_MAX) lineBreakMode:lineBreakMode];
return suggestedSize.height;
}
Me ha ayudado mucho. Espero que te funcione.
-(void)fitVerticallyToLabel:(UILabel *)lbl
{
CGFloat fontSize = lbl.frame.size.width / lbl.text.length;
[lbl setFont:[UIFont fontWithName:@"Helvetica-Bold" size:fontSize]];
CGRect rect = lbl.frame;
rect.origin.y += rect.size.height - fontSize;
rect.size.height = fontSize;
[lbl setFrame:rect];
}
Modo de uso: llame a este método después de configurar el texto a su etiqueta.
label.text = @"text";
[self fitVerticallyToLabel:label];
Nota: He tomado UILabel de xib. También puede tomarlo programáticamente en ese caso, tendrá que establecer su alineación de texto NSTextAlignMentCenter