제목에 두 줄의 텍스트가있는 UIButton (numberOfLines = 2)


87

UIButtontitleLabel에 두 줄의 텍스트가있는를 만들려고합니다 . 이것은 내가 사용하는 코드입니다.

    UIButton *titleButton = [[UIButton alloc] initWithFrame:CGRectMake(15, 10, frame.size.width-100, 100)];
    titleButton.titleLabel.font = [UIFont boldSystemFontOfSize:24.0];
    [titleButton setTitle:@"This text is very long and should get truncated at the end of the second line" forState:UIControlStateNormal];
    titleButton.titleLabel.lineBreakMode = UILineBreakModeTailTruncation;
    titleButton.titleLabel.numberOfLines = 2;
    [self addSubview:titleButton];

이것을 시도하면 텍스트가 한 줄에만 나타납니다. 한 줄 이상의 텍스트를 얻는 유일한 방법 UIButton.titleLabel은을 설정 numberOfLines=0하고 사용하는 것 UILineBreakModeWordWrap입니다. 그러나 이것이 텍스트가 정확히 두 줄이라는 것을 보장하지는 않습니다.

UILabel그러나 plain을 사용하면 작동합니다.

    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 10, frame.size.width-100, 100)];
    titleLabel.font = [UIFont boldSystemFontOfSize:24.0];
    titleLabel.text = @"This text is very long and should get truncated at the end of the second line";
    titleLabel.numberOfLines = 2;
    titleLabel.lineBreakMode = UILineBreakModeTailTruncation;
    [self addSubview:titleLabel];

UIButton두 줄로 작업 하는 방법을 아는 사람이 있습니까? 별도 UILabel의 텍스트 를 생성 하고 단추의 하위보기로 추가 하는 유일한 솔루션 입니까?


1
당신은 이것을 본 적 있습니까 ? - stackoverflow.com/questions/604632/...
Viraj

Viraj, 예,을 설정 numberOfLines=0하고 사용 UILineBreakModeWordWrap하면 여러 줄을 얻을 수 있습니다. 문제는 텍스트가 너무 길면 두 줄 이상을 줄 수 있다는 것입니다. 두 번째 줄 끝에 생략 부호가있는 정확히 두 개의 고독을 원합니다 (텍스트가 너무 긴 경우).
마케팅

아, 그러면 하위 뷰를 추가하는 것이 유일한 방법 일 수 있습니다.
Viraj

답변:


87

최신 iOS 버전에 대한 답변 업데이트

이것이 허용되는 답변이므로 여기에 @Sean의 답변을 추가했습니다.

버튼의 titleLabel에서 이러한 속성을 설정합니다.

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.numberOfLines = 2; // if you want unlimited number of lines put 0

Swift 3 및 4 :

button.titleLabel?.lineBreakMode = .byWordWrapping
button.titleLabel?.numberOfLines = 2 // if you want unlimited number of lines put 0

이전 버전의 iOS에 대한 원래 답변

두 줄의 텍스트를 원하면 그 위에 정확하게 그것을 수행하는 텍스트를 UIButton추가해야 UIlabel합니다.

UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 10, frame.size.width-100, 100)];
titleLabel.font = [UIFont boldSystemFontOfSize:24.0];
titleLabel.text = @"This text is very long and should get truncated at the end of the second line";
titleLabel.numberOfLines = 2;
titleLabel.lineBreakMode = UILineBreakModeTailTruncation;
[myButton addSubview:titleLabel]; //add label to button instead.

인터페이스 빌더 솔루션 업데이트

보다 완전한 답변을 위해 @Borut Tomazin의 답변을 추가했습니다. @Borut Tomazin의 답변이 개선되었으므로이 부분을 다시 업데이트했습니다.

코드가 필요없이 훨씬 쉽게 할 수 있습니다. Interface Builder Line Break에서 UIButton을 Word Wrap. 여러 줄의 제목을 삽입 할 수 있습니다. Option + Return새 줄을 만들려면 키를 누르십시오 . 또한 인터페이스 빌더의 사용자 정의 런타임 속성에이를 추가해야합니다.

titleLabel.textAlignment Number [1]

5
UILineBreakModedeprecated, NSLineBreakMode대신 사용
guillaume 2013-04-28

2
최신 iOS 버전에서는 필요하지 않습니다. @sean의 대답을 참조하십시오.
cbowns

146

UIButton에 UILabel을 추가 할 필요가 없습니다. 그것은 단지 여분의 물건과 일입니다.

버튼의 titleLabel에서 이러한 속성을 설정합니다.

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.numberOfLines = 2;//if you want unlimited number of lines put 0

빠른:

