문제

다음 코드가 있습니다 ...

UILabel *buttonLabel = [[UILabel alloc] initWithFrame:targetButton.bounds];
buttonLabel.text = @"Long text string";
[targetButton addSubview:buttonLabel];
[targetButton bringSubviewToFront:buttonLabel];

... 아이디어는 버튼에 대한 멀티 라인 텍스트를 가질 수 있다는 생각이지만 텍스트는 항상 Uibutton의 배경에 의해 가려집니다. 버튼의 서브 뷰를 표시하기위한 로깅 호출은 Uilabel이 추가되었음을 보여 주지만 텍스트 자체는 볼 수 없습니다. 이것은 Uibutton의 버그입니까, 아니면 내가 뭔가 잘못하고 있습니까?

도움이 되었습니까?

해결책

iOS 6 이상의 경우 다음을 사용하여 여러 줄을 허용합니다.

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
// you probably want to center it
button.titleLabel.textAlignment = NSTextAlignmentCenter; // if you want to 
[button setTitle: @"Line1\nLine2" forState: UIControlStateNormal];

iOS 5 이하의 경우 여러 줄을 허용하려면 다음을 사용하십시오.

button.titleLabel.lineBreakMode = UILineBreakModeWordWrap;
// you probably want to center it
button.titleLabel.textAlignment = UITextAlignmentCenter;
[button setTitle: @"Line1\nLine2" forState: UIControlStateNormal];

iOS9의 경우 2017,

일반적 으로이 두 가지 일을하십시오.

  1. 선택하다 "귀속 된 텍스트"
  2. "라인 브레이크"팝업 선택 "줄 바꿈"

다른 팁

선택된 답변은 정확하지만 인터페이스 빌더에서 이런 종류의 작업을 선호하는 경우 다음을 수행 할 수 있습니다.

pic

여러 줄 중심의 제목이있는 버튼을 추가하려면 인터페이스 빌더의 설정 버튼을 설정하십시오.

[here]

iOS 6의 경우 :

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.textAlignment = NSTextAlignmentCenter;

처럼

UILineBreakModeWordWrap and UITextAlignmentCenter

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

Roger Nolan의 제안을 다시 만들려면 명시 적 코드를 사용하면 이것이 일반적인 해결책입니다.

button.titleLabel?.numberOfLines = 0

스위프트 3

button.titleLabel?.lineBreakMode = .byWordWrapping
button.titleLabel?.textAlignment = .center  
button.setTitle("Button\nTitle",for: .normal)

훨씬 쉬운 방법이 있습니다.

someButton.lineBreakMode = UILineBreakModeWordWrap;

(iOS 3 이상 편집 :)

someButton.titleLabel.lineBreakMode = UILineBreakModeWordWrap;

autolayout과 iOS7에서 왼쪽 정렬 :

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.textAlignment = NSTextAlignmentLeft;
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;

우선, Uibutton에는 이미 Uilabel이 있다는 것을 알고 있어야합니다. 당신은 그것을 사용하여 설정할 수 있습니다 –setTitle:forState:.

예의 문제는 Uilabel의 설정이 필요하다는 것입니다. numberOfLines 기본값 1 이외의 다른 것에 대한 속성은 다음을 검토해야합니다. lineBreakMode 재산.

Xcode 9.3에서는 사용하여 수행 할 수 있습니다 스토리 보드 아래처럼

enter image description here

버튼 제목 텍스트 표시를 중앙으로 설정해야합니다

button.titleLabel?.textAlignment = .center

아래와 같이 새로운 줄 ( n)으로 제목 텍스트를 설정할 필요가 없습니다.

button.setTitle("Good\nAnswer",for: .normal)

단순히 제목을 설정하고

button.setTitle("Good Answer",for: .normal)

결과는 다음과 같습니다.

enter image description here

Xcode 4의 스토리 보드를 사용하는 사람들은 버튼을 클릭하고 Attributes Inspector의 오른쪽 유틸리티 창을 클릭하면 라인 브레이크 옵션이 표시됩니다. 단어 랩을 선택하면 가면 좋을 것입니다.

여기서 답변은 멀티 린 버튼 제목을 프로그래밍 방식으로 달성하는 방법을 알려줍니다.

스토리 보드를 사용하는 경우 [Ctrl+Enter]를 입력하여 버튼 제목 필드에 새로운 라인을 강제 할 수 있다고 덧붙였습니다.

HTH

이 코드를 추가해야합니다.

buttonLabel.titleLabel.numberOfLines = 0;

