programing

UILabel이 레이블 크기에 맞게 텍스트를 자동 축소하지 않습니다.

goodsources 2023. 4. 16. 15:01
반응형

UILabel이 레이블 크기에 맞게 텍스트를 자동 축소하지 않습니다.

이상한 문제가 있어서 8시간 넘게 고민하고 있어요.해야 합니다.UILabels으로 조정하고 있습니다.
: ★
친구UIViewController가 바뀝니다.UILabels네, 이렇게요.의 ★★★★의 UILabel가 작아지고 사이즈는 , 내내 텍스트, 내 텍스트는...UILabel이치가 글자에 맞게 .UILabel 하면 제에 맞는 수 autoshrinking뭐런거?

의 마마 my에서는xib,UILabels autoshrink체크되어 행수도 0으로 설정되어 있습니다.또한 문자열에는 새로운 행 기호(\n)가 있으며 line break mode를 선택하고 있습니다.wordwrap지금 나와 같은 상황에 처한 사람이 있다면, 나를 도와줄 수 있지 않을까?이치노

잘 부탁드립니다!

★★★★★★ UILabel 크기가 .

아직 더 나은 솔루션을 찾고 있는 경우, 저는 당신이 원하는 것이 다음과 같이 하십시오.

필요가 부울 값이 속성은 " " "가 유효한 합니다).numberOfLines속성이 1)로 설정됩니다.

는, 「」를 참조해 주세요.minimumScaleFactor0.5로 줄임말하다.

재빠르다

var adjustsFontSizeToFitWidth: Bool { get set }

목표-C

@property(nonatomic) BOOL adjustsFontSizeToFitWidth;

레이블 테두리 직사각형 내의 문자열에 맞도록 문자 사이의 간격을 조정해야 하는지 여부를 나타내는 부울 값입니다.

재빠르다

var allowsDefaultTighteningForTruncation: Bool { get set }

목표-C

@property(nonatomic) BOOL allowsDefaultTighteningForTruncation;

출처.

UILABEL을 얻을 수 .Autoshrink Storyboard로부터의는) 9.2, 7. (6s Plus Storyboard의 4s)입니다.

여기에 이미지 설명 입력

  • 행수는 0 입니다.
  • 줄 바꿈: 클립
  • 자동링크: 최소 글꼴 스케일 0.25

minimumFontSize6에서 되지 않습니다.

★★★★★★★★★★★★를 사용해 주세요.minimumScaleFactorminmimumFontSize.

lbl.adjustsFontSizeToFitWidth = YES
lbl.minimumScaleFactor = 0.5

스위프트 5

lbl.adjustsFontSizeToFitWidth = true
lbl.minimumScaleFactor = 0.5

또한 저의 솔루션은 boolean label.adjustsFontSizeToFitWidth = YES; BUT입니다.인터페이스 Builder에서 Word Wraping 스위치를 "CLIP"로 만들어야 합니다.그런 다음 라벨을 자동 링크합니다.이것은 굉장히 중요합니다.

Swift 3에서는 (프로그래밍 방식으로) 이렇게 해야 했습니다.

let lbl = UILabel()
lbl.numberOfLines = 0
lbl.lineBreakMode = .byClipping
lbl.adjustsFontSizeToFitWidth = true
lbl.minimumScaleFactor = 0.5
lbl.font = UIFont.systemFont(ofSize: 15)

다음과 같이 쓸 수 있습니다.

UILabel *reviews = [[UILabel alloc]initWithFrame:CGRectMake(14, 13,270,30)];//Set frame
reviews.numberOfLines=0;
reviews.textAlignment = UITextAlignmentLeft;
reviews.font = [UIFont fontWithName:@"Arial Rounded MT Bold" size:12];
reviews.textColor=[UIColor colorWithRed:0.0/255.0 green:0.0/255.0 blue:0.0/255.0 alpha:0.8]; 
reviews.backgroundColor=[UIColor clearColor];

그런 식으로 줄 수를 계산할 수 있습니다.

CGSize maxlblSize = CGSizeMake(270,9999);
CGSize totalSize = [reviews.text sizeWithFont:reviews.font 
              constrainedToSize:maxlblSize lineBreakMode:reviews.lineBreakMode];

CGRect newFrame =reviews.frame;
newFrame.size.height = totalSize.height;
reviews.frame = newFrame;

CGFloat reviewlblheight = totalSize.height;

int lines=reviewlblheight/12;//12 is the font size of label

UILabel *lbl=[[UILabel alloc]init];
lbl.frame=CGRectMake(140,220 , 100, 25);//set frame as your requirement
lbl.font=[UIFont fontWithName:@"Arial" size:20];
[lbl setAutoresizingMask:UIViewContentModeScaleAspectFill];
[lbl setLineBreakMode:UILineBreakModeClip];
lbl.adjustsFontSizeToFitWidth=YES;//This is main for shrinking font
lbl.text=@"HelloHelloHello";

