[ios] UILabel의 글꼴 크기를 동적으로 변경

나는 현재 UILabel:

factLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 100, 280, 100)];
factLabel.text = @"some text some text some text some text";
factLabel.backgroundColor = [UIColor clearColor];
factLabel.lineBreakMode = UILineBreakModeWordWrap;
factLabel.numberOfLines = 10;
[self.view addSubview:factLabel];

내 iOS 응용 프로그램의 수명 동안 factLabel다양한 가치를 얻습니다. 문장이 여러 개이고 단어가 5 ~ 6 개만있는 경우도 있습니다.

UILabel텍스트가 항상 정의한 범위에 맞도록 글꼴 크기가 변경되도록 어떻게 설정할 수 있습니까?



답변

한 줄:

factLabel.numberOfLines = 1;
factLabel.minimumFontSize = 8;
factLabel.adjustsFontSizeToFitWidth = YES;

위의 코드는 텍스트의 글꼴 크기를 (예 : 8 레이블에 맞게 에 맞게 조정합니다.
numberOfLines = 1필수입니다.

여러 줄 :

내용 numberOfLines > 1을 마지막 텍스트의 크기를 파악하는 방법이 있는 NSString의 sizeWithFont … UIKit 첨가 방식, 예를 들어 :

CGSize lLabelSize = [yourText sizeWithFont:factLabel.font
                                  forWidth:factLabel.frame.size.width
                             lineBreakMode:factLabel.lineBreakMode];

그런 다음 lLabelSize, 예를 들어, (단, 레이블의 높이 만 변경한다고 가정) 레이블을 사용하여 레이블의 크기를 조정할 수 있습니다 .

factLabel.frame = CGRectMake(factLabel.frame.origin.x, factLabel.frame.origin.y, factLabel.frame.size.width, lLabelSize.height);

iOS6

한 줄:

iOS6부터는 minimumFontSize더 이상 사용되지 않습니다. 라인

factLabel.minimumFontSize = 8.;

다음으로 변경할 수 있습니다.

factLabel.minimumScaleFactor = 8./factLabel.font.pointSize;

IOS 7

여러 줄 :

iOS7부터는 sizeWithFont더 이상 사용되지 않습니다. 여러 줄 경우 :

factLabel.numberOfLines = 0;
factLabel.lineBreakMode = NSLineBreakByWordWrapping;
CGSize maximumLabelSize = CGSizeMake(factLabel.frame.size.width, CGFLOAT_MAX);
CGSize expectSize = [factLabel sizeThatFits:maximumLabelSize];
factLabel.frame = CGRectMake(factLabel.frame.origin.x, factLabel.frame.origin.y, expectSize.width, expectSize.height);

iOS 13 (Swift 5) :

label.adjustsFontSizeToFitWidth = true
label.minimumScaleFactor = 0.5


답변

minimumFontSizeiOS 6에서는 더 이상 사용되지 않습니다 minimumScaleFactor.

yourLabel.adjustsFontSizeToFitWidth=YES;
yourLabel.minimumScaleFactor=0.5;

레이블 및 텍스트 너비에 따라 글꼴 크기를 관리합니다.


답변

@Eyal Ben Dov의 답변에 따라 카테고리를 만들어 다른 앱에서 유연하게 사용할 수 있습니다.

Obs .: iOS 7과 호환되도록 코드를 업데이트했습니다

헤더 파일

#import <UIKit/UIKit.h>

@interface UILabel (DynamicFontSize)

-(void) adjustFontSizeToFillItsContents;

@end

구현 파일

#import "UILabel+DynamicFontSize.h"

@implementation UILabel (DynamicFontSize)

#define CATEGORY_DYNAMIC_FONT_SIZE_MAXIMUM_VALUE 35
#define CATEGORY_DYNAMIC_FONT_SIZE_MINIMUM_VALUE 3

-(void) adjustFontSizeToFillItsContents
{
    NSString* text = self.text;

    for (int i = CATEGORY_DYNAMIC_FONT_SIZE_MAXIMUM_VALUE; i>CATEGORY_DYNAMIC_FONT_SIZE_MINIMUM_VALUE; i--) {

        UIFont *font = [UIFont fontWithName:self.font.fontName size:(CGFloat)i];
        NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text attributes:@{NSFontAttributeName: font}];

        CGRect rectSize = [attributedText boundingRectWithSize:CGSizeMake(self.frame.size.width, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin context:nil];

        if (rectSize.size.height <= self.frame.size.height) {
            self.font = [UIFont fontWithName:self.font.fontName size:(CGFloat)i];
            break;
        }
    }

}

@end

-용법

#import "UILabel+DynamicFontSize.h"

[myUILabel adjustFontSizeToFillItsContents];

건배


답변

한 줄 -두 가지 방법이 있습니다. 간단하게 변경할 수 있습니다.

1- 실용적으로 (Swift 3)

다음 코드를 추가하십시오.

    yourLabel.numberOfLines = 1;
    yourLabel.minimumScaleFactor = 0.7;
    yourLabel.adjustsFontSizeToFitWidth = true;

2-UILabel 속성 관리자 사용

i- Select your label- Set number of lines 1.
ii- Autoshrink-  Select Minimum Font Scale from drop down
iii- Set Minimum Font Scale value as you wish , I have set 0.7 as in below image. (default is 0.5)

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


답변

2015 년입니다. 여러 줄에서 작동하도록 Swift를 사용하여 최신 버전의 iOS 및 XCode에 대해 수행하는 방법을 설명하는 블로그 게시물을 찾아야했습니다.

  1. “자동 축소”를 “최소 글꼴 크기”로 설정하십시오.
  2. 글꼴을 원하는 가장 큰 글꼴 크기로 설정하십시오 (20을 선택했습니다)
  3. “줄 바꿈”을 “워드 랩”에서 “꼬리 잘라 내기”로 변경하십시오.

출처 :
http://beckyhansmeyer.com/2015/04/09/autoshrinking-text-in-a-multiline-uilabel/


답변

스위프트 버전 :

textLabel.adjustsFontSizeToFitWidth = true
textLabel.minimumScaleFactor = 0.5


답변

UILabel의 Swift 확장 기능은 다음과 같습니다. 이진 검색 알고리즘을 실행하여 레이블 경계의 너비와 높이를 기준으로 글꼴 크기를 조정합니다. iOS 9 및 자동 레이아웃과 작동하도록 테스트되었습니다.

사용법 :<label> 글꼴 크기 조정이 필요한 사전 정의 된 UILabel은 어디에 있습니까?

<label>.fitFontForSize()

기본적으로이 기능은 5pt 및 300pt 글꼴 크기 범위 내에서 검색하고 해당 범위 내에서 텍스트를 “완벽하게”맞도록 글꼴을 설정합니다 (1.0pt 내 정확함). 예를 들어 다음과 같은 방법으로 1pt레이블의 현재 글꼴 크기0.1pts 내 에서 정확하게 검색하도록 매개 변수를 정의 할 수 있습니다 .

<label>.fitFontForSize(1.0, maxFontSize: <label>.font.pointSize, accuracy:0.1)

다음 코드를 파일에 복사 / 붙여 넣기

extension UILabel {

    func fitFontForSize(var minFontSize : CGFloat = 5.0, var maxFontSize : CGFloat = 300.0, accuracy : CGFloat = 1.0) {
        assert(maxFontSize > minFontSize)
        layoutIfNeeded() // Can be removed at your own discretion
        let constrainedSize = bounds.size
        while maxFontSize - minFontSize > accuracy {
            let midFontSize : CGFloat = ((minFontSize + maxFontSize) / 2)
            font = font.fontWithSize(midFontSize)
            sizeToFit()
            let checkSize : CGSize = bounds.size
            if  checkSize.height < constrainedSize.height && checkSize.width < constrainedSize.width {
                minFontSize = midFontSize
            } else {
                maxFontSize = midFontSize
            }
        }
        font = font.fontWithSize(minFontSize)
        sizeToFit()
        layoutIfNeeded() // Can be removed at your own discretion
    }

}

참고 :layoutIfNeeded()통화는 자신의 재량에 따라 제거 할 수 있습니다