2010-03-07 5 views
19

Bei myLabel.adjustsFontSizeToFitWidth = YES passt UILabel die Schriftgröße automatisch an, falls der Text für das Etikett zu lang ist. Wenn mein Etikett beispielsweise nur 100 Pixel breit ist und mein Text zu lang ist, um mit der aktuellen Schriftgröße übereinzustimmen, wird die Schriftgröße verkleinert, bis der Text in das Etikett passt.Wie wird die Schriftgröße eines UILabel berechnet, wenn -adjustsFontSizeToFitWidth auf YES gesetzt ist?

Ich brauche die tatsächlich angezeigte Schriftgröße von UILabel, wenn die Schriftgröße geschrumpft ist. Nehmen wir zum Beispiel an, dass meine Schriftgröße eigentlich 20 ist, aber UILabel musste sie auf 10 verkleinern. Wenn ich UILabel nach der Schriftart und der Schriftgröße frage, bekomme ich meine alte Schriftgröße (20), aber nicht die, die angezeigt wird (10).

+0

Keine der Antworten im Rahmen dieser Frage tatsächlich die Frage beantworten, wird gefragt. Nicht sicher, warum das so ist, aber es ist so. Hier ist eine tatsächliche Antwort für zukünftige Leser: https://stackoverflow.com/a/28285447/2057171 –

Antwort

7

Ich bin mir nicht sicher, ob das völlig korrekt ist, aber es sollte hoffentlich ziemlich nah sein. Es berücksichtigt möglicherweise keine verkürzten Zeichenfolgen oder die Höhe der Beschriftung, aber das ist etwas, was Sie möglicherweise manuell tun können.

Verfahren

- (CGSize)sizeWithFont:(UIFont *)font minFontSize:(CGFloat)minFontSize actualFontSize:(CGFloat *)actualFontSize forWidth:(CGFloat)width lineBreakMode:(UILineBreakMode)lineBreakMode

wird die Textgröße zurückkehren und feststellen, dass es auch einen Referenzparameter für die aktuelle Schriftgröße verwendet hat.

+0

Erweiterte Antwort hier: http://Stackoverflow.com/a/6141770/1804403 – Skotch

+3

Diese Methode ist jetzt unter iOS 7 veraltet. Siehe http://stackoverflow.com/questions/19195541/how-to-calculate-actual-font-size-in-ios-7 – openfrog

+2

Das wird auch die Bounding-Box-Größe für die angegebene Schriftgröße zurückgeben ... Nicht die Schriftart Größe für die angegebene Größe des Begrenzungsrahmens. – jowie

2

Falls jemand noch die Antwort benötigt. In iOS9 können Sie boundingRectWithSize:options:context: verwenden, um die tatsächliche Schriftgröße zu berechnen. Beachten Sie, dass context.minimumScaleFactor nicht 0.0 sein sollte, damit die Skalierung funktioniert.

- (CGFloat)adjustedFontSizeForLabel:(UILabel *)label { 
    NSMutableAttributedString *text = [[NSMutableAttributedString alloc] initWithAttributedString:label.attributedText]; 
    [text setAttributes:@{NSFontAttributeName:label.font} range:NSMakeRange(0, text.length)]; 

    NSStringDrawingContext *context = [NSStringDrawingContext new]; 
    context.minimumScaleFactor = label.minimumScaleFactor; 
    [text boundingRectWithSize:label.frame.size options:NSStringDrawingUsesLineFragmentOrigin context:context]; 
    CGFloat adjustedFontSize = label.font.pointSize * context.actualScaleFactor; 

    return adjustedFontSize; 
} 
+3

Diese Methode gibt immer noch das Original zurück Schriftgröße –

0

Swift 3

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 

    func adjustedFontSizeForLabel(_ label: UILabel) -> CGFloat { 
     let text: NSMutableAttributedString = NSMutableAttributedString(attributedString: label.attributedText!) 
     text.setAttributes([NSFontAttributeName: label.font], range: NSMakeRange(0, text.length)) 
     let context: NSStringDrawingContext = NSStringDrawingContext() 
     context.minimumScaleFactor = label.minimumScaleFactor 
     text.boundingRect(with: label.frame.size, options: NSStringDrawingOptions.usesLineFragmentOrigin, context: context) 
     let adjustedFontSize: CGFloat = label.font.pointSize * context.actualScaleFactor 
     return adjustedFontSize 
    } 

    print(adjustedFontSizeForLabel(yourLabel)) 
} 
+0

Es zeigt die gleiche Größe wie in Interface Builder definiert. –

1

Bei einzeiligen UILabel funktioniert diese einfache Lösung:

//myLabel - initial label 

UILabel *fullSizeLabel = [UILabel new]; 
fullSizeLabel.font = myLabel.font; 
fullSizeLabel.text = myLabel.text; 
[fullSizeLabel sizeToFit]; 

CGFloat actualFontSize = myLabel.font.pointSize * (myLabel.bounds.size.width/fullSizeLabel.bounds.size.width); 

//correct, if new font size bigger than initial 
actualFontSize = actualFontSize < myLabel.font.pointSize ? actualFontSize : myLabel.font.pointSize; 
Verwandte Themen