2012-12-01 2 views
18

Ich möchte ein Standard UILabel nehmen und die Schriftgröße erhöhen, so dass es den vertikalen Raum füllt. Inspiriert von der akzeptierten Antwort für diesen question, definierte ich eine Unterklasse auf UILabel mit dieser drawRect Umsetzung:Skalierung der Schriftgröße, um vertikal in UILabel zu passen

- (void)drawRect:(CGRect)rect 
{ 
    // Size required to render string 
    CGSize size = [self.text sizeWithFont:self.font]; 

    // For current font point size, calculate points per pixel 
    float pointsPerPixel = size.height/self.font.pointSize; 

    // Scale up point size for the height of the label 
    float desiredPointSize = rect.size.height * pointsPerPixel; 

    // Create and assign new UIFont with desired point Size 
    UIFont *newFont = [UIFont fontWithName:self.font.fontName size:desiredPointSize]; 
    self.font = newFont; 

    // Call super 
    [super drawRect:rect]; 
} 

Aber das funktioniert nicht, wie es die Schrift über die Unterseite des Etiketts skaliert. Wenn Sie das replizieren wollen, habe ich mit einem Label 289x122 (w x h), Helvetica als Font und einer Startpunktgröße von 60 angefangen, die gut in das Label passt. Hier ist beispielsweise Ausgabe von dem Standard UILabel und meine Unterklasse mit der Zeichenfolge „{Hg“:

uilabel

uilabel subclass

Ich habe in der Schrift Ober- und Unterlängen sah, versuchte Skalierung diese unter Berücksichtigung der in verschiedene Kombinationen, hatten aber immer noch kein Glück. Irgendwelche Ideen, hat das etwas mit unterschiedlichen Schriftarten zu tun, die unterschiedliche Unterlängen und Oberlängen haben?

Antwort

12

Ihre Berechnung für pointsPerPixel ist der falsche Weg, sollte es sein ...

float pointsPerPixel = self.font.pointSize/size.height; 

auch, vielleicht dieser Code in layoutSubviews als einzige Zeit sollte die Schriftart geändert werden soll, ist, wenn die Rahmengröße Änderungen.

+1

naja ... das war ein peinlich einfacher Fehler. Danke, dass du es gesehen hast. – user524261

+0

Ich habe versucht, es in 'layoutSubviews' zu implementieren, aber ich glaube nicht, dass es funktioniert. Ich denke, der Grund ist, dass das Zuweisen einer neuen Schriftart zu der Unterklasse "UILabel" einen anderen Aufruf von "layoutSubviews" auslöst, was problematisch ist. In meiner Implementierung wurde eine der Warteschlangen meiner App gesperrt. – user444731

0

Ich frage mich, ob es ein Rundungsfehler ist bis zur nächsten größeren Schriftgröße. Könnten Sie die rec.size.height einfach etwas skalieren? Etwas wie:

float desiredPointSize = rect.size.height *.90 * pointsPerPixel; 

Update: Ihre pointPerPixel Berechnung ist nach hinten. Sie teilen Pixel statt Punkte nach Pixeln. Tausche diese und es funktioniert jedes Mal. Gerade für Gründlichkeit, hier ist der Beispielcode I getestet:

//text to render  
NSString *soString = [NSString stringWithFormat:@"{Hg"]; 
UIFont *soFont = [UIFont fontWithName:@"Helvetica" size:12]; 

//box to render in 
CGRect rect = soLabel.frame; 

//calculate number of pixels used vertically for a given point size. 
//We assume that pixel-to-point ratio remains constant. 
CGSize size = [soString sizeWithFont:soFont]; 
float pointsPerPixel; 
pointsPerPixel = soFont.pointSize/size.height; //this calc works 
//pointsPerPixel = size.height/soFont.pointSize; //this calc does not work 

//now calc which fontsize fits in the label 
float desiredPointSize = rect.size.height * pointsPerPixel; 
UIFont *newFont = [UIFont fontWithName:@"Helvetica" size:desiredPointSize]; 

//and update the display 
[soLabel setFont:newFont]; 
soLabel.text = soString; 

die skaliert und für jede Größe, die ich in der Labelbox passen getestet, von 40 pt zu 60PT Schriftart reichen. Als ich die Berechnung umkehrte, sah ich die gleichen Ergebnisse, wobei die Schrift für die Box zu groß war.

+0

Es gibt keine Rundung auf Ganzzahlen, da wir float pointSize-Werte verwenden. Trotzdem ist die fontSize um mehr als eine ganze pointSize out. Einverstanden, dass Sie um einen Faktor zurückverkleinern können, aber das ist mehr ein Fudge als eine genaue Berechnung und variiert von Schriftart zu Schriftart. – user524261