UILabel에서 여러 줄의 텍스트


443

UILabel와 같이 여러 줄의 텍스트를 넣을 수있는 방법이 UITextView있습니까? 아니면 두 번째 텍스트를 사용해야합니까?


5
참고 UILineBreakModeWordWrap아이폰 OS 6에 사용되지 않습니다은 이제 사용해야 NSLineBreakByWordWrapping = 0설명서를 참조하십시오 여기
오스틴

이 질문을 점검하십시오. stackoverflow.com/questions/2312899/…
user1766342

답변:


796

해결책을 찾았습니다.

다음 코드 만 추가하면됩니다.

// Swift
textLabel.lineBreakMode = .ByWordWrapping // or NSLineBreakMode.ByWordWrapping
textLabel.numberOfLines = 0 

// For Swift >= 3
textLabel.lineBreakMode = .byWordWrapping // notice the 'b' instead of 'B'
textLabel.numberOfLines = 0

// Objective-C
textLabel.lineBreakMode = NSLineBreakByWordWrapping;
textLabel.numberOfLines = 0;

// C# (Xamarin.iOS)
textLabel.LineBreakMode = UILineBreakMode.WordWrap;
textLabel.Lines = 0;  

이전 답변을 복원했습니다 (6.0 미만의 iOS를 기꺼이 지원하려는 개발자 및 참조 용).

textLabel.lineBreakMode = UILineBreakModeWordWrap;
textLabel.numberOfLines = 0;

측면에서 : 두 열거 형 값은 0어쨌든 산출됩니다 .


16
UILineBreakModeWordWrap은 실제로 기본값이므로 첫 번째 줄이 필요하지 않습니다.
Jarred Olson

1
: 빠른 사용하는 사람들을 위해 cell.textLabel?.lineBreakMode = NSLineBreakMode.ByWordWrappingcell.textLabel?.numberOfLines = 0
boidkan

5
Xamarin-Code도 제공해 주셔서 감사합니다. 자동 완성 기능은 해당 속성을 축약하기로 선택했기 때문에 작동하지 않았습니다 ... +1
Jan Gillich

Jarred Olson에 동의합니다 . NSLineBreakByWordWrapping기본값 입니다. Gurumoorthy Arumugam의 가이드와 같이 sizeToFit 속성을 추가 하여 수정했습니다. 레이블 내부의 글꼴이 레이블 경계에 맞게 조정되도록하려면 다음을 사용할 수 있습니다. textLabel.adjustsFontSizeToFitWidth = YES; 모두 감사합니다.
ryan tran

@JarredOlson Docs는 "이 속성은 기본적으로 byTruncatingTail로 설정되어 있습니다."라고 말합니다.
Bill

138

IB에서 줄 수를 0으로 설정합니다 (무제한 줄 허용).

IB를 사용하여 텍스트 필드에 입력 할 때 "alt-return"을 사용하여 리턴을 삽입하고 다음 행으로 이동하십시오 (또는 이미 행으로 구분 된 텍스트를 복사 할 수 있습니다).


1
[그가 1 년 이상 된 실을 고의로 파헤 치면서 …] 때때로 IB에서 할 수있는 일 중 하나는 삽입 된 줄 바꿈 없이 텍스트 입력 하고 UILineBreakModeWordWrap 및 numberOfLines = 0을 설정 한 다음 레이블을 자동으로 설정하는 것입니다. IB에서 디자인하면서 높이를 자동으로 높이 조정하십시오. 뷰의 가로 크기가 조정되어 레이블의 줄 바꿈이 문제가되는 경우를 생각하고 있습니다. 또는 ... IB를 잘못 사용하고있을 수 있습니다! 아마도 IB 내에서 레이블 크기를 자동으로 설정하면 해결하는 것보다 더 많은 문제가 발생합니까? (이 시점에서는 sizeToFit을 호출 할 수 없습니다.)
Joe D' Andrea

UILabel의 문서에서 얻은 "0"은 수년 동안 Interface Builder를 사용해 온 친구의 대체 기능입니다.
Kendall Helmstetter Gelner

