¿Cómo funciona el minimumScaleFactor de UILabel?

109

Lo he usado minimumFontSizeantes, pero esa función ahora está en desuso y no entiendo muy bien cómo minimumScaleFactorfunciona.

Quiero que el tamaño máximo de fuente sea 10 y el mínimo 7.

¿Cómo puedo reducir el tamaño al tamaño de fuente 7 con el factor de escala?

UILabel creación:

UILabel *label = [[UILabel alloc] init];
[label setTranslatesAutoresizingMaskIntoConstraints:NO];
label.text =  [labelName uppercaseString];
label.textAlignment = NSTextAlignmentCenter;
label.textColor = [UIColor whiteColor];
label.font = [UIFont fontWithName:HELVETICA_FONT_STYLE_BOLD size:9.5];
label.backgroundColor = [UIColor clearColor];
label.minimumScaleFactor = .1f;

[label addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[label(WIDTH)]"
                                                              options:0
                                                              metrics:@{@"WIDTH" : [NSNumber numberWithFloat:buttonSize.width]}
                                                                views:NSDictionaryOfVariableBindings(label)]];

[contentView addSubview:label];
Padin215
fuente

Respuestas:

204

Necesita configurar el label.adjustsFontSizeToFitWidth = YES;

Scott
fuente
1
Perfecto, esto es lo que me faltaba en mi propio código. Gracias: D
Fogmeister
14
Nota: "La documentación de Apple dice que el minimumScaleFactor solo funciona si numberOfLines está configurado en 1. Usar 0 o cualquier valor mayor que 1 no funcionará". . Gracias SeanK.
samthui7
¡Increíble! Es curioso que si configura minumumScaleFactor en el XIB, no necesita configurar el ajuste adjustsFontSizeToFitWidth, pero lo necesita cuando lo hace en el código.
Politta
104

Además de lo que dicen las otras respuestas, si coloca minSize / defaultSize (division) como minimumScaleFactor, será lo mismo que usar el antiguo minimumFontSize.

Por ejemplo, si desea que el tamaño de fuente mínimo sea 10 usando el tamaño de etiqueta predeterminado, puede hacer lo siguiente:

[label setMinimumScaleFactor:10.0/[UIFont labelFontSize]];

(Reemplace [UIFont labelFontSize]con el tamaño de fuente de su etiqueta si no es el predeterminado).

que sería lo mismo que: [label setMinimumFontSize:10.0];

Jsdodgers
fuente
la división debe ser fundido como CGFloat, de lo contrario no funcionaría
dwery
@dwery Hacer 10 / labelSize puede terminar con un valor entero truncado de 0, pero 10.0 o 10.f funcionan bien, sin conversión explícita.
Kalle
tienes razón, debería funcionar. No recuerdo en qué código no me funcionó, probablemente le faltaba la fo el punto.
Dwery
20

Según la documentación :

Utilice esta propiedad para especificar el multiplicador más pequeño para el tamaño de fuente actual que produce un tamaño de fuente aceptable para usar al mostrar el texto de la etiqueta. Si especifica un valor de 0 para esta propiedad, el tamaño de fuente actual se utiliza como el tamaño de fuente más pequeño.

Entonces, si el tamaño de fuente predeterminado para su etiqueta es 10, póngalo 0.7fcomo minimumScaleFactory debería hacer lo mismo que minimumFontSizehizo.

kovpas
fuente
Eso es lo que pensé también; pero incluso cuando lo pongo como 0.1f, el texto no ajusta el tamaño. Agregaré el código uilabel.
Padin215
¿Qué pasa si eliminas las restricciones y solo encoges el marco de la etiqueta?
kovpas
9
Log139: ¿En qué está configurado su numberOfLines? La documentación de Apple dice que el minimumScaleFactor solo funciona si numberOfLines está configurado en 1. Usar 0 o cualquier valor mayor que 1 no funcionará.
SeanK
1
@SeanK Funcionará incluso si numberOfLines se establece en más de 1 pero NO en 0.
Asadullah Ali
12

Además de otras respuestas, voy a agregar una explicación para principiantes que me ayudó a mí mismo:

¿Cómo calcular a minimumScaleFactor? Divida el tamaño de fuente mínimo de su etiqueta por el tamaño de fuente predeterminado de su etiqueta. Por ejemplo, su tamaño de fuente predeterminado es 25. Su tamaño de fuente mínimo es 10.

10/25 = 0,4

0.4 es su minimumScaleFactorvalor. También vea la respuesta de @ Jsdodgers arriba.

AVog
fuente