Wie funktioniert der MinimumScaleFactor eines UILabels?

109

Ich habe es schon einmal benutzt, minimumFontSizeaber diese Funktion ist jetzt veraltet und ich verstehe nicht ganz, wie es minimumScaleFactorfunktioniert.

Ich möchte, dass die maximale Schriftgröße 10 und die minimale 7 beträgt.

Wie kann ich mit dem Skalierungsfaktor die Größenänderung auf Schriftgröße 7 erreichen?

UILabel Schaffung:

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
quelle

Antworten:

204

Sie müssen die einstellen label.adjustsFontSizeToFitWidth = YES;

Scott
quelle
1
Perfekt, das hat mir in meinem eigenen Code gefehlt. Danke: D
Fogmeister
14
Hinweis: "Laut Apple-Dokumentation funktioniert der MinimumScaleFactor nur, wenn numberOfLines auf 1 gesetzt ist. Die Verwendung von 0 oder etwas größer als 1 funktioniert nicht." . Danke SeanK.
Samthui7
Genial! Komisch, dass Sie, wenn Sie minumumScaleFactor in der XIB festlegen, nicht die Einstellung "adjustsFontSizeToFitWidth" festlegen müssen, sondern dies, wenn Sie dies im Code tun.
Politta
104

Zusätzlich zu dem, was die anderen Antworten sagen, wenn Sie minSize / defaultSize (Division) als das setzen minimumScaleFactor, ist es dasselbe wie das Verwenden der alten minimumFontSize.

Wenn Sie beispielsweise möchten, dass die Mindestschriftgröße 10 bei Verwendung der Standardetikettengröße beträgt, können Sie Folgendes tun:

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

(Ersetzen [UIFont labelFontSize]Sie diese durch die Schriftgröße Ihres Etiketts, wenn dies nicht die Standardeinstellung ist.)

das wäre das gleiche wie: [label setMinimumFontSize:10.0];

Jsdodgers
quelle
Die Division sollte als CGFloat gegossen werden, sonst würde es nicht funktionieren
dwery
@dwery Wenn Sie 10 / labelSize ausführen, wird möglicherweise ein ganzzahliger Wert von 0 abgeschnitten, aber 10.0 oder 10.f funktionieren ohne explizites Casting einwandfrei.
Kalle
Du hast recht, es sollte funktionieren. Ich kann mich nicht erinnern, in welchem ​​Code es bei mir nicht funktioniert hat, wahrscheinlich fehlte das f oder der Punkt.
Dwery
20

Laut Dokumentation :

Verwenden Sie diese Eigenschaft, um den kleinsten Multiplikator für die aktuelle Schriftgröße anzugeben, der eine akzeptable Schriftgröße für die Anzeige des Etikettentextes ergibt. Wenn Sie für diese Eigenschaft den Wert 0 angeben, wird die aktuelle Schriftgröße als kleinste Schriftgröße verwendet.

Wenn also die Standardschriftgröße für Ihr Etikett lautet 10, geben Sie 0.7fals ein minimumScaleFactorund es sollte dasselbe tun wie minimumFontSizezuvor.

Kovpas
quelle
Das habe ich auch gedacht; Aber selbst wenn ich es als 0.1f setze, passt der Text die Größe nicht an. Ich werde den Uilabel-Code hinzufügen.
Padin215
Was ist, wenn Sie Einschränkungen entfernen und nur den Rahmen des Etiketts verkleinern?
Kovpas
9
Log139: Auf was ist Ihre numberOfLines eingestellt? Laut Apple-Dokumentation funktioniert der MinimumScaleFactor nur, wenn numberOfLines auf 1 gesetzt ist. Die Verwendung von 0 oder etwas größer als 1 funktioniert nicht.
SeanK
1
@ SeanK Es wird auch funktionieren, wenn numberOfLines auf mehr als 1, aber NICHT 0 gesetzt ist.
Asadullah Ali
12

Zusätzlich zu anderen Antworten werde ich eine anfängerfreundliche Erklärung hinzufügen, die mir geholfen hat:

Wie berechnet man ein minimumScaleFactor? Teilen Sie die Mindestschriftgröße Ihres Etiketts durch die Standardschriftgröße Ihres Etiketts. Ihre Standardschriftgröße ist beispielsweise 25. Ihre Mindestschriftgröße beträgt 10.

10/25 = 0,4

0,4 ist Ihr minimumScaleFactorWert. Siehe auch die Antwort von @ Jsdodgers oben.

AVog
quelle