Chcę wyświetlić obraz obok UILabel, jednak UILabel ma zmienną długość tekstu, więc nie wiem, gdzie umieścić obraz. Jak mogę to zrobić?Jak obliczyć szerokość UILabel na podstawie długości tekstu?
Odpowiedz
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);
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ę !!
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 CGRect
CGSize
. Mam nadzieję, że to będzie jakiś pomocy dla osób stosujących go w iOS 7.
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
W szybkiej
yourLabel.intrinsicContentSize().width
również pracuję nad UIButtonem. –
Świetne +1 za najprostszą odpowiedź !! – iUser
CGRect rect = label.frame;
rect.size = [label.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:label.font.fontName size:label.font.pointSize]}];
label.frame = rect;
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). –
ta odpowiedź wyjaśnia, jak dostosować rozmiar etykiety zgodnie z tekstem. W czym problem? –
Tylko uwaga: to nie jest zalecane, ponieważ iOS7. Preferowanym sposobem jest teraz: '[yourString boundingRectWithSize: maximumLabelSize options: NSStringDrawingUsesLineFragmentOrigin attributes: @ {NSFontAttributeName: yourLabel.font} context: nil]; ' – Norbert
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