vertical top left align objective-c ios uilabel

objective c - top - Ajustar texto en UILabel



top align label swift (7)

Aqui esta mi codigo

UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(10, 50, 300, 50)]; label.textAlignment = UITextAlignmentCenter; label.backgroundColor = [UIColor clearColor]; label.textColor = [UIColor whiteColor]; label.textColor.font = [UIFont fontWithName:@"Verdana" size:30]; label.text = @"A very long string"; etc...

El problema es que la fuente es grande y no cabe en la etiqueta. Simplemente muestra "A muy"

Qué hacer para que se muestre todo el texto. Yo he tratado

label.lineBreakMode = UILineBreakModeWordWrap; label.numberOfLines = 0;

Pero no funciona para mí. Quiero hacer eso programáticamente.

//EDITAR

CGRect frame = CGRectMake(10, 50, 300, 50); NSString *labelString = @"Players."; UILabel *howManyUsersLabel = [[UILabel alloc]initWithFrame:frame]; howManyUsersLabel.textAlignment = UITextAlignmentCenter; howManyUsersLabel.backgroundColor = [UIColor clearColor]; howManyUsersLabel.textColor = [UIColor whiteColor]; howManyUsersLabel.adjustsFontSizeToFitWidth = NO; howManyUsersLabel.numberOfLines = 0; CGFloat fontSize = 30; while (fontSize > 0.0) { CGSize size = [labelString sizeWithFont:[UIFont fontWithName:@"Verdana" size:fontSize] constrainedToSize:CGSizeMake(frame.size.width, 10000) lineBreakMode:UILineBreakModeWordWrap]; if (size.height <= frame.size.height) break; fontSize -= 1.0; NSLog(@"test"); } howManyUsersLabel.font = [UIFont fontWithName:@"Verdana" size:fontSize];


Creo que solo necesitas añadir esto:

label.adjustsFontSizeToFitWidth = YES; label.minimumFontSize = 0;

Luego, el texto se redimensionará automáticamente para ajustarse a la etiqueta.

Sin embargo, tenga en cuenta que esto solo funcionará realmente si label.numberOfLines = 1, de modo que el texto esté en una sola línea.

Si necesita que el texto se ajuste en varias líneas pero aún así se reduzca para que quepa, la solución es más compleja. Para hacer esto, necesita calcular el tamaño renderizado del texto y luego reducirlo en un bucle, de la siguiente manera:

NSString *theText = @"A long string"; CGRect labelRect = CGRectMake(10, 50, 300, 50); label.adjustsFontSizeToFitWidth = NO; label.numberOfLines = 0; CGFloat fontSize = 30; while (fontSize > 0.0) { CGSize size = [theText sizeWithFont:[UIFont fontWithName:@"Verdana" size:fontSize] constrainedToSize:CGSizeMake(labelRect.size.width, 10000) lineBreakMode:UILineBreakModeWordWrap]; if (size.height <= labelRect.size.height) break; fontSize -= 1.0; } //set font size label.font = [UIFont fontWithName:@"Verdana" size:fontSize];

Básicamente, esto solo reduce el tamaño de la fuente hasta que se ajusta a la etiqueta.

ACTUALIZAR:

A partir de iOS7, el texto multilínea también se reducirá automáticamente cuando se adjustsFontSizeToFitWidth = YES , por lo que la segunda parte de esta respuesta ya no es necesaria (a menos que aún sea compatible con iOS 6 y versiones anteriores).


Finalmente conseguí una solución para el problema de la asignación de texto en idioma árabe, simplemente haga esto:

label.text = @"هذا هو نص طويل جدا"; label.textAlignment = NSTextAlignmentNatural; CGSize size = [labels sizeThatFits:CGSizeMake(_lblAddress.width, CGFLOAT_MAX)]; label.height = size.height;


Interface Builder te permite hacer esto ahora.

  1. En UILabel, en Autoshrink, seleccione "Tamaño de fuente mínimo" en lugar de "Tamaño de fuente fijo".
  2. Establezca que el Tamaño de fuente mínimo sea ​​algo razonable, como 8.
  3. También puede marcar la marca de verificación "Ajustar el espacio entre letras" .

Alternativamente puedes hacerlo programáticamente:

label.adjustsFontSizeToFitWidth = YES;


Todo parece estar roto en iOS 8 (probablemente iOS 7 también).

Solución:

-(UIFont*)fontForString:(NSString*)string toFitInRect:(CGRect)rect seedFont:(UIFont*)seedFont { UIFont* returnFont = seedFont; CGSize stringSize = [string sizeWithAttributes:@{NSFontAttributeName : seedFont}]; while(stringSize.width > rect.size.width){ returnFont = [UIFont systemFontOfSize:returnFont.pointSize -1]; stringSize = [string sizeWithAttributes:@{NSFontAttributeName : returnFont}]; } return returnFont; }

Asegúrese de no probar y usar label.adjustsFontSizeToFitWidth = YES contrario, se confundirá realmente y el nuevo tamaño no funcionará correctamente.


Swift con iOS 9

let maxFontSize: CGFloat = 40 let minFontSize: CGFloat = 10 label.font = UIFont(name: label.font.fontName, size: maxFontSize)! label.adjustsFontSizeToFitWidth = true label.minimumScaleFactor = minFontSize/maxFontSize

Esto no aumenta el tamaño de fuente para llenar la etiqueta. Simplemente comienza con el tamaño máximo y disminuye según sea necesario hasta el mínimo. Esto también se supone que el número de líneas es 1.


[UILabel sizeToFit];

Funcionará para su problema.


CGRect titleRect = CGRectMake(10, 50, 300, 50); UILabel *textTitleView = [[UILabel alloc] initWithFrame:titleRect]; textTitleView.numberOfLines = 3 //for multiple lines; textTitleView.lineBreakMode = UILineBreakModeWordWrap; [UIFont fontWithName:@"Verdana" size:30]; textTitleView.text = @"your text";