UILabel-텍스트에 맞게 자동 크기 레이블?


144

포함 된 텍스트에 맞게 UILabel 상자 / 바운드의 크기를 자동으로 조정할 수 있습니까? (디스플레이보다 큰 경우에는 신경 쓰지 않습니다)

따라서 사용자가 "hello"를 입력하거나 "내 이름이 정말로 길어서이 상자에 맞추기를 원합니다"라고하면 절대 잘리지 않으며 레이블이 '넓어집니다'?


누구든지 빠른 코드를 제공하도록 도와주세요 ..
Angel F Syrus

답변:


98

UILabel매우 비슷한 것을 위해 카테고리를 만든 곳에서 요점을 확인하십시오 . 내 카테고리는 UILabel모든 내용을 보여주기 위해 높이를 늘릴 수 있습니다 : https://gist.github.com/1005520

또는이 게시물을 확인하십시오 : https://stackoverflow.com/a/7242981/662605

이것은 높이를 늘릴 것이지만 다른 방법으로 작업하기 위해 쉽게 바꿀 수 있으며 이와 같은 것으로 너비를 늘릴 수 있습니다.

@implementation UILabel (dynamicSizeMeWidth)

- (void)resizeToStretch{
    float width = [self expectedWidth];
    CGRect newFrame = [self frame];
    newFrame.size.width = width;
    [self setFrame:newFrame];
}

- (float)expectedWidth{
    [self setNumberOfLines:1];

    CGSize maximumLabelSize = CGSizeMake(CGRectGetWidth(self.bounds), CGFLOAT_MAX);

    CGSize expectedLabelSize = [[self text] sizeWithFont:[self font] 
                                            constrainedToSize:maximumLabelSize
                                            lineBreakMode:[self lineBreakMode]]; 
    return expectedLabelSize.width;
}

@end

클래스 sizeToFit에서 사용할 수 있는 메소드를 더 간단하게 사용할 수 UIView있지만 행 수를 1로 설정하여 안전합니다.


iOS 6 업데이트

자동 레이아웃을 사용하는 경우 기본 제공 솔루션이 있습니다. 줄 수를 0으로 설정하면 프레임 워크가 텍스트에 맞게 레이블의 크기를 적절하게 조정합니다 (높이 추가).


iOS 8 업데이트

sizeWithFont:더 이상 사용되지 않으므로 sizeWithAttributes:대신 사용하십시오.

- (float)expectedWidth{
    [self setNumberOfLines:1];

    CGSize expectedLabelSize = [[self text] sizeWithAttributes:@{NSFontAttributeName:self.font}];

    return expectedLabelSize.width;
}

8
iOS 6 AutoLayout 방법을 사용하여 제거 할 수없는 레이블의 높이 제한이 생겼습니다. 높이 제한 조건의 관계를 '보다 크거나 같음'으로 설정하면 높이가 커질 수 있습니다.
Michael Luton

2
sizeWithFont : constrainedToSize : lineBreakMode : ios 7에서 사용되지 않는 방법
Karan Alangat

1
텍스트가 적거나 많을 때 UILabel 자체 크기가 조정되지 않습니다. 자동 레이아웃을 사용하고 있습니다. UILabel 작성을 시도했지만 cellForRowAtIndex가 초기화 될 때마다 작성됩니다. 많은 것을 시도했다. 나를 위해 아무것도 작동하지 않습니다. uilabel의 배경은 같은 너비를 갖습니다. 도와주세요 !!!
coreDeviOS

@Daniel 나는 줄 수를 0으로 설정했지만 작동하지 않습니다. 수평 및 수직 중심의 구속 조건을 설정했습니다. 내가 한 또 다른 일은 UILABEL의 서브 클래스를 만들어 그 레이블에 사용하는 것입니다
Jasmeet

자동 레이아웃을 사용하는 가장 간단한 해결책은 다음과 같습니다. (1) 라인을 0으로 설정, (2) 상수 0을 사용하여 너비 제한을 "보다 크거나 같음"으로 설정, (3) 상수 0을 사용하여 높이 제한을 "보다 크거나 같음"으로 설정 4) 평상시와 같이 수평 및 수직 중앙에 정렬합니다.
Erik van der Neut

76

를 사용 [label sizeToFit];하면 Daniels 카테고리에서 동일한 결과를 얻을 수 있습니다.

자동 레이아웃을 사용하고 제약 조건에 따라 레이블 크기를 조정하는 것이 좋습니다.


3
swift를 사용할 때 dispatch_async (dispatch_get_main_queue (), {})를 사용하여 메인 스레드에서 이것을 실행해야했습니다.
Zeezer

