Metin uzunluğuna göre UILabel genişliği nasıl hesaplanır?


142

Ben UILabel yanında bir görüntü görüntülemek istiyorum, ancak UILabel değişken metin uzunluğu vardır, bu yüzden görüntü nereye yerleştirmek bilmiyorum. Bunu nasıl başarabilirim?

Yanıtlar:


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

- [NSString sizeWithFont: forWidth: lineBreakMode:] ne işe yarar?

bu sorunun cevabı olabilir, benim için çalıştı.


2014 için, aşağıdaki Norbert'in ultra kullanışlı yorumuna dayanarak bu yeni sürümde düzenledim! Bu her şeyi yapar. Şerefe

// 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
Sadece bir not: Bu iOS7'den beri kullanımdan kaldırıldı. Şimdi tercih edilen yol:[yourString boundingRectWithSize:maximumLabelSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{ NSFontAttributeName:yourLabel.font } context:nil];
Norbert

17
Ayrıca IntrinsicContentSize özelliğini de kullanabilirsiniz. Objective-c'ye pek fazla dahil değilim, ama böyle bir şey olmalı: self.yourLabel.intrinsicContentSize Bu size etiket içeriğinin boyutunu verecektir, böylece genişliği oradan alabilirsiniz.
Boris

1
Sadece yourLabel.intrinsicContentSize.widthharika çalışıyor, aşağıdaki cevabı kontrol edin.
denis_lor

156

yourLabel.intrinsicContentSize.widthiçin Amaç-C / Swift


benim için çalışmaz, metnin temelinde etiketin genişlik yüksekliğini hesaplamıyor
Chandni

1
Özel yazı tipi ile de benim için mükemmel çalışıyor!
fl034

1
dinamik etiket genişliği elde etmek için mükemmel cevap
Chetan

52

Hızlı

 yourLabel.intrinsicContentSize().width 

3
Bu cevap yalnızca ortaya konan bir görünüm için geçerlidir
rommex

33

Seçilen cevap iOS 6 ve önceki sürümler için doğrudur.

İOS 7'de, sizeWithFont:constrainedToSize:lineBreakMode:olmuştur kaldırılmış . Şimdi kullanmanız tavsiye edilir boundingRectWithSize:options:attributes:context:.

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

Dönüş değerinin a CGRectolmadığını unutmayın CGSize. Umarım bu iOS 7'de kullanan insanlar için biraz yardımcı olacaktır.


12

İOS8 boyutundaWithFont kullanımdan kaldırıldı, lütfen

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

SizeWithAttributes boyutunda istediğiniz tüm nitelikleri ekleyebilirsiniz. Ayarlayabileceğiniz diğer özellikler:

- NSForegroundColorAttributeName
- NSParagraphStyleAttributeName
- NSBackgroundColorAttributeName
- NSShadowAttributeName

ve bunun gibi. Ama muhtemelen diğerlerine ihtiyacınız olmayacak


10

Kısıtlama kullanan Swift 4 Cevap

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

Kısıtlama kullanan Swift 5 Cevap

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
Harika! İntrinsicContentSize.width öğesinin her zaman düzgün çalışmadığı metne göre UIButton genişliğini hesaplamak için uygundur.
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
Bu soruya bir cevap sağlamaz. Bir yazarın eleştirisini yapmak veya açıklama istemek için yazılarının altına bir yorum bırakın - her zaman kendi yayınlarınıza yorum yapabilirsiniz ve yeterli bir üne sahip olduğunuzda herhangi bir yazı hakkında yorum yapabilirsiniz .
Mütevazi Sıçan

bu cevap, etiket boyutunun metne göre nasıl ayarlanacağını anlatır. buradaki problem nedir?
Honey Lakhani

2

Aaron'un bağlantısı da dahil olmak üzere diğer SO yayınlarının birkaç ilkesini uyguladıktan sonra ortaya koyduğum bir şey:

    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];

Bu örnekte, bir MKAnnotation sınıfına metin boyutuna göre bir UILabel'ı yeniden boyutlandıran özel bir iğne ekliyorum. Ayrıca görünümün sol tarafına bir görüntü ekler, böylece görüntüyü ve dolguyu işlemek için uygun aralığı yöneten bazı kodları görürsünüz.

Anahtar CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];görünümün boyutlarını kullanmak ve daha sonra yeniden tanımlamaktır. Bu mantığı herhangi bir görünüme uygulayabilirsiniz.

Aaron'un cevabı bazılarına rağmen, benim için işe yaramadı. Bu, bir görüntü ve yeniden boyutlandırılabilir UILabel ile daha dinamik bir görünüm istiyorsanız, başka bir yere gitmeden hemen önce denemeniz gereken çok daha ayrıntılı bir açıklamadır. Senin için zaten tüm işleri yaptım !!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.