[ios] 텍스트에 따라 UILabel 높이 조정

UILabel긴 줄의 동적 텍스트에 다음 텍스트가 있다고 가정하십시오 .

외계 군대가 팀보다 훨씬 많기 때문에 플레이어는 포스트 묵시록 세계를 활용해야합니다.

UILabel's텍스트를 맞출 수 있도록 높이의 크기를 조정하고 싶습니다 . UILabel텍스트를 줄 바꿈하기 위해 다음 속성 을 사용하고 있습니다.

myUILabel.lineBreakMode = UILineBreakModeWordWrap;
myUILabel.numberOfLines = 0;

내가 올바른 방향으로 가고 있지 않다면 알려주십시오. 감사.



답변

sizeWithFont constrainedToSize:lineBreakMode:사용하는 방법입니다. 사용 방법의 예는 다음과 같습니다.

//Calculate the expected size based on the font and linebreak mode of your label
// FLT_MAX here simply means no constraint in height
CGSize maximumLabelSize = CGSizeMake(296, FLT_MAX);

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

//adjust the label the the new height.
CGRect newFrame = yourLabel.frame;
newFrame.size.height = expectedLabelSize.height;
yourLabel.frame = newFrame;


답변

당신은 올바른 방향으로 가고있었습니다. 당신이해야 할 일은 :

myUILabel.numberOfLines = 0;
myUILabel.text = @"Enter large amount of text here";
[myUILabel sizeToFit];


답변

iOS 6에서 Apple은 레이블의 동적 수직 크기 조정 ( preferredMaxLayoutWidth) 을 크게 단순화 하는 속성을 UILabel에 추가했습니다 .

lineBreakMode = NSLineBreakByWordWrappingsizeToFit 메소드 와 함께이 속성을 사용 하면 전체 텍스트를 수용 할 수있는 높이로 UILabel 인스턴스의 크기를 쉽게 조정할 수 있습니다.

iOS 문서에서 인용 한 내용 :

preferredMaxLayoutWidth 여러 줄
레이블에 대해 선호되는 최대 너비 (포인트)입니다.

토론
이 속성은 레이아웃 제약 조건이 적용될 때 레이블의 크기에 영향을줍니다. 레이아웃 중에 텍스트가이 속성으로 지정된 너비를 넘어 확장되면 추가 텍스트가 하나 이상의 새 줄로 흐르므로 레이블 높이가 증가합니다.

샘플:

...
UILabel *status = [[UILabel alloc] init];
status.lineBreakMode = NSLineBreakByWordWrapping;
status.numberOfLines = 5; // limits to 5 lines; use 0 for unlimited.

[self addSubview:status]; // self here is the parent view

status.preferredMaxLayoutWidth = self.frame.size.width; // assumes the parent view has its frame already set.

status.text = @"Some quite lengthy message may go here…";
[status sizeToFit];
[status setNeedsDisplay];
...


답변

한 줄의 코드를 추가하지 않고이 작업을 완벽하게 확인하십시오. (자동 레이아웃 사용)

요구 사항에 따라 데모 를 만들었습니다 . 아래 링크에서 다운로드하십시오.

UIView 및 UILabel 자동 크기 조정

단계별 가이드 :-

1 단계 : -UIView로 제한 설정

1) 선행 2) 상단 3) 후행 (메인 뷰에서)

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

2 단계 :- 제한을 레이블 1로 설정

1) 선행 2) 상위 3) 후행 (슈퍼 뷰에서)

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

3 단계 :- 제한을 레이블 2로 설정

1) 선행 2) 후행 (슈퍼 뷰에서)

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

4 단계 :- 가장 까다로운 것은 UIView에서 UILabel에 botton을 제공합니다.

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

5 단계 :-(선택 사항) UIButton으로 제한 설정

1) 리딩 2) 하단 3) 트레일 링 4) 고정 높이 (메인 뷰에서)

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

출력 :-

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

참고 :- 레이블 속성에서 줄 수 = 0을 설정했는지 확인하십시오.

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

이 정보가 UILabel의 높이에 따라 Autoresize UIView를 이해하고 텍스트에 따라 UILabel 자동 크기 조정을 이해하기를 바랍니다.


