Wie kann ich verhindern, dass UILabel die Größe jedes Mal ändert?

Ich habe eine Stoppuhr-Funktion in meiner App, die ein zentriertes Attribut verwendetUILabel mit einer proportionalen Abstandsschrift, um die Zeit zu rendern. Bei jedem Schritt ändert sich die Breite des Etiketts und es entsteht ein Bouncing-Effekt, der bei hohen Geschwindigkeiten besonders schlecht aussieht. Hier ist einBeispiel.

Wie kann ich das beheben?

iOS 9 UPDATE

Es ist jetzt ein Einzeiler:

UIFont.monospacedDigitSystemFontOfSize(17, weight: UIFontWeightRegular)

Das letzte Mal, als ich es versuchte, funktionierte die folgende Lösung nicht für iOS 9. Es wurde viel Zeit für das Debuggen verschwendet, bevor ich im Header darauf gestoßen bin.

LÖSUNG

Es stellte sich heraus, dass Text Kit in iOS 7 trivial ist.

Stellen Sie sicher, dass der Haupttext importiert wird:

#import <CoreText/CoreText.h>

Erstellen Sie eine Einstellung, die proportionale Zahlen in monospaced konvertiert:

NSArray *monospacedSetting = @[@{UIFontFeatureTypeIdentifierKey: @(kNumberSpacingType),
                                 UIFontFeatureSelectorIdentifierKey: @(kMonospacedNumbersSelector)}];

Erstellen Sie einen neuen Font-Deskriptor, indem Sie den aktuellen anhängen, der von verwendet wirdUILabel:

UIFontDescriptor *newDescriptor = [[timeLabel.font fontDescriptor] fontDescriptorByAddingAttributes:@{UIFontDescriptorFeatureSettingsAttribute: monospacedSetting}];

Schriftart des Etiketts aktualisieren:

// Size 0 to use previously set font size
timeLabel.font = [UIFont fontWithDescriptor:newDescriptor size:0];

Antworten auf die Frage(2)

Ihre Antwort auf die Frage