이것이 당신에게 도움이 되기를 바랍니다:-) 당신의 답장을 기다립니다.

결국 나는 내 답을 찾지 못했다.그리고 자동 링크는 여러 회선에서는 작동하지 않는 것 같습니다.이 링크에서 제안사항을 사용하게 되었습니다: 여러 개의 회선이 있는 UILabel의 autoshrink

해결 방법은 텍스트 높이를 지정된 너비로 계산하고 텍스트가 더 큰 경우 글꼴 크기를 줄인 다음 높이가 필요한 크기보다 같거나 작을 때까지 동일한 작업을 다시 수행하는 것입니다.

나는 왜 이것이 그렇게 구현하기 어려운지 이해할 수 없다.부족한 점이 있으면 누구나 정정해 주세요:)

이는 Xcode 8.2.1(8C1002)을 실행하고 있는Swift 3용입니다.

제가 찾은 최고의 해결책은 라벨의 Storyboard 또는 IB에 고정된 폭을 설정하는 것입니다.제약 조건을 여백으로 설정합니다.viewDidLoad에서 다음 코드 행을 추가합니다.

override func viewDidLoad() {
            super.viewDidLoad()

            label.numberOfLines = 1
            label.adjustsFontSizeToFitWidth = true
            label.minimumScaleFactor = 0.5
        }

여백에 대한 레이블 제한

여백에 고정 너비 레이블 구속조건

속성 검사기

이것은 마법처럼 작용하여 새로운 라인으로 넘치지 않고, 이상한 문제 없이 라벨 폭에 맞게 텍스트를 축소하여 Swift 3에서 작동합니다.

질문입니다. 때문입니다.그게 빌트인의 일부가 될 것 같아서UIKit기능 또는 관련 프레임워크에 대한 정보를 제공합니다.다음은 질문의 좋은 예시를 제시하겠습니다.

글꼴 크기 조정 애니메이션

쉬운 방법은 없지만, 확실히 가능합니다.이를 위한 한 가지 방법은 보기 경계에 상당히 가까운 글꼴 크기를 찾을 때까지 프로그래밍 방식으로 다른 글꼴 크기를 시도하는 것입니다.를 실현하려면 , 「 」를 사용합니다.boundingRect()NSString ★★★★★★★★★★★★★★★★★」NSAttributedString §:

let string = "This is a test"
let infiniteSize = CGSize(width: CGFloat.greatestFiniteMagnitude, height:CGFloat.greatestFiniteMagnitude)
let size = string.boundingRect(with: infiniteSize, options: [], attributes: [.font: UIFont.systemFont(ofSize: avgSize)] context: nil).size

바이너리 검색을 실시하면, 완전한 brute force 어프로치보다 효율이 높아집니다.또한 올바른 워드 랩핑과 iOS 폰트 캐싱 성능 등 좀 더 고려해야 할 사항도 있습니다.

화면에 텍스트를 쉽게 표시하는 것만을 신경 쓴다면, Swift에서 견고한 구현을 개발했고, 제작 앱에서도 사용하고 있습니다.UIView여러 줄을 포함한 모든 입력 텍스트에 대한 효율적인 자동 글꼴 배율 기능을 갖춘 서브 클래스. 하면 됩니다

let view = AKTextView()
// Use a simple or fancy NSAttributedString
view.attributedText = .init(string: "Some text here")
// Add to the view hierarchy somewhere

바로 그거야!자세한 출처는, https://github.com/FlickType/AccessibilityKit 를 참조해 주세요.

이게 도움이 됐으면 좋겠네요!

iOS 9에서는 다음과 같은 작업을 수행해야 했습니다.

  1. 라벨의 왼쪽과 오른쪽에서 슈퍼뷰에 구속조건을 추가합니다.
  2. IB 로 회선 브레이크 모드를 클리핑으로 설정합니다.
  3. IB 로 행수를 1 로 설정합니다.

행수를 0으로 설정하는 것을 추천받았는데, 저는 이 때문에 라벨이 여러 줄로 되어 버렸습니다.

allocate init Label 후 bellow code를 작성하시면 될 것 같습니다.

UILabel* lbl = [[UILabel alloc]initWithFrame:CGRectMake(0, 10, 280, 50)];
lbl.text = @"vbdsbfdshfisdhfidshufidhsufhdsf dhdsfhdksbf hfsdh fksdfidsf sdfhsd fhdsf sdhfh sdifsdkf ksdhfkds fhdsf dsfkdsfkjdhsfkjdhskfjhsdk fdhsf ";
[lbl setMinimumFontSize:8.0];
[lbl setNumberOfLines:0];
[lbl setFont:[UIFont systemFontOfSize:10.0]];
lbl.lineBreakMode = UILineBreakModeWordWrap;
lbl.backgroundColor = [UIColor redColor];
[lbl sizeToFit];
[self.view addSubview:lbl];