3
"alt-return"에 대한 유일한 답변 인 +1 특히 "ctrl-return"은 작동하는 것처럼 보이지만 작동하지 않습니다.
paulmelnikow

52

내가 찾은 최고의 솔루션 (프레임 워크에서 해결 해야하는 실망스러운 문제)은 vaychick의 솔루션과 유사합니다.

IB 또는 코드에서 줄 수를 0으로 설정하십시오.

myLabel.numberOfLines = 0;

그러면 필요한 줄이 표시되지만 레이블이 가로 중앙에 오도록 레이블을 재배치합니다 (1 줄 및 3 줄 레이블이 가로로 정렬 됨). 그 추가를 수정하려면 다음을 수행하십시오.

CGRect currentFrame = myLabel.frame;
CGSize max = CGSizeMake(myLabel.frame.size.width, 500);
CGSize expected = [myString sizeWithFont:myLabel.font constrainedToSize:max lineBreakMode:myLabel.lineBreakMode]; 
currentFrame.size.height = expected.height;
myLabel.frame = currentFrame;

당신과 @Ilya Suzdalnitski의 도움으로 내 쿼리를 해결하십시오. 고마워
Mihir Oza

33

여러 줄의 텍스트를 사용하려면 다음을 사용하십시오 UILabel.

textLabel.lineBreakMode = NSLineBreakByWordWrapping;
textLabel.numberOfLines = 0;

빠른:

textLabel.lineBreakMode = .byWordWrapping
textLabel.numberOfLines = 0


16

당신이 사용해야하는 경우 :

myLabel.numberOfLines = 0;

property ("\n")코드에서 표준 줄 바꿈을 사용 하여 새 줄을 강제 설정할 수도 있습니다 .


15

using \r을 채우는 동안 다음 줄로 이동할 수 있습니다 .UILabelNSString

UILabel * label;


label.text = [NSString stringWithFormat:@"%@ \r %@",@"first line",@"seconcd line"];

14

이것을 시도하자

textLabel.lineBreakMode = NSLineBreakModeWordWrap; // UILineBreakModeWordWrap deprecated     
textLabel.numberOfLines = 0;                          

또한 UILabel에서 IB 'Lines'속성 전체에서 0으로 설정할 수 있습니다.
KoreanXcodeWorker

11
textLabel.lineBreakMode = UILineBreakModeWordWrap;
textLabel.numberOfLines = 0;

위의 솔루션은 제 경우에는 작동하지 않습니다. 나는 이렇게하고있다 :

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // ...

    CGSize size = [str sizeWithFont:[UIFont fontWithName:@"Georgia-Bold" size:18.0] constrainedToSize:CGSizeMake(240.0, 480.0) lineBreakMode:UILineBreakModeWordWrap];
    return size.height + 20;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
    {
        // ...
        cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
        cell.textLabel.numberOfLines = 0;
        cell.textLabel.font = [UIFont fontWithName:@"Georgia-Bold" size:18.0];
    }

    // ...

    UILabel *textLabel = [cell textLabel];
    CGSize size = [text sizeWithFont:[UIFont fontWithName:@"Georgia-Bold" size:18.0]
                                        constrainedToSize:CGSizeMake(240.0, 480.0)
                                            lineBreakMode:UILineBreakModeWordWrap];

    cell.textLabel.frame = CGRectMake(0, 0, size.width + 20, size.height + 20);

    //...
}


8

Swift 3
동적 텍스트 정보에 대해 줄 수를 0으로 설정하면 텍스트를 다양하게 변경하는 데 유용합니다.

var label = UILabel()
let stringValue = "A label\nwith\nmultiline text."
label.text = stringValue
label.numberOfLines = 0
label.lineBreakMode = .byTruncatingTail // or .byWrappingWord
label.minimumScaleFactor = 0.8 . // It is not required but nice to have a minimum scale factor to fit text into label frame

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


1
Krunal에게 감사합니다.
Yogesh Patel

6
UILabel *helpLabel = [[UILabel alloc] init];
NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:label];
helpLabel.attributedText = attrString;
// helpLabel.text = label;

