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

Erik
quelle

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 :)

Harry
quelle
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
Aks
quelle
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;
sametytmz
quelle