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

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

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



답변

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


답변

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

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


답변

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

단계

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

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

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

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

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

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

답변

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

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

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

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

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

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

노트

  • 너비와 높이에 대한 구속 조건을 추가하지 마십시오. 레이블은 텍스트 내용에 따라 고유 한 크기를 갖습니다 .
  • 이에 대한 도움을 주신이 답변 에 감사드립니다 .
  • 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 을 참조하십시오 .

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


답변

[label sizeToFit];UILabel에서 텍스트를 조정하는 데 사용


답변

위의 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];
}


답변

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

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

    label.sizeToFit()
    label.layoutIfNeeded()

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