Pixelbreite des Textes in einem UILabel


78

Ich muss ein durchgestrichenes UILabel zeichnen. Deshalb habe ich UILabel in Unterklassen unterteilt und wie folgt implementiert:

@implementation UIStrikedLabel

- (void)drawTextInRect:(CGRect)rect{
    [super drawTextInRect:rect];

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextFillRect(context,CGRectMake(0,rect.size.height/2,rect.size.width,1));
}
@end

Was passiert ist, dass das UILabel durchgestrichen wird, wobei eine Zeile so lang ist wie das gesamte Label, aber der Text kann kürzer sein. Gibt es eine Möglichkeit, die Länge des Textes in Pixel zu bestimmen, damit die Linie entsprechend gezeichnet werden kann?

Ich bin auch offen für andere Lösungen, falls bekannt :)

Am besten, Erik

Antworten:


196

NSString verfügt über eine sizeWithAttributes: -Methode, die hierfür verwendet werden kann. Es gibt eine CGSize-Struktur zurück, sodass Sie die folgenden Schritte ausführen können, um die Breite des Texts in Ihrem Etikett zu ermitteln.

iOS 7 und höher

CGSize textSize = [[label text] sizeWithAttributes:@{NSFontAttributeName:[label font]}];

CGFloat strikeWidth = textSize.width;

iOS <7

Vor iOS7 mussten Sie die sizeWithFont: -Methode verwenden.

CGSize textSize = [[label text] sizeWithFont:[label font]];

CGFloat strikeWidth = textSize.width;

UILabel verfügt über eine Schrifteigenschaft, mit der Sie die Schriftdetails für Ihr Etikett dynamisch abrufen können, wie oben beschrieben.

Hoffe das hilft :)


5
sizeWithFont ist seit iOS7 veraltet. Verwenden Sie CGSize textSize = [string sizeWithAttributes: @ {NSFontAttributeName: [UIFont systemFontOfSize: 14.0f]}]; stattdessen.
Cldrr

Sie können auch verwenden label.attributedText.size.
Jed Fox

70

Eine bessere Lösung hier in Swift :
Update:
Für Swift 3/4:

@IBOutlet weak var testLabel: UILabel!
// in any function
testLabel.text = "New Label Text"
let width = testLabel.intrinsicContentSize.width
let height = testLabel.intrinsicContentSize.height
print("width:\(width), height: \(height)")

Alte Antwort:

yourLabel?.text = "Test label text" // sample label text
let labelTextWidth = yourLabel?.intrinsicContentSize().width
let labelTextHeight = yourLabel?.intrinsicContentSize().height

ist das ios 7 kompatibel?
Matej

Diese Option ist deutlich schneller
Josh Bernfeld

Neue Frage. Benötigen Sie keine Breite / Höhe, um ein Etikett zu erstellen? Zumindest bin ich dort. Ich versuche, die Breite des Textes zu ermitteln, mit dem ich ein Etikett erstelle. let sanskritLabel = UILabel(frame: CGRectMake(0, 120, sanskritStringSize.width, sanskritStringSize.height))
Reise

0

Das wird funktionieren. Versuch es

NSDictionary *attrDict = @{NSFontAttributeName : [GenericUtility getOpenSansRegularFontSize:12]};
CGSize stringBoundingBox = [selectedReservationModel.DateLabel sizeWithAttributes: attrDict];
lblDeliveryDateWidth = stringBoundingBox.width;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.