2010-03-07 10 views
19

Gdy myLabel.adjustsFontSizeToFitWidth = YES, UILabel automatycznie dostosuje rozmiar czcionki w przypadku, gdy tekst jest zbyt długi dla etykiety. Jeśli na przykład moja etykieta ma tylko 100px szerokości, a mój tekst jest zbyt długi, aby zmieścił się w bieżącym rozmiarze czcionki, zmniejszy rozmiar czcionki czcionki, dopóki tekst nie pasuje do etykiety.Jak określić rozmiar czcionki UILabel, gdy -justjustFontSizeToFitWidth jest ustawiona na TAK?

Potrzebuję uzyskać rzeczywisty wyświetlany rozmiar czcionki z UILabel, gdy rozmiar czcionki skurczy się w dół. Na przykład, powiedzmy, że mój rozmiar czcionki wynosił 20, ale UILabel musiał zmniejszyć ją do 10. Kiedy pytam UILabel o czcionkę i rozmiar czcionki, otrzymuję stary rozmiar czcionki (20), ale nie ten, który jest wyświetlany (10).

+0

żadna z odpowiedzi na to pytanie na podstawie faktycznie odpowiedzieć na pytanie zadawane. Nie wiem, dlaczego tak jest, ale tak jest. Oto aktualna odpowiedź dla przyszłych czytelników: https://stackoverflow.com/a/28285447/2057171 –

Odpowiedz

7

Nie jestem pewien, czy jest to całkowicie dokładne, ale powinno być całkiem blisko, mam nadzieję. Nie może brać pod uwagę obciętych łańcuchów ani wysokości etykiety, ale jest to coś, co możesz zrobić ręcznie.

Sposób

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

zwróci rozmiar tekstu, a zauważysz, że ma również parametr odniesienia dla rzeczywistego rozmiaru czcionki stosowanej.

+0

Rozszerzona odpowiedź tutaj: http://stackoverflow.com/a/6141770/1804403 – Skotch

+3

Ta metoda jest teraz uznawana za przestarzałą w systemie iOS 7. Zobacz http://stackoverflow.com/questions/19195541/how-to-calculate-actual-font-size-in-ios-7 – openfrog

+2

To również zwróci rozmiar obwiedni dla rozmiaru czcionki podanego ... Nie czcionka rozmiar podanego rozmiaru ramki ograniczającej. – jowie

2

Jeśli ktoś nadal potrzebuje odpowiedzi. W iOS9 można użyć boundingRectWithSize:options:context: do obliczenia rzeczywistego rozmiaru czcionki. Zauważ, że context.minimumScaleFactor nie powinno mieć wartości 0.0, aby skalowanie działało.

- (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

Ta metoda nadal zwraca oryginał rozmiar czcionki –

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

pokazuje ten sam rozmiar, jak zdefiniowano w konstruktorze interfejsu. –

1

Dla jednej linii UILabel działa prawidłowo to proste rozwiązanie:

//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; 
Powiązane problemy