Brent의 제목 Uilabel을 형제 관점으로 넣는 아이디어에 관해서는, 그것은 나에게 아주 좋은 생각처럼 보이지 않습니다. 터치 이벤트가 Uibutton의 견해를 극복하지 않기 때문에 Uilabel과의 상호 작용 문제에 대해 계속 생각합니다.

다른 한편으로, Uilabel을 Uibutton의 하위 뷰로 사용하면 터치 이벤트가 항상 Uilabel의 수퍼 뷰로 전파 될 것이라는 것을 알고 있습니다.

나는이 접근법을 취했지만 BaggubceMage 에보 고 된 문제는 눈치 채지 못했습니다. Uibutton 서브 클래스의 -titlerectforcontentrect 에이 코드를 추가했지만 코드는 Uibitton Superview의 루틴을 그리는데도 배치 될 수 있습니다.이 경우 모든 참조를 Self를 Uibutton의 변수로 대체해야합니다.

#define TITLE_LABEL_TAG 1234

- (CGRect)titleRectForContentRect:(CGRect)rect
{   
    // define the desired title inset margins based on the whole rect and its padding
    UIEdgeInsets padding = [self titleEdgeInsets];
    CGRect titleRect = CGRectMake(rect.origin.x    + padding.left, 
                                  rect.origin.x    + padding.top, 
                                  rect.size.width  - (padding.right + padding.left), 
                                  rect.size.height - (padding.bottom + padding].top));

    // save the current title view appearance
    NSString *title = [self currentTitle];
    UIColor  *titleColor = [self currentTitleColor];
    UIColor  *titleShadowColor = [self currentTitleShadowColor];

    // we only want to add our custom label once; only 1st pass shall return nil
    UILabel  *titleLabel = (UILabel*)[self viewWithTag:TITLE_LABEL_TAG];


    if (!titleLabel) 
    {
        // no custom label found (1st pass), we will be creating & adding it as subview
        titleLabel = [[UILabel alloc] initWithFrame:titleRect];
        [titleLabel setTag:TITLE_LABEL_TAG];

        // make it multi-line
        [titleLabel setNumberOfLines:0];
        [titleLabel setLineBreakMode:UILineBreakModeWordWrap];

        // title appearance setup; be at will to modify
        [titleLabel setBackgroundColor:[UIColor clearColor]];
        [titleLabel setFont:[self font]];
        [titleLabel setShadowOffset:CGSizeMake(0, 1)];
        [titleLabel setTextAlignment:UITextAlignmentCenter];

        [self addSubview:titleLabel];
        [titleLabel release];
    }

    // finally, put our label in original title view's state
    [titleLabel setText:title];
    [titleLabel setTextColor:titleColor];
    [titleLabel setShadowColor:titleShadowColor];

    // and return empty rect so that the original title view is hidden
    return CGRectZero;
}

나는 시간이 걸렸고 이것에 대해 조금 더 썼습니다. 여기. 거기에서 나는 또한 더 짧은 솔루션을 지적하지만 모든 시나리오에 적합하지는 않지만 일부 개인 뷰 해킹이 포함됩니다. 또한 Uibitton 서브 클래스를 사용할 수 있도록 다운로드 할 수 있습니다.

iOS 6에서 자동 층을 사용하는 경우 preferredMaxLayoutWidth 재산:

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.textAlignment = NSTextAlignmentCenter;
button.titleLabel.preferredMaxLayoutWidth = button.frame.size.width;

완벽하게 작동합니다.

Plist와 같은 구성 파일과 함께이를 사용하려면 다음과 같은 CDATA를 사용해야합니다.

<string><![CDATA[Line1
Line2]]></string>

linebreakmode를 nslinebreakbywordwrapping (ib 또는 코드)으로 설정하면 버튼 레이블이 멀티 라인을 만들지 만 버튼의 프레임에는 영향을 미치지 않습니다.

버튼에 동적 제목이 있다면 한 가지 트릭이 있습니다. 같은 글꼴로 숨겨진 uilabel을 넣고 레이아웃으로 높이를 키우십시오. 텍스트를 버튼으로 설정하고 라벨 및 자동 금지를 설정하면 모든 작업이됩니다.

메모

1 라인 버튼의 고유 크기 높이는 레이블보다 크기 때문에 레이블의 높이가 줄어들려면 수직 콘텐츠 포옹 우선 순위가 버튼의 수직 내용 압축 저항보다 커야합니다.

자동 층을 사용하는 경우.

button.titleLabel?.adjustsFontSizeToFitWidth = true
button.titleLabel?.numberOfLines = 2

