iphone - UILabel no es texto de contracción automática para ajustarse al tamaño de la etiqueta
objective-c ios (15)
Así es como Autoshrink
trabajo de UILabel Autoshrink
(especialmente para la altura del ajuste de la fuente de la etiqueta en el dispositivo 4s de 6s Plus Storyboard) en iOS 9.2, Xcode 7.2 ...
- El número de líneas es 0
- Saltos de línea: Clip
- Autoshrink: escala de fuente mínima 0.25
Tengo este extraño problema, y estoy lidiando con él por más de 8 horas. Dependiendo de la situación, tengo que calcular el tamaño de UILabels
forma dinámica,
p.ej
mi UIViewController
recibe un evento y yo cambio el tamaño de UILabels
. de mayor a menor El tamaño de mi UILabel
hace más pequeño y obtengo el tamaño correcto necesario, pero el texto en mi UILabel
mantiene igual, el mismo tamaño de fuente, etc. Necesito que la fuente se haga más pequeña, para que todo el texto encaje en UILabel
. Entonces, la pregunta es cómo hacer que el texto se ajuste a mi etiqueta con autoshrinking
o algo así.
En mi xib
, UILabels
autoshrink
está marcado, también el número de líneas está configurado en 0, y también mi cadena tiene nuevos símbolos de línea (/ n), y he seleccionado wordwrap
a wordwrap
. ¿Tal vez alguien estaba en la misma situación que yo ahora y podría ayudarme? Realmente lo apreciaría.
¡Gracias por adelantado!
EDITAR: el tamaño de fuente mínimo de UILabel
está establecido en 10
Bueno, al final no encontré mi respuesta. Y creo que el autoshrink no funciona para múltiples líneas. Terminé usando la sugerencia en este enlace: autoshrink en un UILabel con múltiples líneas
La solución es calcular la altura del texto a un ancho determinado y, si el texto es más grande, reducir el tamaño de la fuente y luego volver a hacer lo mismo hasta que la altura sea igual o menor que el tamaño que se necesita.
No entiendo por qué esto debería ser tan difícil de implementar. Si me falta algo, todos pueden corregirme :)
Creo que puedes escribir el código siguiente después de alloc init Label
UILabel* lbl = [[UILabel alloc]initWithFrame:CGRectMake(0, 10, 280, 50)];
lbl.text = @"vbdsbfdshfisdhfidshufidhsufhdsf dhdsfhdksbf hfsdh fksdfidsf sdfhsd fhdsf sdhfh sdifsdkf ksdhfkds fhdsf dsfkdsfkjdhsfkjdhskfjhsdk fdhsf ";
[lbl setMinimumFontSize:8.0];
[lbl setNumberOfLines:0];
[lbl setFont:[UIFont systemFontOfSize:10.0]];
lbl.lineBreakMode = UILineBreakModeWordWrap;
lbl.backgroundColor = [UIColor redColor];
[lbl sizeToFit];
[self.view addSubview:lbl];
Está funcionando bien conmigo Úsalo
Dos años después, y este problema todavía está por aquí ...
En iOS 8 / XCode 6.1, a veces encontraba que mi UILabel
(creado en una UITableViewCell
, con AutoLayout activado y restricciones flexibles por lo que tenía mucho espacio) no se redimensionaría para ajustarse a la cadena de texto.
La solución, como en años anteriores, fue establecer el texto, y luego llamar a sizeToFit
.
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
. . .
cell.lblCreatedAt.text = [note getCreatedDateAsString];
[cell.lblCreatedAt sizeToFit];
}
(Suspiro.)
En Swift 3 (programáticamente) tuve que hacer esto:
let lbl = UILabel()
lbl.numberOfLines = 0
lbl.lineBreakMode = .byClipping
lbl.adjustsFontSizeToFitWidth = true
lbl.minimumScaleFactor = 0.5
lbl.font = UIFont.systemFont(ofSize: 15)
En Swift 4 (programáticamente):
let label = UILabel(frame: CGRect(x: 0, y: 0, width: 200.0, height: 200.0))
label.adjustsFontSizeToFitWidth = true
label.numberOfLines = 0
label.text = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry''s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum."
view.addSubview(label)
En caso de que aún esté buscando una solución mejor, creo que esto es lo que quiere:
Un valor booleano que indica si el tamaño de la fuente debe reducirse para ajustar la cadena de título en el rectángulo delimitador de la etiqueta. (Esta propiedad es efectiva solo cuando la propiedad numberOfLines se establece en 1.)
@property(nonatomic) BOOL adjustsFontSizeToFitWidth
Un valor booleano que indica si el espaciado entre letras debe ajustarse para ajustarse a la cadena dentro del rectángulo de límites de la etiqueta.
@property(nonatomic) BOOL adjustsLetterSpacingToFitWidth
En iOS 9 solo tenía que:
- Agregue restricciones desde la izquierda y la derecha de la etiqueta a la supervista.
- Establezca el modo de salto de línea para recortar en IB.
- Establezca el número de líneas en 1 en IB.
Alguien recomendó establecer el número de líneas en 0, pero para mí esto simplemente hizo que la etiqueta fuera a varias líneas ...
Esto es para Swift 3 con Xcode 8.2.1 (8C1002)
La mejor solución que he encontrado es establecer un ancho fijo en su Storyboard o IB en la etiqueta. Establezca sus restricciones con limitar a los márgenes. En su viewDidLoad agregue las siguientes líneas de código:
override func viewDidLoad() {
super.viewDidLoad()
label.numberOfLines = 1
label.adjustsFontSizeToFitWidth = true
label.minimumScaleFactor = 0.5
}
Funcionó como un amuleto y no se desborda en una nueva línea y reduce el texto para que se ajuste al ancho de la etiqueta sin ningún problema extraño y funciona en Swift 3.
He aquí cómo hacerlo.Suponga que el siguiente mensaje Label es la etiqueta que desea que tenga el efecto deseado. Ahora, intente con esta simple línea de códigos:
//SET THE WIDTH CONSTRAINTS FOR LABEL.
CGFloat constrainedWidth = 240.0f;//YOU CAN PUT YOUR DESIRED ONE,THE MAXIMUM WIDTH OF YOUR LABEL.
//CALCULATE THE SPACE FOR THE TEXT SPECIFIED.
CGSize sizeOfText=[yourText sizeWithFont:yourFont constrainedToSize:CGSizeMake(constrainedWidth, CGFLOAT_MAX) lineBreakMode:UILineBreakModeWordWrap];
UILabel *messageLabel=[[UILabel alloc] initWithFrame:CGRectMake(20,20,constrainedWidth,sizeOfText.height)];
messageLabel.text=yourText;
messageLabel.numberOfLines=0;//JUST TO SUPPORT MULTILINING.
Llegando tarde a la fiesta, pero como tenía el requerimiento adicional de tener una palabra por línea, esta única adición me sirvió:
label.numberOfLines = [labelString componentsSeparatedByString:@" "].count;
Apple Docs dice:
Normalmente, el texto de la etiqueta se dibuja con la fuente que especifique en la propiedad de la fuente. Sin embargo, si esta propiedad se establece en SÍ y el texto en la propiedad de texto excede el rectángulo delimitador de la etiqueta, el receptor comienza a reducir el tamaño de la fuente hasta que la cadena encaje o se alcance el tamaño mínimo de fuente. En iOS 6 y versiones anteriores, esta propiedad es efectiva solo cuando la propiedad numberOfLines está configurada en 1.
Pero esto es una mentira. Una mentira que te digo! Es cierto para todas las versiones de iOS. Específicamente, esto es cierto cuando se utiliza un UILabel
dentro de un UICollectionViewCell
para el cual el tamaño está determinado por restricciones ajustadas dinámicamente en el tiempo de ejecución a través del diseño personalizado (por ejemplo, self.menuCollectionViewLayout.itemSize = size
).
Por lo tanto, cuando se utiliza junto con adjustsFontSizeToFitWidth
y minimumScaleFactor
, como se menciona en las respuestas anteriores, establecer programáticamente numberOfLines
basado en el conteo de palabras resolvió el problema de autoshrink. Hacer algo similar basado en el recuento de palabras o incluso el recuento de caracteres podría producir una solución "lo suficientemente cerca".
Puedes escribir como
UILabel *reviews = [[UILabel alloc]initWithFrame:CGRectMake(14, 13,270,30)];//Set frame
reviews.numberOfLines=0;
reviews.textAlignment = UITextAlignmentLeft;
reviews.font = [UIFont fontWithName:@"Arial Rounded MT Bold" size:12];
reviews.textColor=[UIColor colorWithRed:0.0/255.0 green:0.0/255.0 blue:0.0/255.0 alpha:0.8];
reviews.backgroundColor=[UIColor clearColor];
Puedes calcular la cantidad de líneas como esa
CGSize maxlblSize = CGSizeMake(270,9999);
CGSize totalSize = [reviews.text sizeWithFont:reviews.font
constrainedToSize:maxlblSize lineBreakMode:reviews.lineBreakMode];
CGRect newFrame =reviews.frame;
newFrame.size.height = totalSize.height;
reviews.frame = newFrame;
CGFloat reviewlblheight = totalSize.height;
int lines=reviewlblheight/12;//12 is the font size of label
UILabel *lbl=[[UILabel alloc]init];
lbl.frame=CGRectMake(140,220 , 100, 25);//set frame as your requirement
lbl.font=[UIFont fontWithName:@"Arial" size:20];
[lbl setAutoresizingMask:UIViewContentModeScaleAspectFill];
[lbl setLineBreakMode:UILineBreakModeClip];
lbl.adjustsFontSizeToFitWidth=YES;//This is main for shrinking font
lbl.text=@"HelloHelloHello";
Espero que esto te ayude :-) esperando tu respuesta
no funciona si numberOfLines > 1
Lo que hice hizo una condición como esta-
if(lblRecLocation.text.length > 100)
lblRecLocation.font = [UIFont fontWithName:@"app_font_name" size:10];
también mi solución es la etiqueta booleana.adjustsFontSizeToFitWidth = YES; PERO. Debe en la interfaz Builder el ajuste de Envoltorio de palabras a " CLIP ". Luego, autoenlace las etiquetas. Esto es muy importante.
minimumFontSize
está en desuso en iOS 6.
Por lo tanto, use minimumScaleFactor
lugar de minmimumFontSize
.
lbl.adjustsFontSizeToFitWidth=YES;
lbl.minimumScaleFactor=0.5;