Wie berechnet man die UILabel-Breite basierend auf der Textlänge?

142

Ich möchte ein Bild neben einem UILabel anzeigen, UILabel hat jedoch eine variable Textlänge, sodass ich nicht weiß, wo das Bild platziert werden soll. Wie kann ich das erreichen?

Sheehan Alam
quelle

Antworten:

191
CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font 
                        constrainedToSize:maximumLabelSize 
                        lineBreakMode:yourLabel.lineBreakMode]; 

Wofür ist - [NSString sizeWithFont: forWidth: lineBreakMode:] gut?

Diese Frage könnte Ihre Antwort haben, es hat bei mir funktioniert.


Für 2014 habe ich diese neue Version bearbeitet, basierend auf dem äußerst praktischen Kommentar von Norbert unten! Das macht alles. Prost

// yourLabel is your UILabel.

float widthIs = 
 [self.yourLabel.text
  boundingRectWithSize:self.yourLabel.frame.size                                           
  options:NSStringDrawingUsesLineFragmentOrigin
  attributes:@{ NSFontAttributeName:self.yourLabel.font }
  context:nil]
   .size.width;

NSLog(@"the width of yourLabel is %f", widthIs);
Aaron Saunders
quelle
41
Nur eine Anmerkung: Dies ist seit iOS7 veraltet. Der bevorzugte Weg ist jetzt:[yourString boundingRectWithSize:maximumLabelSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{ NSFontAttributeName:yourLabel.font } context:nil];
Norbert
17
Sie können auch die IntrinsicContentSize-Eigenschaft verwenden. Ich mag Objective-c nicht besonders, aber es sollte ungefähr so ​​aussehen: self.yourLabel.intrinsicContentSize Dadurch erhalten Sie die Größe des Etiketteninhalts, sodass Sie nur die Breite von dort erhalten können.
Boris
1
Funktioniert einfach yourLabel.intrinsicContentSize.widthsuper, siehe Antwort unten.
denis_lor
155

yourLabel.intrinsicContentSize.widthfür Objective-C / Swift

Jakub Truhlář
quelle
funktioniert nicht für mich, es berechnet nicht die Breite des Etiketts auf der Grundlage ihres Textes
Chandni
1
Funktioniert perfekt für mich, auch mit benutzerdefinierter Schriftart!
fl034
1
perfekte Antwort für die Breite des dynamischen Etiketts
Chetan
52

In kurzer Zeit

 yourLabel.intrinsicContentSize().width 
Arshad
quelle
3
Diese Antwort gilt nur für eine Ansicht, die angelegt wurde
Rommex
33

Die ausgewählte Antwort ist für iOS 6 und niedriger korrekt.

In iOS 7 sizeWithFont:constrainedToSize:lineBreakMode:wurde veraltet . Es wird jetzt empfohlen, dass Sie verwenden boundingRectWithSize:options:attributes:context:.

CGRect expectedLabelSize = [yourString boundingRectWithSize:sizeOfRect
                                                    options:<NSStringDrawingOptions>
                                                 attributes:@{
                                                    NSFontAttributeName: yourString.font
                                                    AnyOtherAttributes: valuesForAttributes
                                                 }
                                                    context:(NSStringDrawingContext *)];

Beachten Sie, dass der Rückgabewert a CGRectnicht a ist CGSize. Hoffentlich hilft das den Leuten, die es in iOS 7 verwenden.

Chetan Shenoy
quelle
12

In iOS8 ist sizeWithFont veraltet, siehe

CGSize yourLabelSize = [yourLabel.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:yourLabel.font size:yourLabel.fontSize]}];

Sie können alle gewünschten Attribute in sizeWithAttributes hinzufügen. Andere Attribute, die Sie festlegen können:

- NSForegroundColorAttributeName
- NSParagraphStyleAttributeName
- NSBackgroundColorAttributeName
- NSShadowAttributeName

und so weiter. Aber wahrscheinlich werden Sie die anderen nicht brauchen

Jarora
quelle
10

Swift 4 Antworte, wer Constraint verwendet

label.text = "Hello World"