helpLabel.textAlignment = NSTextAlignmentCenter;
helpLabel.lineBreakMode = NSLineBreakByWordWrapping;
helpLabel.numberOfLines = 0;

어떤 이유로 iOS 6에서 작동하지 않는 이유는 확실하지 않습니다. 텍스트가 있거나없는 것으로 시도했습니다. 어떤 제안이라도.


6

이것을 사용해보십시오 :

lblName.numberOfLines = 0;
[lblName sizeToFit];

numberOfLine이 0이 아닌 경우 sizeToFit가 작동하지 않습니다. 흥미 롭습니다.
Onur Tuna

3

이 것들이 나를 도왔다

UILabel의 이러한 속성 변경

label.numberOfLines = 0;
label.adjustsFontSizeToFitWidth = NO;
label.lineBreakMode = NSLineBreakByWordWrapping;

그리고 입력 문자열을주는 동안 \ n을 사용하여 다른 단어를 다른 줄에 표시합니다.

예 :

 NSString *message = @"This \n is \n a demo \n message for \n stackoverflow" ;

3

방법 1 :

extension UILabel {//Write this extension after close brackets of your class
    func lblFunction() {
        numberOfLines = 0
        lineBreakMode = .byWordWrapping//If you want word wraping
        //OR
        lineBreakMode = .byCharWrapping//If you want character wraping
    }
}

이제 간단히 이렇게 불러

myLbl.lblFunction()//Replace your label name 

전의:

Import UIKit

class MyClassName: UIViewController {//For example this is your class. 

    override func viewDidLoad() {
    super.viewDidLoad()

        myLbl.lblFunction()//Replace your label name 

    }

}//After close of your class write this extension.

extension UILabel {//Write this extension after close brackets of your class
    func lblFunction() {
        numberOfLines = 0
        lineBreakMode = .byWordWrapping//If you want word wraping
        //OR
        lineBreakMode = .byCharWrapping//If you want character wraping
    }
}

방법 2 :

프로그래밍 방식으로

yourLabel.numberOfLines = 0
yourLabel.lineBreakMode = .byWordWrapping//If you want word wraping
//OR
yourLabel.lineBreakMode = .byCharWrapping//If you want character wraping

방법 3 :

스토리 보드를 통해

0 (영)으로 설정된 여러 줄을 표시하려면 레이블에 둘 이상의 줄이 표시됩니다.

n 줄을 표시하려면 n을 설정하십시오.

아래 화면을 참조하십시오.

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

레이블의 최소 글꼴 크기를 설정하려면 자동 축소를 클릭하고 최소 글꼴 크기 선택 옵션

아래 화면을 참조하십시오

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

여기에 최소 글꼴 크기를 설정하십시오

예 : 9 (이 이미지에서)

레이블에 해당 시간에 더 많은 텍스트가 표시되면 레이블 텍스트가 최대 9로 줄어 듭니다.

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


2
UILabel *labelName = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
[labelName sizeToFit];
labelName.numberOfLines = 0;
labelName.text = @"Your String...";
[self.view addSubview:labelName];

다음을 추가하는 것을 잊지 마십시오 : [labelName setLineBreakMode : NSLineBreakByWordWrapping];
Irineu Licks Filho

2

스토리 보드를 통해서도 할 수 있습니다 :

  1. 뷰 컨트롤러에서 레이블을 선택하십시오.
  2. Attribute Inspector에서 Line 옵션의 값을 늘리십시오 (Alt + Cmd + 4를 눌러 Attributes Inspector를 표시하십시오)
  3. 뷰 컨트롤러에서 레이블을 두 번 클릭하고 텍스트를 쓰거나 붙여 넣습니다.
  4. 전체 텍스트를 표시 할 수 있도록 레이블 크기를 조정하거나 글꼴 크기를 늘리십시오.

Lines를 0으로 설정하십시오. 그렇지 않으면 지정된 행 수에 넣을 수있는 텍스트 만 표시되고 다른 행은 생략됩니다.
toing_toing

2

이것을 시도해야합니다 :