@Zeezer 왜 그런지 아십니까?
FurloSK

13
@FurloSK ui의 모든 변경 사항은 메인 스레드에서 수행해야합니다.
길 레르 메 토레스 카스트로

32

우리가 원한다면 UILabel 다음 자동 레이아웃과 스토리 보드 텍스트 크기에 따라 축소 및 확대해야 최선의 방법입니다. 이를 달성하기위한 단계는 다음과 같습니다.

단계

  1. UILabel을 뷰 컨트롤러에 넣고 원하는 위치에 배치하십시오. 또한 넣어 0위해 numberOfLines의 특성 UILabel.

  2. 상단, 선행 및 후행 공간 핀 구속 조건을 지정하십시오.

여기에 이미지 설명을 입력하십시오

  1. 이제 경고가 나타납니다. 노란색 화살표를 클릭하십시오.

여기에 이미지 설명을 입력하십시오

  1. 를 클릭 Update Frame하고를 클릭하십시오 Fix Misplacement. 이제이 UILabel은 텍스트가 적 으면 축소되고 텍스트가 많으면 확장됩니다.

1
현지화를 테스트하지는 않았지만 작동합니다.
Yogesh Suthar

2
"기본 너비" "명시 적"확인란의 선택을 취소 할 때까지 기존 프로젝트에서이 작업을 수행 할 수 없었습니다.
zorro2b

25

이것은 다른 답변 중 일부만큼 복잡하지 않습니다.

여기에 이미지 설명을 입력하십시오

왼쪽과 위쪽 가장자리를 고정

자동 레이아웃을 사용하여 라벨의 왼쪽과 상단을 고정하는 구속 조건을 추가하십시오.

여기에 이미지 설명을 입력하십시오

그 후 자동으로 크기가 조정됩니다.

노트

  • 너비와 높이에 대한 구속 조건을 추가하지 마십시오. 레이블은 텍스트 내용에 따라 고유 한 크기를 갖습니다 .
  • 이에 대한 도움을 주신이 답변 에 감사드립니다 .
  • sizeToFit자동 레이아웃을 사용할 때 설정할 필요가 없습니다 . 예제 프로젝트에 대한 완전한 코드는 다음과 같습니다.

    import UIKit
    class ViewController: UIViewController {
    
        @IBOutlet weak var myLabel: UILabel!
    
        @IBAction func changeTextButtonTapped(sender: UIButton) {
            myLabel.text = "my name is really long i want it to fit in this box"
        }
    }
  • 레이블을 줄 바꿈하려면 IB에서 줄 수를 0으로 설정하고 myLabel.preferredMaxLayoutWidth = 150 // or whatever코드를 추가하십시오 . (또한 레이블 높이가 증가 할 때 아래로 이동하도록 단추를 레이블 아래쪽에 고정했습니다.)

여기에 이미지 설명을 입력하십시오

  • 내부에서 동적으로 크기를 조정하는 레이블을 찾고 있다면 이 답변UITableViewCell 을 참조하십시오 .

여기에 이미지 설명을 입력하십시오


안녕하세요, 크기가 조정 된 레이블이 있지만 셀 높이의 크기를 조정하는 방법을 이해할 수 없습니다. 셀 높이 크기를 조정하는 방법을 알려주십시오.
Vivek

@Vivek, 높이에 제약 조건이 설정되어 있지 않으면 자동으로 크기가 조정되어야합니다.
Suragch

예, 그러나 어떻게 사용자 정의 셀을 사용하고 셀에 2 개의 레이블을 넣을 수 있습니다.
Vivek

@Vivek, 죄송합니다. 질문을 잘못 읽었습니다. 이 답변을 통해 하나의 레이블이 작동 합니까?
Suragch


5

위의 Daniel의 답변을 기반으로 몇 가지 방법을 만들었습니다.

-(CGFloat)heightForLabel:(UILabel *)label withText:(NSString *)text
{
    CGSize maximumLabelSize     = CGSizeMake(290, FLT_MAX);

    CGSize expectedLabelSize    = [text sizeWithFont:label.font
                                constrainedToSize:maximumLabelSize
                                    lineBreakMode:label.lineBreakMode];

    return expectedLabelSize.height;
}

-(void)resizeHeightToFitForLabel:(UILabel *)label
{
    CGRect newFrame         = label.frame;
    newFrame.size.height    = [self heightForLabel:label withText:label.text];
    label.frame             = newFrame;
}

-(void)resizeHeightToFitForLabel:(UILabel *)label withText:(NSString *)text
{
    label.text              = text;
    [self resizeHeightToFitForLabel:label];
}

5