답변

프로그래밍 방식으로이 작업을 수행하는 대신 디자인하는 동안 Storyboard / XIB에서이 작업을 수행 할 수 있습니다.

  • 속성 관리자에서 UIlabel의 줄 수 속성을 0 으로 설정하십시오 .
  • 그런 다음 요구 사항에 따라 너비 제약 조건 (또는) 선행 및 후행 제약 조건을 설정하십시오.
  • 그런 다음 높이 제한최소값으로 설정하십시오 . 마지막으로 추가 한 높이 제약 조건을 선택하고 크기 관리자의 속성 관리자 옆에 하나를 변경 높이 제한의 관계 에서 동일이상 .

답변

도움을 주셔서 감사합니다. 여기서 시도한 코드가 있습니다.

   UILabel *instructions = [[UILabel alloc]initWithFrame:CGRectMake(10, 225, 300, 180)];
   NSString *text = @"First take clear picture and then try to zoom in to fit the ";
   instructions.text = text;
   instructions.textAlignment = UITextAlignmentCenter;
   instructions.lineBreakMode = NSLineBreakByWordWrapping;
   [instructions setTextColor:[UIColor grayColor]];

   CGSize expectedLabelSize = [text sizeWithFont:instructions.font 
                                constrainedToSize:instructions.frame.size
                                    lineBreakMode:UILineBreakModeWordWrap];

    CGRect newFrame = instructions.frame;
    newFrame.size.height = expectedLabelSize.height;
    instructions.frame = newFrame;
    instructions.numberOfLines = 0;
    [instructions sizeToFit];
    [self addSubview:instructions];


답변

iOS7 이전 및 iOS7에 대한 솔루션

//
//  UILabel+DynamicHeight.m
//  For StackOverFlow
//
//  Created by Vijay on 24/02/14.
//  Copyright (c) 2014 http://Vijay-Apple-Dev.blogspot.com. All rights reserved.
//

#import <UIKit/UIKit.h>

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)

#define iOS7_0 @"7.0"

@interface UILabel (DynamicHeight)

/*====================================================================*/

/* Calculate the size,bounds,frame of the Multi line Label */

/*====================================================================*/
/**
 *  Returns the size of the Label
 *
 *  @param aLabel To be used to calculte the height
 *
 *  @return size of the Label
 */

-(CGSize)sizeOfMultiLineLabel;

@end


//
//  UILabel+DynamicHeight.m
//  For StackOverFlow
//
//  Created by Vijay on 24/02/14.
//  Copyright (c) 2014 http://Vijay-Apple-Dev.blogspot.com. All rights reserved.
//

#import "UILabel+DynamicHeight.h"

@implementation UILabel (DynamicHeight)
/*====================================================================*/

/* Calculate the size,bounds,frame of the Multi line Label */

/*====================================================================*/
/**
 *  Returns the size of the Label
 *
 *  @param aLabel To be used to calculte the height
 *
 *  @return size of the Label
 */
-(CGSize)sizeOfMultiLineLabel{

    NSAssert(self, @"UILabel was nil");

    //Label text
    NSString *aLabelTextString = [self text];

    //Label font
    UIFont *aLabelFont = [self font];

    //Width of the Label
    CGFloat aLabelSizeWidth = self.frame.size.width;


    if (SYSTEM_VERSION_LESS_THAN(iOS7_0)) {
        //version < 7.0

        return [aLabelTextString sizeWithFont:aLabelFont
                            constrainedToSize:CGSizeMake(aLabelSizeWidth, MAXFLOAT)
                                lineBreakMode:NSLineBreakByWordWrapping];
    }
    else if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(iOS7_0)) {
        //version >= 7.0

        //Return the calculated size of the Label
        return [aLabelTextString boundingRectWithSize:CGSizeMake(aLabelSizeWidth, MAXFLOAT)
                                              options:NSStringDrawingUsesLineFragmentOrigin
                                           attributes:@{
                                                        NSFontAttributeName : aLabelFont
                                                        }
                                              context:nil].size;

    }

    return [self bounds].size;

}

@end