button.titleLabel!.lineBreakMode = NSLineBreakMode.ByWordWrapping
button.titleLabel!.numberOfLines = 2//if you want unlimited number of lines put 0

6
이것은 2013 년이며 현재는 최첨단 솔루션입니다.
Klaas 2013 년

@Blip 당신은 불행히도 할 수 없으며 코드에서해야합니다. 이 기능을 요청하는 Apple에 버그 보고서를 제출할 가치가있을 수 있습니다.
bpapa

@bpapa 네 동의합니다. 스토리 보드는 더 유연해야합니다.
Blip

6
이것은 나를 위해 작동하지만 버튼의 기본 동작을 깨뜨리고 intrinsicContentSize여전히 텍스트 한 줄에 해당하는 높이를 반환합니다. intrinsicContentSize높이를 설정 한 버튼을 재정 의하여 수정했습니다 [self.titleLabel sizeThatFits(CGSizeMake(self.titleLabel.frame.size.width, CGFLOAT_MAX)].height.
Elise

@WillVonUllrich는 수정 된 경우에만 수락 된 답변을 변경할 수 있기 때문입니다. 나는 받아 들인 답변에이 답변을 추가하여 받아 들인 답변보다 더 멀리 보지 않는 사람들을 도울 것입니다.
Totumus Maximus

88

코드가 필요없이 훨씬 쉽게 할 수 있습니다. Interface Builder Line Break에서 UIButton을 Word Wrap. 여러 줄의 제목을 삽입 할 수 있습니다. Option + Return새 줄을 만들려면 키를 누르십시오 . 또한 인터페이스 빌더의 사용자 정의 런타임 속성에이를 추가해야합니다.

titleLabel.textAlignment Number [1]

그렇게 간단합니다. 도움이 되길 바랍니다 ...


1
이 솔루션은 간단한 경우 현재 허용되는 것보다 더 좋습니다 (더 적은 객체, 코드).
Jonathan Zhan

1
"less objects"인수가 유효하지 않도록 프로그래밍 방식과 똑같은 속성을 설정합니다. 코드가 적을 수 있습니다. 그러나 더 읽기 쉽습니다. 골라 봐)
Totumus 막시무스에게

오, 분명하지 않은 것 같습니다. 명확히 해주셔서 감사합니다. IB 대 코드에서 수행된다는 사실에별로 관심이 없었습니다. Borut의 솔루션에 추가 레이블을 추가 할 필요가 없으며 동일한 작업을 수행한다는 사실과 더 관련이 있습니다. 그러나 예, 둘 다 훌륭하게 작동합니다. :)
Jonathan Zhan

이러한 기본 작업을 위해 코드 뒤에서 수행해야하는 것은 정말 압도적입니다.
Can Poyrazoğlu

3
Interface Builder에서 titleLabel.textAlignment 사용자 정의 런타임 속성 을 추가하고 이를 Number = 1 (NSTextAlignmentCenter의 값)로 설정 하여 코드없이 100 % 동일한 목표를 달성 할 수 있습니다 .
0xced

21
 button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;

button.titleLabel.textAlignment = NSTextAlignmentCenter;

[button setTitle: @"Line1\nLine2" forState: UIControlStateNormal];

완벽 해요! 당신은 NSString내부 를 분할 할 필요가 없습니다 setTitle. 'WordWrapping'이이 작업을 수행합니다!
Alex Cio

나를 위해 나는 세트 제목 내에서 문자열을 분할해야했습니다. 그없이 그것을하지 않았다 일
user1960169

9

코드를 편집 할 필요가 없어서 뷰를 서브 클래 싱 할 필요가 없도록 Xcode5 이상에서 Borut Tomazin 제안을 따를 수 있습니다.

인터페이스 빌더 (또는 스토리 보드)에서 줄 바꿈을 자동 줄 바꿈으로 설정합니다. 여러 줄의 제목을 삽입 할 수 있습니다. 새 줄을 만들려면 Option+ Return키를 누르십시오 .

에서 다음, 런타임 정의 사용자 속성 을 추가 할 수 있습니다

키 경로 : titleLabel.textAlignment
유형 : Number
값 :1

참고 : UITextAlignmentCenter상수를 숫자 값으로 변환하고 있기 때문에 이것은 완전히 "미래를 보장"하는 것은 아니지만 (새로운 iOS 버전이 출시됨에 따라 해당 상수가 변경 될 수 있음) 가까운 장래에 안전 해 보입니다.


1

Storyboard에서 직접 필요한 값을 수정할 수 있습니다. 버튼을 선택하고 ID 검사기로 이동하여 "사용자 정의 런타임 속성"섹션에 다음 키-값 쌍을 추가합니다.

여기에 이미지 설명 입력

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.