2013-06-04 12 views
6

Mam UILabel z czcionką o rozmiarze punktu 17. Jeśli zadzwonię na label.font.pointSize dostaję 17, co jest dobre. BBUUUUTTT Mam również minimalny rozmiar czcionki do 8, teraz jeśli napiszę jakiś tekst w etykiecie, co spowoduje zmniejszenie rozmiaru kropki, a następnie zadzwonię do label.font.pointsize Wciąż dostaję 17, mimo że wiem, że rozmiar punktu jest mniejszyPobierz UILabel czcionka punktów po minimumFontSize

Jakieś pomysły, jak uzyskać rzeczywisty rozmiar punktu po systemie ma zmienić rozmiar czcionki?

+0

Nie bezpośrednio, ale można go obliczyć. Zobacz pierwszą odpowiedź tutaj: http://stackoverflow.com/questions/3669844/how-to-get-uilabel-uitextview-auto-adjusted-font-size – savner

+0

To denerwujące, ponieważ 'UILabel' ma informacje w prywatnej własności nazywane '_scaledMetrics', które jest instancją' _UILabelScaledMetrics'. Ta klasa ma właściwość '_actualScaleFactor'. Ale wszystkie akademickie, ponieważ nie są publicznie dostępne. – ChrisH

Odpowiedz

2

Jak savner zauważył w komentarzach, jest to kwestia powielania. Najczystsze rozwiązanie znajduje się tutaj: How to get UILabel (UITextView) auto adjusted font size?. Jednak rozwiązanie Sanjit działa również! Dzięki wszystkim!

CGFloat actualFontSize; 
[label.text sizeWithFont:label.font 
     minFontSize:label.minimumFontSize 
     actualFontSize:&actualFontSize 
      forWidth:label.bounds.size.width 
     lineBreakMode:label.lineBreakMode]; 
+1

Czy ktoś może przetłumaczyć to rozwiązanie na Swift? – Narwhal

+0

@Nagrhal Moim rozwiązaniem dla Swift jest utworzenie podklasy lub kategorii w Objective-C i użycie jej w Swift. Niezalecane, ponieważ metoda jest przestarzała, ale nie ma innego sposobu na uzyskanie rzeczywistego rozmiaru czcionki. – Adam

4

Nie znam interfejsu API, aby uzyskać aktualny rozmiar punktu UILabel, gdy skaluje zawartość. Możesz próbować przybliżać "współczynnik skalowania" za pomocą interfejsów API sizeWithFont.

tylko pomysł:

// Get the size of the text with no scaling (one line) 
CGSize sizeOneLine = [label.text sizeWithFont:label.font]; 

// Get the size of the text enforcing the scaling based on label width 
CGSize sizeOneLineConstrained = [label.text sizeWithFont:label.font constrainedToSize:label.frame.size]; 

// Approximate scaling factor 
CGFloat approxScaleFactor = sizeOneLineConstrained.width/sizeOneLine.width; 

// Approximate new point size 
CGFloat approxScaledPointSize = approxScaleFactor * label.font.pointSize; 
+0

Wydaje się działać naprawdę dobrze. Dziękuję Ci! – MobileMon

0

Swift 4 i iOS 7+ wersja (sizeWithFont jest teraz przestarzałe) odpowiedzi @Sanjit Saluja za:

// Get the size of the text with no scaling (one line) 
let sizeOneLine: CGSize = label.text!.size(withAttributes: [NSAttributedStringKey.font: label.font]) 

// Get the size of the text enforcing the scaling based on label width 
let sizeOneLineConstrained: CGSize = label.text!.boundingRect(with: label.frame.size, options: .usesLineFragmentOrigin, attributes: [NSAttributedStringKey.font: label.font], context: nil).size 

// Approximate scaling factor 
let approxScaleFactor: CGFloat = sizeOneLineConstrained.width/sizeOneLine.width 

// Approximate new point size 
let approxScaledPointSize: CGFloat = approxScaleFactor * label.font.pointSize