텍스트 길이를 기준으로 UILabel 너비를 계산하는 방법은 무엇입니까?


142

UILabel 옆에 이미지를 표시하고 싶지만 UILabel에는 가변 텍스트 길이가 있으므로 이미지를 배치 할 위치를 모릅니다. 어떻게하면됩니까?

답변:


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

-[NSString sizeWithFont : forWidth : lineBreakMode :]는 무엇입니까?

이 질문에 답이있을 수도 있습니다.


2014 년에는 아래 Norbert의 매우 유용한 의견을 바탕으로이 새 버전으로 편집했습니다! 이것은 모든 것을한다. 건배

// 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
참고 사항 : 이것은 iOS7부터 더 이상 사용되지 않습니다. 현재 선호되는 방식은 다음과 같습니다.[yourString boundingRectWithSize:maximumLabelSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{ NSFontAttributeName:yourLabel.font } context:nil];
Norbert

17
IntrinsicContentSize 속성을 사용할 수도 있습니다. 나는 Objective-c에별로 익숙하지 않지만 다음과 같아야합니다. self.yourLabel.intrinsicContentSize 이것은 레이블 내용의 크기를 제공하므로 너비를 얻을 수 있습니다.
보리스

1
그냥 yourLabel.intrinsicContentSize.width아래 큰, 체크 대답을 사용할 수 있습니다.
denis_lor 2018

156

yourLabel.intrinsicContentSize.width위한 오브젝티브 C / 스위프트


나를 위해 작동하지 않습니다 그것은 텍스트를 기준으로 라벨의 너비 높이를 계산하지 않습니다
Chandni

1
사용자 정의 글꼴로도 완벽하게 작동합니다!
fl034

1
다이내믹 라벨의 폭을
넓히기

52

신속하게

 yourLabel.intrinsicContentSize().width 

3
이 답변은 배치 된보기에만 유효합니다.
rommex

33

선택한 답변은 iOS 6 이하에서 정확합니다.

아이폰 OS 7 년 sizeWithFont:constrainedToSize:lineBreakMode:되었습니다 되지 않습니다 . 이제 사용하는 것이 좋습니다 boundingRectWithSize:options:attributes:context:.

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

반환 값은 a가 CGRect아닙니다 CGSize. 잘만되면 그것은 iOS 7에서 그것을 사용하는 사람들에게 도움이 될 것입니다.


12

iOS8에서 sizeWithFont는 더 이상 사용되지 않습니다.

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

sizeWithAttributes에 원하는 모든 속성을 추가 할 수 있습니다. 설정할 수있는 다른 속성 :

- NSForegroundColorAttributeName
- NSParagraphStyleAttributeName
- NSBackgroundColorAttributeName
- NSShadowAttributeName

등등. 그러나 아마도 당신은 다른 사람들이 필요하지 않을 것입니다


10

Swift 4 제약 조건을 사용하는 사람에게 답변

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 제약 조건을 사용하는 사람에게 답변

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
큰! intrinsicContentSize.width가 항상 올바르게 작동하지 않는 텍스트에 따라 UIButton의 너비를 계산하는 데 편리합니다.
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
이것은 질문에 대한 답변을 제공하지 않습니다. 작성자의 의견을 비판하거나 설명을 요청하려면 게시물 아래에 댓글을 남겨주세요. 언제든지 자신의 게시물 에 댓글 수 있으며 평판 이 충분 하면 게시물댓글 수 있습니다 .
겸손한 쥐

이 답변은 텍스트에 따라 레이블 크기를 조정하는 방법을 알려줍니다. 이 문제는 무엇입니까?
Honey Lakhani

2

다음은 Aaron의 링크를 포함하여 다른 SO 게시물 몇 가지 원칙을 적용한 후에 생각해 낸 것입니다.

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

이 예제에서는 텍스트 크기에 따라 UILabel의 크기를 조정하는 MKAnnotation 클래스에 사용자 정의 핀을 추가합니다. 또한 뷰의 왼쪽에 이미지를 추가하므로 이미지와 패딩을 처리하기 위해 적절한 간격을 관리하는 코드가 있습니다.

핵심은 CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];뷰의 치수 를 사용 하고 재정의하는 것입니다. 이 논리를 모든보기에 적용 할 수 있습니다.

Aaron의 답변은 일부에게는 효과가 있지만 나에게는 효과가 없었습니다. 이미지와 크기 조정이 가능한 UILabel을 사용하여보다 역동적 인보기를 원한다면 다른 곳으로 가기 전에 즉시 시도해야하는 훨씬 자세한 설명입니다. 나는 이미 당신을 위해 모든 일을했습니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.