Comment fonctionne le minimumScaleFactor d'un UILabel?

109

J'ai utilisé minimumFontSizeavant mais cette fonction est maintenant obsolète et je ne comprends pas très bien comment minimumScaleFactorfonctionne.

Je veux que la taille de police maximale soit 10 et la minimum à 7.

Comment puis-je redimensionner à la taille de police 7 avec le facteur d'échelle?

UILabel création:

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
la source

Réponses:

204

Vous devez définir le label.adjustsFontSizeToFitWidth = YES;

Scott
la source
1
Parfait, c'est ce qui me manquait dans mon propre code. Merci: D
Fogmeister
14
Remarque: «La documentation d'Apple indique que le minimumScaleFactor ne fonctionne que si numberOfLines est défini sur 1. L'utilisation de 0 ou d'une valeur supérieure à 1 ne fonctionnera pas.» . Merci SeanK.
samthui7
Impressionnant! C'est drôle que si vous définissez minumumScaleFactor dans le XIB, vous n'avez pas besoin de définir le ajustsFontSizeToFitWidth, mais vous en avez besoin lorsque vous le faites dans le code.
Politta
104

En plus de ce que disent les autres réponses, si vous mettez minSize / defaultSize (division) comme le minimumScaleFactor, ce sera la même chose que d'utiliser l'ancien minimumFontSize.

Par exemple, si vous souhaitez que la taille de police minimale soit de 10 en utilisant la taille d'étiquette par défaut, vous pouvez faire:

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

(Remplacez [UIFont labelFontSize]par la taille de police de votre étiquette si ce n'est pas la valeur par défaut).

ce qui serait le même que: [label setMinimumFontSize:10.0];

Jsdodgers
la source
la division devrait être lancée comme CGFloat, sinon cela ne fonctionnerait pas
dwery
@dwery Faire 10 / labelSize peut se retrouver avec une valeur entière tronquée de 0 mais 10,0 ou 10.f fonctionne correctement, sans transtypage explicite.
Kalle
tu as raison, ça devrait marcher. Je ne me souviens pas dans quel code cela n'a pas fonctionné pour moi, il manquait probablement le f ou le point.
Dwery
20

Selon la documentation :

Utilisez cette propriété pour spécifier le plus petit multiplicateur de la taille de police actuelle qui donne une taille de police acceptable à utiliser lors de l'affichage du texte de l'étiquette. Si vous spécifiez une valeur de 0 pour cette propriété, la taille de police actuelle est utilisée comme la plus petite taille de police.

Donc, si la taille de police par défaut pour votre étiquette est 10, vous mettez en 0.7ftant que minimumScaleFactoret il devrait faire la même chose que minimumFontSize.

kovpas
la source
C'est ce que j'ai pensé aussi; mais même quand je le mets comme 0,1f, le texte n'ajuste pas la taille. je vais ajouter le code uilabel.
Padin215
Que faire si vous supprimez les contraintes et réduisez simplement le cadre de l'étiquette?
kovpas
9
Log139: Quel est votre paramètre numberOfLines? La documentation d'Apple indique que minimumScaleFactor ne fonctionne que si numberOfLines est défini sur 1. L'utilisation de 0 ou d'une valeur supérieure à 1 ne fonctionnera pas.
SeanK
1
@SeanK Cela fonctionnera même si numberOfLines est défini sur plus de 1 mais PAS sur 0.
Asadullah Ali
12

En plus d'autres réponses, je vais ajouter une explication adaptée aux débutants qui m'a aidé:

Comment calculer un minimumScaleFactor? Divisez la taille de police minimale de votre étiquette par la taille de police par défaut de votre étiquette. Par exemple, votre taille de police par défaut est 25. Votre taille de police minimale est 10.

10/25 = 0,4

0.4 est votre minimumScaleFactorvaleur. Voir également la réponse de @ Jsdodgers ci-dessus.

AVog
la source