2010-08-20 8 views

Antwort

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

What is -[NSString sizeWithFont:forWidth:lineBreakMode:] good for?

diese Frage Ihre Antwort haben könnte, es funktionierte für mich.


Für das Jahr 2014 habe ich in dieser neuen Version, basierend auf dem ultra-handlichen Kommentar von Norbert unten bearbeitet! 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); 
+41

Nur eine Anmerkung: Dies ist seit iOS7 veraltet. Der bevorzugte Weg ist nun: '[yourString boundingRectWithSize: maximumLabelSize Optionen: NSStringDrawingUsesLineFragmentOrigin Attribute: @ {NSFontAttributeName: yourLabel.font} context: nil]; ' – Norbert

+16

Sie können auch die IntrinsicContentSize-Eigenschaft verwenden. Ich bin nicht viel in Objective-c, aber es sollte wie folgt sein: 'self.yourLabel.intrinsicContentSize' Dies wird Ihnen die Größe des Etiketts Inhalt geben, so dass Sie nur die Breite von dort bekommen können . – Boris

1

Hier ist etwas, was ich kam mit nach ein paar Prinzipien anderen SO Beiträge Anwendung, darunter Aaron 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 ich einen benutzerdefinierten Stift auf eine MKAnnotation Klasse hinzu, dass Ändert die Größe eines UILabels entsprechend der Textgröße. Es fügt auch ein Bild auf der linken Seite der Ansicht hinzu, so dass Sie einen Teil des Codes sehen, der den richtigen Abstand zum Umgang mit dem Bild und dem Padding verwaltet.

Der Schlüssel besteht darin, 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 es bei mir nicht funktioniert. Dies ist eine viel detailliertere Erklärung, die Sie sofort ausprobieren sollten, bevor Sie irgendwo anders hingehen, wenn Sie eine dynamischere Ansicht mit einem Bild und resizierbaren UILabel möchten. Ich habe schon die ganze Arbeit für dich erledigt !!

32

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

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

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

Beachten Sie, dass der Rückgabewert ist ein CGRect kein CGSize. Hoffentlich werde von einigen Hilfe für Menschen sein, indem es in iOS 7.

88

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

+3

Das funktioniert viel zu gut. – Krekin

+3

Woot! Dies ist bei weitem der einfachste Weg. – Echelon

+3

Funktioniert wie ein Charme – daleijn

10

In iOS8 sizeWithFont veraltet ist, lesen Sie bitte

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

42

In swift

yourLabel.intrinsicContentSize().width 
+2

arbeitet auch an UIButton. –

+1

Großartig +1 für die einfachste Antwort !! – iUser

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

Dies liefert keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlasse einen Kommentar unter seinem Beitrag - du kannst deine eigenen Beiträge jederzeit kommentieren, und sobald du genügend [Reputation] (http://stackoverflow.com/help/whats-reputation) hast, wirst du das tun in der Lage sein [jeden Beitrag kommentieren] (http://stackoverflow.com/help/privileges/comment). –

+0

Diese Antwort zeigt, wie die Etikettengröße entsprechend dem Text angepasst werden kann. Was ist das Problem? –

Verwandte Themen