-(CGFloat)dynamicLblHeight:(UILabel *)lbl
{
    CGFloat lblWidth = lbl.frame.size.width;
    CGRect lblTextSize = [lbl.text boundingRectWithSize:CGSizeMake(lblWidth, MAXFLOAT)
                                               options:NSStringDrawingUsesLineFragmentOrigin
                                            attributes:@{NSFontAttributeName:lbl.font}
                                               context:nil];
    return lblTextSize.size.height;
}

1
UILabel *textLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 150, 30)];
[textLabel sizeToFit];
textLabel.numberOfLines = 0;
textLabel.text = @"Your String...";

1

이미 답변했지만 스토리 보드에서도 수동으로 할 수 있습니다. 레이블의 속성 관리자에서 줄 바꿈을 단어 줄 바꿈 (또는 문자 줄 바꿈)로 변경할 수 있습니다.


1

이 함수에서 레이블에 지정할 문자열을 전달하고 self.activityFont 대신 글꼴 크기를 전달하고 235 대신에 레이블 너비를 전달하면 문자열에 따라 레이블 높이가 표시됩니다. 잘 작동합니다.

-(float)calculateLabelStringHeight:(NSString *)answer
{
    CGRect textRect = [answer boundingRectWithSize: CGSizeMake(235, 10000000) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:self.activityFont} context:nil];
    return textRect.size.height;

}

1

코드 또는 스토리 보드 자체에서 아래 설정

Label.lineBreakMode = NSLineBreakByWordWrapping; Label.numberOfLines = 0;

라벨의 왼쪽, 오른쪽, 위쪽 및 아래쪽 제약 조건을 설정하는 것을 잊지 마십시오. 그렇지 않으면 작동하지 않습니다.


어디에서나 줄 바꿈과 줄 수를 0으로 설정한다고 말합니다. 그러나 여전히 내 줄 바꿈은하지 않았습니다. 왼쪽, 위쪽, 아래쪽 및 오른쪽 제약 조건을 설정하면 줄 바꿈되었습니다.
anoo_radha

1

스위프트 4 :

label.lineBreakMode = .byWordWrapping

label.numberOfLines = 0

label.translatesAutoresizingMaskIntoConstraints = false

label.preferredMaxLayoutWidth = superview.bounds.size.width - 10 

0

C #에서는 UITableViewCell 내에서 저에게 효과적이었습니다.

        UILabel myLabel = new UILabel();
        myLabel.Font = UIFont.SystemFontOfSize(16);
        myLabel.Lines = 0;
        myLabel.TextAlignment = UITextAlignment.Left;
        myLabel.LineBreakMode = UILineBreakMode.WordWrap;
        myLabel.MinimumScaleFactor = 1;
        myLabel.AdjustsFontSizeToFitWidth = true;

       myLabel.InvalidateIntrinsicContentSize();
       myLabel.Frame = new CoreGraphics.CGRect(20, mycell.ContentView.Frame.Y + 20, cell.ContentView.Frame.Size.Width - 40, mycell.ContentView.Frame.Size.Height);
       myCell.ContentView.AddSubview(myLabel);

여기 요점은 다음과 같습니다.

            myLabel.TextAlignment = UITextAlignment.Left;
            myLabel.LineBreakMode = UILineBreakMode.WordWrap;
            myLabel.MinimumScaleFactor = 1;
            myLabel.AdjustsFontSizeToFitWidth = true;

-2

이 코드는 텍스트에 따라 크기 높이를 반환합니다.

+ (CGFloat)findHeightForText:(NSString *)text havingWidth:(CGFloat)widthValue andFont:(UIFont *)font
 {
    CGFloat result = font.pointSize+4;
    if (text) 
{
        CGSize size;

        CGRect frame = [text boundingRectWithSize:CGSizeMake(widthValue, 999)
                                          options:NSStringDrawingUsesLineFragmentOrigin
                                       attributes:@{NSFontAttributeName:font}
                                          context:nil];
        size = CGSizeMake(frame.size.width, frame.size.height+1);
        result = MAX(size.height, result); //At least one row
    }
    return result;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.