Jak działa minimumScaleFactor UILabel?

109

Używałem minimumFontSizewcześniej, ale ta funkcja jest teraz przestarzała i nie bardzo rozumiem, jak minimumScaleFactordziała.

Chcę, aby maksymalny rozmiar czcionki wynosił 10, a minimalny 7.

Jak mogę zmniejszyć rozmiar czcionki do rozmiaru 7 za pomocą współczynnika skali?

UILabel kreacja:

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
źródło

Odpowiedzi:

204

Musisz ustawić label.adjustsFontSizeToFitWidth = YES;

Scott
źródło
1
Idealnie, właśnie tego brakowało mi w moim własnym kodzie. Dzięki: D
Fogmeister
14
Uwaga: „Dokumentacja firmy Apple mówi, że minimumScaleFactor działa tylko wtedy, gdy parametr numberOfLines jest ustawiony na 1. Użycie 0 lub wartości większej niż 1 nie zadziała”. . Dzięki SeanK.
samthui7
Niesamowite! Zabawne, że jeśli ustawisz minumumScaleFactor w XIB, nie musisz ustawiać AdjustsFontSizeToFitWidth, ale musisz to zrobić w kodzie.
Politta
104

Oprócz tego, co mówią inne odpowiedzi, jeśli jako minSize / defaultSize (dzielenie) wpiszesz minimumScaleFactor, będzie to to samo, co użycie starego minimumFontSize.

Na przykład, jeśli chcesz, aby minimalny rozmiar czcionki to 10 przy domyślnym rozmiarze etykiety, możesz wykonać:

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

(Zastąp [UIFont labelFontSize]rozmiarem czcionki etykiety, jeśli nie jest to domyślny).

który byłby taki sam jak: [label setMinimumFontSize:10.0];

Jsdodgers
źródło
podział powinien być rzutowany jako CGFloat, w przeciwnym razie nie zadziała
dwery
@dwery Doing 10 / labelSize może zakończyć się obciętą liczbą całkowitą równą 0, ale 10,0 lub 10.f działa dobrze, bez jawnego rzutowania.
Kalle
masz rację, powinno działać. Nie pamiętam, w którym kodzie to nie zadziałało, prawdopodobnie brakowało f lub kropki.
dwery
20

Zgodnie z dokumentacją :

Użyj tej właściwości, aby określić najmniejszy mnożnik dla bieżącego rozmiaru czcionki, który daje akceptowalny rozmiar czcionki do użycia podczas wyświetlania tekstu etykiety. Jeśli określisz wartość 0 dla tej właściwości, bieżący rozmiar czcionki zostanie użyty jako najmniejszy rozmiar czcionki.

Więc jeśli domyślny rozmiar czcionki dla twojej etykiety to 10, wstawiasz 0.7fjako a minimumScaleFactori powinno zrobić to samo, co minimumFontSizezrobiłeś.

kovpas
źródło
Tak też myślałem; ale nawet jeśli ustawię to jako 0.1f, tekst nie dostosowuje rozmiaru. dodam kod uilabel.
Padin215
Co się stanie, jeśli usuniesz ograniczenia i po prostu zmniejszysz ramkę etykiety?
kovpas
9
Log139: Jakie jest twoje ustawienie numberOfLines? Dokumentacja Apple mówi, że minimumScaleFactor działa tylko wtedy, gdy numberOfLines jest ustawione na 1. Użycie 0 lub czegoś większego niż 1 nie zadziała.
SeanK
1
@SeanK Będzie działać, nawet jeśli parametr numberOfLines jest ustawiony na więcej niż 1, ale NIE 0.
Asadullah Ali
12

Oprócz innych odpowiedzi dodam przyjazne dla początkujących wyjaśnienie, które pomogło sobie:

Jak obliczyć minimumScaleFactor? Podziel minimalny rozmiar czcionki na etykiecie przez domyślny rozmiar czcionki na etykiecie. Na przykład domyślny rozmiar czcionki to 25. Minimalny rozmiar czcionki to 10.

10/25 = 0,4

0,4 to twoja minimumScaleFactorwartość. Zobacz także odpowiedź @ Jsdodgers powyżej.

AVog
źródło