잘 되고 있어. 써 봐.

2년이 지났지만, 이 문제는 여전히...

iOS 8 / XCode 6.1에서는, 때때로, 제 PC의UILabel(로 (예:)UITableViewCell 가하게 되어 있는 그리고 을 확보할 수 이 있는 경우 문자열에 할 수 없습니다 AutoLayout 가 유효하게 되어 있는 경우, 유연성이 있는 제약으로 인해 충분한 공간이 확보되어 있는 경우)는 텍스트 문자열에 맞게 크기를 조정할 수 없습니다.

예년과 마찬가지로 해결방법은 텍스트를 설정한 후sizeToFit.

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    . . .
    cell.lblCreatedAt.text = [note getCreatedDateAsString];
    [cell.lblCreatedAt sizeToFit];
}

(하아)

방법은 이렇습니다.다음 messageLabel이 원하는 효과를 가져오는 라벨이라고 가정합니다.다음 간단한 코드 행을 사용해 보십시오.

    //SET THE WIDTH CONSTRAINTS FOR LABEL.
    CGFloat constrainedWidth = 240.0f;//YOU CAN PUT YOUR DESIRED ONE,THE MAXIMUM WIDTH OF YOUR LABEL.
 //CALCULATE THE SPACE FOR THE TEXT SPECIFIED.
    CGSize sizeOfText=[yourText sizeWithFont:yourFont constrainedToSize:CGSizeMake(constrainedWidth, CGFLOAT_MAX) lineBreakMode:UILineBreakModeWordWrap];
    UILabel *messageLabel=[[UILabel alloc] initWithFrame:CGRectMake(20,20,constrainedWidth,sizeOfText.height)];
    messageLabel.text=yourText;
    messageLabel.numberOfLines=0;//JUST TO SUPPORT MULTILINING.

.numberOfLines > 1가 한 이 이런 .

if(lblRecLocation.text.length > 100)
    lblRecLocation.font = [UIFont fontWithName:@"app_font_name" size:10];

Swift 4 이상:

let label = UILabel(frame: CGRect(x: 0, y: 0, width: 200.0, height: 200.0))
label.adjustsFontSizeToFitWidth = true
label.numberOfLines = 0
    
label.text = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum."
    
view.addSubview(label)

파티에 늦었지만, 한 줄에 한 단어를 넣어야 하는 추가 요구사항이 있었기 때문에, 이 추가 사항 하나가 나에게 효과가 있었습니다.

label.numberOfLines = [labelString componentsSeparatedByString:@" "].count;

Apple Docs의 설명:

일반적으로 레이블 텍스트는 글꼴 속성에서 지정한 글꼴로 그려집니다.그러나 이 속성이 YES로 설정되어 있고 텍스트 속성의 텍스트가 라벨의 경계 사각형을 초과하면 수신자는 문자열이 적합하거나 최소 글꼴 크기에 도달할 때까지 글꼴 크기를 줄이기 시작합니다.iOS 6 이전 버전에서 이 속성은 numberOfLines 속성이 1로 설정된 경우에만 적용됩니다.

★★★★★★★★★★★ iOS 버전에 대응iOS를 사용합니다. 「」, 「」, 「RSA」를 하고 있는 됩니다.UILabel의 범위 내에서UICollectionViewCell기기실실실(((((((((((((((((((((((((((((((((((((((((:self.menuCollectionViewLayout.itemSize = size를 참조해 주세요.

라서 so so so so so 와 병용하면adjustsFontSizeToFitWidth ★★★★★★★★★★★★★★★★★」minimumScaleFactor답변에서 한 바와 같이 으로 설정한다numberOfLines단어 수를 바탕으로 자동 링크 문제를 해결했습니다.단어 수 또는 문자 수에 따라 유사한 작업을 수행하면 "충분히 가까운" 솔루션이 생성될 수 있습니다.

Swift 4, Xcode 9.4.1

제게 효과가 있었던 해결책: 컬렉션 뷰 셀 안에 라벨이 있고 라벨 텍스트가 잘려나가고 있었습니다.Storyboard에서 다음과 같이 속성을 설정합니다.

Lines = 0
LineBreak = Word Wrap
Set yourlabel's leading and trailing constraint = 0 (using Autolayout)

언급URL : https://stackoverflow.com/questions/9908334/uilabel-is-not-auto-shrinking-text-to-fit-label-size

반응형