2015-02-26 17 views
17

Szukałem czegoś, aby dynamicznie dopasować moją fontSize do szerokości mojego okna układu. Ale wszystkie odpowiedzi, które mogę znaleźć, to albo użyć:Swift - Dopasowywanie rozmiaru czcionki do szerokości układu (programowo)

label.adjustsFontSizeToFitWidth = true 

Który działa. Ale tylko jeśli nie mam setTranslatesAutoresizingMaskIntoConstraints ustawionego na false.

Należy pamiętać, że nie używam scenorysów. Tak, aby mieć pełną kontrolę nad moim innych ograniczeń muszę tę linię:

label.setTranslatesAutoresizingMaskIntoConstraints(false) 

więc jak mogę ustawić rozmiar czcionki, aby dopasować szerokość bez używania storyboard i kiedy nie można użyć adjustsFontSizeToFitWidth.

Po tym, jak wymyślę, jak dopasować rozmiar czcionki do szerokości. Muszę również dostosować wysokość pola układu, aby dopasować rozmiar czcionki. Wydaje się, że jest na to jednak dokumentacja, ale jeśli zdarzy ci się znać odpowiedź na to pytanie, byłoby to bardzo docenione.

góry dzięki

Odpowiedz

24

spróbuj wykonać następujące polecenia na etykiecie:

label.adjustsFontSizeToFitWidth = true 
label.minimumScaleFactor = 0.2 

i starają się zmienić linie etykiety na 0 i 1 (sprawdzić obu przypadkach):

label.numberOfLines = 0 // or 1 
+1

Niestety nie mogę użyć "label.adjustsFontSizeToFitWidth = true" przyczyna Używam ograniczeń programowych, a więc muszę się następujący wiersz label.setTranslatesAutoresizingMaskIntoConstraints (false) , który wydaje się łamać adjustFontSizeToFitWith. Próbowałem obu twoich scenariuszy, niestety bez powodzenia. Dzięki za odpowiedź! Doceniam to. – MLyck

2

Po prostu zrobiłem to, co potrzebne, działa idealnie! (TYLKO W ZAKRESIE PROGRAMOWANIA) - Ustawiamy duży rozmiar czcionki na etykiecie, aby dopasować ją do idealnego rozmiaru czcionki.

self.label.font = UIFont(name: "Heiti TC", size: 60) 
self.label.numberOfLines = 0 
self.label.minimumScaleFactor = 0.1 
self.label.baselineAdjustment = .alignCenters 
self.label.textAlignment = .center 

Jeśli używasz autoLayout, wdrożyć ten kod w viewDidLayoutSubviews (po układ został rozplanowany).

Yours Roi

+0

Używam ograniczeń programistycznych i po prostu ustawienie .numberOfLines na 0 powoduje, że .adjustsFontSizeToFitWidth rozpoczyna pracę od nowa. Dzięki – andrewcar

7

Myślę, że to pomoże Ci

Objective C

[lb setMinimumScaleFactor:10.0/[UIFont labelFontSize]]; lb.adjustsFontSizeToFitWidth = YES;

Swift 3,0

lb.minimumScaleFactor = 10/UIFont.labelFontSize lb.adjustsFontSizeToFitWidth = true

+1

Proszę wyjaśnić, jak to działa, byłoby miło, gdybyś był –

+1

Odpowiedź nie pasuje do języka pytania – shim

+0

@shim Dzięki za komentarz! Edytowane –

2

Nie wiem, czy to zakończy się ely odpowiedz na twoje pytanie, ale możesz użyć tego rozszerzenia, aby obliczyć własne rozmiary czcionek.

extension String { 
    func height(constrainedBy width: CGFloat, with font: UIFont) -> CGFloat { 
     let constraintSize = CGSize(width: width, height: .max) 
     let boundingBox = self.boundingRectWithSize(constraintSize, options: .UsesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil) 

     return boundingBox.height 
    } 

    func width(constrainedBy height: CGFloat, with font: UIFont) -> CGFloat { 
     let constrainedSize = CGSize(width: .max, height: height) 
     let boundingBox = self.boundingRectWithSize(constrainedSize, options: .UsesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil) 

     return boundingBox.width 
    } 
} 
0

Oto rozwiązanie Hack:

var size: CGFloat = 20 

    while titleLabel.frame.width > containerView.frame.width { 

     titleLabel.font = UIFont.systemFont(ofSize: size) 
     titleLabel.sizeToFit() 
     size -= 1 

    }