2010-08-20 24 views

Odpowiedz

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

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

to pytanie może mieć swoją odpowiedź, że pracował dla mnie.


W 2014 roku edytowałem w nowej wersji, na podstawie niezwykle przydatnego komentarza Norberta poniżej! To robi wszystko. Cheers

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

Tylko uwaga: to nie jest zalecane, ponieważ iOS7. Preferowanym sposobem jest teraz: '[yourString boundingRectWithSize: maximumLabelSize options: NSStringDrawingUsesLineFragmentOrigin attributes: @ {NSFontAttributeName: yourLabel.font} context: nil]; ' – Norbert

+16

Możesz także użyć właściwości IntrinsicContentSize. Nie jestem dużo w Objective-C, ale powinno to być coś takiego: 'self.yourLabel.intrinsicContentSize' To daje wielkość treści etykiet, więc można po prostu uzyskać szerokość stamtąd . – Boris

1

Oto coś wpadłem po zastosowaniu kilku zasad inne SO posty, w tym Aarona 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]; 

W tym przykładzie Dodaję niestandardową pin do klasy MKAnnotation że zmienia rozmiar UILabel zgodnie z rozmiarem tekstu. Dodaje także obraz po lewej stronie widoku, więc widzisz część kodu zarządzającego odpowiednim odstępem, aby obsłużyć obraz i dopełnienie.

Kluczem jest użycie CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];, a następnie ponowne zdefiniowanie wymiarów widoku. Możesz zastosować tę logikę do dowolnego widoku.

Chociaż odpowiedź Aarona działa dla niektórych, to nie działa dla mnie. Jest to znacznie bardziej szczegółowe wyjaśnienie, które należy wypróbować bezpośrednio przed udaniem się gdzie indziej, jeśli chcesz uzyskać bardziej dynamiczny widok z obrazem i skalowalną wersją UILabel. Zrobiłem już dla ciebie całą pracę !!

32

Wybrana odpowiedź jest poprawna dla iOS 6 i poniżej.

W iOS 7, sizeWithFont:constrainedToSize:lineBreakMode: został przestarzały. Zaleca się teraz użycie boundingRectWithSize:options:attributes:context:.

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

Zauważ, że wartość zwracana jest nie CGRectCGSize. Mam nadzieję, że to będzie jakiś pomocy dla osób stosujących go w iOS 7.

88

yourLabel.intrinsicContentSize.width dla Objective-C/Swift

+3

To działa zbyt dobrze. – Krekin

+3

Woot! To najłatwiejszy sposób. – Echelon

+3

Działa jak wdzięk – daleijn

10

W systemów iOS 8 sizeWithFont została zaniechana, należy zapoznać się

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

Możesz dodać wszystkie atrybuty, które chcesz w rozmiarzeWithAttributes. Inne atrybuty można ustawić:

- NSForegroundColorAttributeName 
- NSParagraphStyleAttributeName 
- NSBackgroundColorAttributeName 
- NSShadowAttributeName 

i tak dalej. Ale prawdopodobnie nie będzie potrzebował innych

42

W szybkiej

yourLabel.intrinsicContentSize().width 
+2

również pracuję nad UIButtonem. –

+1

Świetne +1 za najprostszą odpowiedź !! – 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

Nie zapewnia to odpowiedzi na pytanie. Aby skrytykować lub poprosić o wyjaśnienie od autora, zostaw komentarz pod swoim postem - zawsze możesz komentować swoje posty, a gdy już masz wystarczającą [reputację] (http://stackoverflow.com/help/whats-reputation), być w stanie [komentować dowolny wpis] (http://stackoverflow.com/help/privileges/comment). –

+0

ta odpowiedź wyjaśnia, jak dostosować rozmiar etykiety zgodnie z tekstem. W czym problem? –