내가 찾은 것은 내 상황에 맞는 작품입니다.

1) UILabel의 높이는 자동 레이아웃을 사용하여> = 0 제약 조건을 갖습니다. 너비는 고정되어 있습니다. 2) 텍스트를 UILabel에 할당하십시오. UILabel에는 해당 시점에서 이미 감독이 있습니다 (얼마나 중요한지 확실하지 않음). 3) 다음을 수행하십시오.

    label.sizeToFit()
    label.layoutIfNeeded()

라벨 높이가 이제 적절하게 설정되었습니다.


3
@implementation UILabel (UILabel_Auto)

- (void)adjustHeight {

    if (self.text == nil) {
        self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.bounds.size.width, 0);
        return;
    }

    CGSize aSize = self.bounds.size;
    CGSize tmpSize = CGRectInfinite.size;
    tmpSize.width = aSize.width;

    tmpSize = [self.text sizeWithFont:self.font constrainedToSize:tmpSize];

    self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, aSize.width, tmpSize.height);
}

@end

이것은 카테고리 방법입니다. UILabel의 높이를 조정하려면이 메소드를 호출하는 것보다 먼저 텍스트를 설정해야합니다.


2

텍스트 및 기타 관련 컨트롤에 따라 두 가지 방법으로 레이블 크기를 지정할 수 있습니다.

  1. iOS 7.0 이상

    CGSize labelTextSize = [labelText boundingRectWithSize:CGSizeMake(labelsWidth, MAXFLOAT)
                                              options:NSStringDrawingUsesLineFragmentOrigin
                                           attributes:@{
                                                        NSFontAttributeName : labelFont
                                                        }
                                              context:nil].size;

iOS 7.0 이전에는 레이블 크기를 계산하는 데 사용할 수있었습니다

CGSize labelTextSize = [label.text sizeWithFont:label.font 
                            constrainedToSize:CGSizeMake(label.frame.size.width, MAXFLOAT)  
                                lineBreakMode:NSLineBreakByWordWrapping];

// labelTextHeight를 기반으로 다른 컨트롤을 재구성

CGFloat labelTextHeight = labelTextSize.height;
  1. 레이블 텍스트의 크기를 계산하지 않으려면 UILabel 인스턴스에서 -sizeToFit을 다음과 같이 사용할 수 있습니다.

    [label setNumberOfLines:0]; // for multiline label
    [label setText:@"label text to set"];
    [label sizeToFit];// call this to fit size of the label according to text

//이 후에 다른 관련 컨트롤을 재구성하기 위해 레이블 프레임을 얻을 수 있습니다.


2
  1. 스토리 보드에 누락 된 구속 조건을 추가하십시오.
  2. 스토리 보드에서 UILabel을 선택하고 "Line"속성을 0으로 설정하십시오.
  3. id : label을 사용하여 UILabel을 Controller.h에 출력합니다.
  4. Controller.m 및 [label sizeToFit];viewDidLoad에 추가

1

자동 레이아웃에 큰 문제가있었습니다. 테이블 셀 안에 두 개의 컨테이너가 있습니다. 두 번째 컨테이너는 항목 설명 (0-1000 자)에 따라 크기가 조정되며이를 기준으로 행의 크기를 조정해야합니다.

누락 된 성분은 설명에 대한 제약 조건이었습니다.

동적 요소의 하단 제약 조건을 = 0 에서 > = 0으로 변경했습니다 .


이것은 내 생명을 구했습니다. github.com/honghaoz/… 를 따르려고한다면 이것이 정답입니다.
Justin Fyles

0

매번 적합합니다! :)

    name.text = @"Hi this the text I want to fit to"
    UIFont * font = 14.0f;
    CGSize size = [name.text sizeWithAttributes:@{NSFontAttributeName: font}];
    nameOfAssessment.frame = CGRectMake(400, 0, size.width, 44);
    nameOfAssessment.font = [UIFont systemFontOfSize:font];

0

한 줄 출력을 표시 한 다음 속성 Line = 0 을 설정 하고 여러 줄 출력을 표시 한 다음 속성 Line = 1 이상 을 설정할 수 있습니다

[self.yourLableName sizeToFit];

-1

이 접근법도 있습니다.

[self.myLabel changeTextWithAutoHeight:self.myStringToAssignToLabel width:180.0f];

이 답변을 내리는 사람은 내가 아니었지만에 대한 changeTextWithAutoHeight:width:방법을 볼 수 없다는 것을 지적하고 싶었 습니다 UILabel. UIKit 문서에서이 방법을 찾을 수있는 링크를 제공 할 수 있습니까?
Adil Hussain
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.