2013-06-04 12 views
6

Ich habe ein UILabel mit einer Schrift der Schriftgröße 17. Wenn ich label.font.pointSize anrufe, bekomme ich 17, was alles gut ist. BBUUUUTTT Ich habe auch eine minimumfontsize auf 8 gesetzt, jetzt, wenn ich etwas Text in die Beschriftung stopfen, die die Punktgröße schrumpft und dann label.font.pointsize ich immer noch 17 obwohl ich weiß, dass die Punktgröße kleiner istGet UILabel Schriftgröße nach minimumFontSize

Irgendwelche Ideen, wie man die wahre Punktgröße bekommt, nachdem das System die Schrift skaliert hat?

+0

Nicht direkt, aber Sie können es berechnet wird. Siehe die erste Antwort hier: http://stackoverflow.com/questions/3669844/how-to-get-uilabel-uitextview-auto-adjusted-font-size – savner

+0

Es ist ärgerlich, weil 'UILabel' die Informationen in einer privaten Eigenschaft hat namens '_scaledMetrics', eine Instanz von' _UILabelScaledMetrics'. Diese Klasse hat eine Eigenschaft '_actualScaleFactor'. Aber alles akademische wie es nicht öffentlich verfügbar ist. – ChrisH

Antwort

2

Wie Savner in den Kommentaren darauf hingewiesen, ist dies eine doppelte Frage. Die sauberste Lösung finden Sie hier: How to get UILabel (UITextView) auto adjusted font size?. Sanjits Lösung funktioniert jedoch auch! Danke an alle!

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

Kann jemand diese Lösung in Swift übersetzen? – Narwhal

+0

@Narwhal Meine Lösung für Swift ist das Erstellen einer Unterklasse oder Kategorie in Objective-C und die Verwendung in Swift. Nicht empfohlen, da die Methode veraltet ist. Es gibt jedoch keine andere Möglichkeit, die tatsächliche Schriftgröße zu ermitteln. – Adam

4

Ich weiß nicht von einer API, um die aktuelle Punktgröße des UILabel zu erhalten, wenn es Ihren Inhalt verkleinert. Sie können versuchen, den "Skalierungsfaktor" mithilfe der APIs sizeWithFont anzunähern.

Nur eine Idee:

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

Scheint wirklich gut zu funktionieren. Vielen Dank! – MobileMon

0

Swift 4 und iOS 7+ Version (sizeWithFont ist jetzt veraltet) von @Sanjit Saluja Antwort:

// 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 
Verwandte Themen