멀티 라인을 활성화 한 후 Auto-Layout에 문제가있었습니다. 결과는 다음과 같습니다.
enter image description here
그래서 titleLabel 크기는 버튼 크기에 영향을 미치지 않습니다
추가했습니다 Constraints 기반 contentEdgeInsets (이 경우 ContentedgeSets는 (10, 10, 10, 10)
전화 후 makeMultiLineSupport():
enter image description here
도움이되기를 바랍니다 (Swift 5.0) :

extension UIButton {

    func makeMultiLineSupport() {
        guard let titleLabel = titleLabel else {
            return
        }
        titleLabel.numberOfLines = 0
        titleLabel.setContentHuggingPriority(.required, for: .vertical)
        titleLabel.setContentHuggingPriority(.required, for: .horizontal)
        addConstraints([
            .init(item: titleLabel,
                  attribute: .top,
                  relatedBy: .greaterThanOrEqual,
                  toItem: self,
                  attribute: .top,
                  multiplier: 1.0,
                  constant: contentEdgeInsets.top),
            .init(item: titleLabel,
                  attribute: .bottom,
                  relatedBy: .greaterThanOrEqual,
                  toItem: self,
                  attribute: .bottom,
                  multiplier: 1.0,
                  constant: contentEdgeInsets.bottom),
            .init(item: titleLabel,
                  attribute: .left,
                  relatedBy: .greaterThanOrEqual,
                  toItem: self,
                  attribute: .left,
                  multiplier: 1.0,
                  constant: contentEdgeInsets.left),
            .init(item: titleLabel,
                  attribute: .right,
                  relatedBy: .greaterThanOrEqual,
                  toItem: self,
                  attribute: .right,
                  multiplier: 1.0,
                  constant: contentEdgeInsets.right)
            ])
    }

}

요즘에는 케이스별로 인터페이스 빌더에서 이런 종류의 액세스가 필요하다면 간단한 확장으로이를 수행 할 수 있습니다.

extension UIButton {
    @IBInspectable var numberOfLines: Int {
        get { return titleLabel?.numberOfLines ?? 1 }
        set { titleLabel?.numberOfLines = newValue }
    }
}

그런 다음 숫자 라인을 라벨 인 것처럼 Uibutton 또는 Uibutton 서브 클래스의 속성으로 간단히 설정할 수 있습니다. 뷰 레이어의 코너 반경 또는 캐스팅하는 그림자의 속성과 같은 다른 일반적으로 접근 할 수없는 값의 전체 호스트도 마찬가지입니다.

나만의 버튼 클래스를 굴립니다. 장기적으로 최고의 솔루션입니다. Uibutton 및 기타 Uikit 클래스는 사용자 정의 방법에 매우 제한적입니다.

self.btnError.titleLabel?.lineBreakMode = NSLineBreakMode.byWordWrapping

self.btnError.titleLabel?.textAlignment = .center

self.btnError.setTitle("Title", for: .normal)

스위프트 4.0

btn.titleLabel?.lineBreakMode = .byWordWrapping
btn.titleLabel?.textAlignment = .center
btn.setTitle( "Line1\nLine2", for: .normal)

나는 통합했다 Jessecurry의 대답 이내에 Stabutton 내 부분은 내 일부입니다 Stacontrols 오픈 소스 라이브러리. 나는 현재 개발중인 앱 중 하나에서 사용하고 있으며 내 요구에 맞게 작동합니다. 개선 방법에 대한 문제를 열거 나 풀어 요청을 보내주십시오.

~ 안에 스위프트 5.0 그리고 Xcode 10.2

공유 클래스 예제 예를 한 번 쓰고 모든 도자기를 사용하십시오

이것은 공유 클래스입니다 (예 : 모든 구성 요소 속성을 사용합니다)

import UIKit

class SharedClass: NSObject {

     static let sharedInstance = SharedClass()

     private override init() {

     }
  }

//UIButton extension
extension UIButton {
     //UIButton properties
     func btnMultipleLines() {
         titleLabel?.numberOfLines = 0
         titleLabel?.lineBreakMode = .byWordWrapping
         titleLabel?.textAlignment = .center        
     }
}

당신의 ViewController 이렇게 부르십시오

button.btnMultipleLines()//This is your button

컨트롤에 서브 뷰를 추가해도 괜찮지 만 실제로 작동 할 것이라는 보장은 없습니다. 컨트롤이 거기에있을 것으로 예상되지 않아서 제대로 작동하지 않을 수 있기 때문입니다. 도망 갈 수 있다면 라벨을 버튼의 형제 뷰로 추가하고 버튼을 겹치도록 프레임을 설정하십시오. 버튼 위에 표시되도록 설정된 한 버튼이 할 수있는 조건은 모호하지 않습니다.

다시 말해:

[button.superview addSubview:myLabel];
myLabel.center = button.center;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top