webentwicklung-frage-antwort-db.com.de

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

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

132
Sheehan Alam
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 ultra-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);
187
Aaron Saunders

yourLabel.intrinsicContentSize.width für Objective-C/Swift

140
Jakub Truhlář

In Swift

 yourLabel.intrinsicContentSize().width 
49
Arshad

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

In iOS 7 wird sizeWithFont:constrainedToSize:lineBreakMode: war veraltet. Es wird jetzt empfohlen, dass Sie 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 ein CGRect und kein CGSize ist. Hoffentlich hilft das den Leuten, die es in iOS 7 verwenden.

33
Chetan Shenoy

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 wirst du die anderen nicht brauchen

12
jarora
CGRect rect = label.frame;
rect.size = [label.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:label.font.fontName size:label.font.pointSize]}];
label.frame = rect;
7
Honey Lakhani

Swift 4 Answer, die Constraint verwenden

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
5
iOS Lifee

Folgendes habe ich mir ausgedacht, nachdem ich ein paar andere Grundsätze angewendet hatte SO), 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, mit dem die Größe eines UILabels entsprechend der Textgröße geändert wird. Es wird auch ein Bild auf der linken Seite der Ansicht hinzugefügt, sodass Sie einen Teil des Codes sehen, der den richtigen Abstand verwaltet, um das Bild und die Auffüllung zu handhaben.

Der Schlüssel ist, CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]]; Zu verwenden und dann die Dimensionen der Ansicht 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 unmittelbar vor dem Wechsel zu einem anderen Ort ausprobieren sollten, wenn Sie eine dynamischere Ansicht mit einem Bild und einer anpassbaren UILabel-Größe wünschen. Ich habe schon die ganze Arbeit für dich getan !!

2
whyoz