var rect: CGRect = label.frame //get frame of label
rect.size = (label.text?.size(attributes: [NSFontAttributeName: UIFont(name: label.font.fontName , size: label.font.pointSize)!]))! //Calculate as per label font
labelWidth.constant = rect.width // set width to Constraint outlet

Swift 5 Antworte, wer Constraint verwendet

label.text = "Hello World"

var rect: CGRect = label.frame //get frame of label
rect.size = (label.text?.size(withAttributes: [NSAttributedString.Key.font: UIFont(name: label.font.fontName , size: label.font.pointSize)!]))! //Calculate as per label font
labelWidth.constant = rect.width // set width to Constraint outlet
iOS Lifee
quelle
1
Toll! Praktisch für die Berechnung der Breite von UIButton anhand von Text, wobei intrinsicContentSize.width nicht immer korrekt funktioniert.
Nomnom
8
CGRect rect = label.frame;
rect.size = [label.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:label.font.fontName size:label.font.pointSize]}];
label.frame = rect;
Honig Lakhani
quelle
2
Dies gibt keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlassen Sie einen Kommentar unter seinem Beitrag. Sie können jederzeit Ihre eigenen Beiträge kommentieren. Sobald Sie einen ausreichenden Ruf haben, können Sie jeden Beitrag kommentieren .
Die bescheidene Ratte
In dieser Antwort erfahren Sie, wie Sie die Etikettengröße entsprechend dem Text anpassen. Was ist das Problem dabei?
Honey Lakhani
2

Folgendes habe ich mir ausgedacht, nachdem ich einige Prinzipien anderer SO-Beiträge angewendet hatte, einschließlich Aarons Link:

    AnnotationPin *myAnnotation = (AnnotationPin *)annotation;

    self = [super initWithAnnotation:myAnnotation reuseIdentifier:reuseIdentifier];
    self.backgroundColor = [UIColor greenColor];
    self.frame = CGRectMake(0,0,30,30);
    imageView = [[UIImageView alloc] initWithImage:myAnnotation.THEIMAGE];
    imageView.frame = CGRectMake(3,3,20,20);
    imageView.layer.masksToBounds = NO;
    [self addSubview:imageView];
    [imageView release];

    CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];
    CGRect newFrame = self.frame;
    newFrame.size.height = titleSize.height + 12;
    newFrame.size.width = titleSize.width + 32;
    self.frame = newFrame;
    self.layer.borderColor = [UIColor colorWithRed:0 green:.3 blue:0 alpha:1.0f].CGColor;
    self.layer.borderWidth = 3.0;

    UILabel *infoLabel = [[UILabel alloc] initWithFrame:CGRectMake(26,5,newFrame.size.width-32,newFrame.size.height-12)];
    infoLabel.text = myAnnotation.title;
    infoLabel.backgroundColor = [UIColor clearColor];
    infoLabel.textColor = [UIColor blackColor];
    infoLabel.textAlignment = UITextAlignmentCenter;
    infoLabel.font = [UIFont systemFontOfSize:12];

    [self addSubview:infoLabel];
    [infoLabel release];

In diesem Beispiel füge ich einer MKAnnotation-Klasse einen benutzerdefinierten Pin hinzu, der die Größe eines UILabels entsprechend der Textgröße ändert. Außerdem wird auf der linken Seite der Ansicht ein Bild hinzugefügt, sodass Sie einen Teil des Codes sehen, der den richtigen Abstand für das Bild und das Auffüllen verwaltet.

Der Schlüssel besteht darin, CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];die Abmessungen der Ansicht zu verwenden und anschließend neu zu definieren. Sie können diese Logik auf jede Ansicht anwenden.

Obwohl Aarons Antwort für einige funktioniert, hat sie für mich nicht funktioniert. Dies ist eine weitaus detailliertere Erklärung, die Sie sofort ausprobieren sollten, bevor Sie irgendwohin gehen, wenn Sie eine dynamischere Ansicht mit einem Bild und einem UILabel mit veränderbarer Größe wünschen. Ich habe schon die ganze Arbeit für dich gemacht !!

Whyoz
quelle