Come calcolare la larghezza di UILabel in base alla lunghezza del testo?


142

Voglio visualizzare un'immagine accanto a un UILabel, tuttavia UILabel ha una lunghezza del testo variabile, quindi non so dove posizionare l'immagine. Come posso ottenere questo?

Risposte:


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

Cosa è - [NSString sizeWithFont: forWidth: lineBreakMode:] buono per?

questa domanda potrebbe avere la tua risposta, ha funzionato per me.


Per il 2014, ho modificato in questa nuova versione, in base al commento ultra pratico di Norbert qui sotto! Questo fa tutto. Saluti

// 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);

41
Solo una nota: questo è obsoleto da iOS7. Il modo preferito ora è:[yourString boundingRectWithSize:maximumLabelSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{ NSFontAttributeName:yourLabel.font } context:nil];
Norbert,

17
È inoltre possibile utilizzare la proprietà IntrinsicContentSize. Non sono molto interessato a Objective-c, ma dovrebbe essere qualcosa del genere: self.yourLabel.intrinsicContentSize questo ti darà la dimensione del contenuto dell'etichetta, quindi puoi semplicemente ottenere la larghezza da lì.
Boris,

1
Basta yourLabel.intrinsicContentSize.widthgrandi opere, controllo risposta qui sotto.
denis_lor,

155

yourLabel.intrinsicContentSize.widthper Objective-C / Swift


non funziona per me non sta calcolando l'altezza della larghezza dell'etichetta sulla base del loro testo
Chandni,

1
Funziona perfettamente per me, anche con caratteri personalizzati!
fl034,

1
risposta perfetta per ottenere la larghezza dell'etichetta dinamica
Chetan,

52

In fretta

 yourLabel.intrinsicContentSize().width 

3
Questa risposta è valida solo per una visione che è stata
formulata

33

La risposta selezionata è corretta per iOS 6 e versioni precedenti.

In iOS 7, sizeWithFont:constrainedToSize:lineBreakMode:è stato deprecato . Si consiglia ora di utilizzare boundingRectWithSize:options:attributes:context:.

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

Si noti che il valore restituito è un CGRectnon a CGSize. Spero che sarà di qualche aiuto per le persone che lo usano in iOS 7.


12

Nella dimensione iOS8, WithFont è obsoleto, fare riferimento a

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

È possibile aggiungere tutti gli attributi desiderati in sizeWithAttributes. Altri attributi che puoi impostare:

- NSForegroundColorAttributeName
- NSParagraphStyleAttributeName
- NSBackgroundColorAttributeName
- NSShadowAttributeName

e così via. Ma probabilmente non avrai bisogno degli altri


10

Swift 4 Rispondi a chi sta usando Vincolo

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 Rispondi a chi sta usando Vincolo

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

1
Grande! Conveniente per calcolare la larghezza di UIButton in base al testo, dove intrinsicContentSize.width non funziona sempre correttamente.
nomnom

8
CGRect rect = label.frame;
rect.size = [label.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:label.font.fontName size:label.font.pointSize]}];
label.frame = rect;

2
Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti a un autore, lascia un commento sotto il suo post: puoi sempre commentare i tuoi post e una volta che avrai una reputazione sufficiente sarai in grado di commentare qualsiasi post .
The Humble Rat

questa risposta spiega come regolare le dimensioni dell'etichetta in base al testo. qual è il problema in questo?
Honey Lakhani,

2

Ecco qualcosa che mi è venuto in mente dopo aver applicato alcuni principi altri post SO, incluso il link di Aaron:

    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 questo esempio, sto aggiungendo un pin personalizzato a una classe MKAnnotation che ridimensiona un UILabel in base alle dimensioni del testo. Aggiunge anche un'immagine sul lato sinistro della vista, in modo da vedere parte del codice che gestisce la spaziatura corretta per gestire l'immagine e il riempimento.

La chiave è usare CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];e quindi ridefinire le dimensioni della vista. È possibile applicare questa logica a qualsiasi vista.

Sebbene la risposta di Aaron funzioni per alcuni, non ha funzionato per me. Questa è una spiegazione molto più dettagliata che dovresti provare immediatamente prima di andare altrove se desideri una vista più dinamica con un'immagine e UILabel ridimensionabile. Ho già fatto tutto il lavoro per te !!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.