ios uilabel

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 en YES , 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 es UIBaselineAdjustment AlignBaselines . Esta propiedad es efectiva solo cuando la propiedad numberOfLines se establece en 1 .

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.


al trabajar en IB, asegúrese de establecer alinear las líneas de base al centro

Nota: el salto de línea NO PUEDE ser ajuste de palabra para que esto funcione, por lo que NO funcionará multilínea (es bueno establecer el salto de línea en Truncar cola)


-(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