programing

UIButton에 여러 줄 텍스트를 추가하려면 어떻게 해야 합니까?

yellowcard 2023. 4. 25. 22:14
반응형

UIButton에 여러 줄 텍스트를 추가하려면 어떻게 해야 합니까?

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

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];

2017년 iOS9의 경우입니다.

일반적으로 다음 두 가지 작업을 수행합니다.

  1. "속성 텍스트"를 선택합니다.
  2. "줄 바꿈" 팝업에서 "단어 줄 바꿈"을 선택합니다.

선택한 답변은 맞지만 Interface Builder에서 이러한 작업을 수행하려는 경우 다음을 수행할 수 있습니다.

사진 찍어요

제목이 여러 줄 가운데에 있는 단추를 추가하려면 단추에 대한 인터페이스 작성기의 설정을 설정하십시오.

]를 클릭합니다.여기서을(를)

IOS 6의 경우:

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

~하듯이

UILineBreakModeWordWrap and UITextAlignmentCenter

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

Roger Nolan의 제안을 명시적인 코드로 다시 말하면, 다음과 같은 일반적인 해결책이 있습니다.

button.titleLabel?.numberOfLines = 0

SWIFT 3입니다.

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

자동 레이아웃에 문제가 있었는데, 멀티 라인을 활성화한 후 다음과 같은 결과가 나왔습니다.
여기에 이미지 설명을 입력하십시오.
그러니까...titleLabel는 단추 크기에 영향을 주지 않습니다.
추가했습니다.Constraints을 기준으로 합니다.contentEdgeInsets 경우 contentEdgeInsets는 (10, 10, 10, 10)입니다.)
전화한 후에요.makeMultiLineSupport()다음을 참조하십시오
여기에 이미지 설명을 입력하십시오.
도움이 되길 바랍니다(예: 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)
            ])
    }

}

Xcode 9.3에서는 아래와 같이 스토리보드를 사용하여 할 수 있습니다.

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

버튼 제목 textAlignment를 가운데로 설정해야 합니다.

button.titleLabel?.textAlignment = .center

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

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

간단히 제목을 설정합니다.

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

결과는 이렇습니다.

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

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

someButton.lineBreakMode = UILineBreakModeWordWrap;

(iOS 3 이상에서 편집합니다:)

someButton.titleLabel.lineBreakMode = UILineBreakModeWordWrap;

iOS7에서 자동 레이아웃을 사용하여 왼쪽 정렬합니다.

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

UILABEL이라고 합니다.이렇게 하다를 사용해서 설정할 수 있어요.–setTitle:forState:요.

이 예의 문제는 UILABEL의 UILABEL을 설정해야 한다는 것입니다.numberOfLines기본값 1이 아닌 다른 값으로 속성을 설정합니다.여러분도 복습해 보세요.lineBreakMode소유물.

UIButton의 다중 줄 텍스트에 대해 Swift 5를 선택합니다.

  let button = UIButton()
  button.titleLabel?.lineBreakMode = .byWordWrapping
  button.titleLabel?.textAlignment = .center
  button.titleLabel?.numberOfLines = 0 // for Multi line text

제목 레이블의 간격을 버튼으로 고정하려면 setTitle 전에 titleEdgeInsets 및 기타 속성을 설정하십시오.

    let button = UIButton()
    button.titleLabel?.lineBreakMode = .byWordWrapping
    button.titleLabel?.numberOfLines = 0
    button.titleEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 20, right: 20)
    button.setTitle("Dummy button with long long long long long long long long title", for: .normal)

. titleLabel 설 설 설 를 alignment textAlignment text text 、 textAlignment text text in in in in in in in in in 。.natural요.

Xcode 4의 스토리보드를 사용하는 사용자는 버튼을 클릭하면 오른쪽 유틸리티 창의 속성 검사기에서 줄 바꿈 옵션을 볼 수 있습니다.워드랩을 선택하면 바로 사용할 수 있습니다.

여기에서는 여러 줄의 버튼 제목을 프로그래밍 방식으로 작성하는 방법을 설명합니다.

스토리보드를 사용하는 경우 [Ctrl+Enter]를 입력하여 버튼 제목 필드에 줄 바꿈을 강제할 수 있습니다.

HTH입니다.

lineBreakMode를 NSLineBreakByWordWrapping(IB 또는 코드)으로 설정하면 버튼 레이블이 여러 줄로 표시되지만 버튼 프레임에는 영향을 주지 않습니다.

단추에 동적 제목이 있는 경우, 한 가지 방법이 있습니다. 동일한 글꼴로 숨겨진 UILabel을 넣고 레이아웃으로 단추의 높이에 맞게 높이를 묶습니다. 텍스트를 단추와 레이블로 설정하면 자동 레이아웃이 모든 작업을 수행할 수 있습니다.

메모

한 줄 버튼의 고유한 크기 높이가 레이블의 높이보다 크므로 레이블의 높이가 축소되지 않도록 하려면 수직 컨텐츠 포옹 우선 순위가 버튼의 수직 컨텐츠 압축 저항보다 커야 합니다.

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

buttonLabel.titleLabel.numberOfLines = 0;

오늘날에는 인터페이스 빌더에서 케이스 바이 케이스(case by case)로 액세스할 수 있어야 하는 경우 다음과 같은 간단한 확장을 통해 액세스할 수 있습니다.

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

그런 다음 레이블인 것처럼 UIButton 또는 UIButton 하위 클래스의 속성으로 numberOfLines를 설정할 수 있습니다.뷰 레이어의 모서리 반지름이나 뷰 레이어가 캐스팅하는 섀도의 속성 등 일반적으로 액세스할 수 없는 다른 값의 전체 호스트도 마찬가지입니다.

UILABEL이라는 타이틀을 형제적 시각으로 하는 Brent의 아이디어에 대해서는, 제가 보기엔 별로 좋은 생각 같지 않습니다.저는 UILABEL의 터치 이벤트가 UIButton의 시야를 통과하지 못하기 때문에 UILABEL과의 상호작용 문제에 대해 계속 생각하고 있습니다.

한편, UILabel을 UIButton의 하위 뷰로 사용하면 터치 이벤트가 UILabel의 슈퍼 뷰로 항상 전파된다는 것을 알 수 있어 매우 안심할 수 있습니다.

이 방법을 사용했지만 backgroundImage에 보고된 문제를 전혀 알아차리지 못했습니다.UIButton 하위 클래스의 -titleRectForContentRect:에 이 코드를 추가했지만 UIButton 슈퍼뷰의 도면 루틴에도 넣을 수 있습니다. 이 경우 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;
}

제가 시간을 들여서 여기에 좀 더 써봤습니다.모든 시나리오에 잘 맞는 것은 아니며 일부 비공개 뷰 해킹을 수반하는 짧은 해결책도 제시합니다.또한 바로 사용할 수 있는 UIButton 하위 클래스를 다운로드할 수 있습니다.

iOS 6에서 자동 레이아웃을 사용하는 경우 다음을 설정해야 할 수도 있습니다.preferredMaxLayoutWidth속성을 선택합니다.

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

Swift 5.0 및 Xcode 10.2입니다.

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

ViewController에서 다음과 같이 호출합니다.

button.btnMultipleLines()//This is your button

완벽하게 작동합니다.

Plist와 같은 구성 파일에 사용하려면 CDATA를 사용하여 다음과 같이 여러 줄의 제목을 작성해야 합니다.

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

자동 레이아웃을 사용하는 경우입니다.

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

swift 4.0입니다.

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

자신의 버튼 클래스를 굴립니다.장기적으로 봤을 때 이것이 가장 좋은 해결책입니다.UIButton 및 기타 UIKit 클래스는 사용자 지정 방법에 매우 제한적입니다.

2021년 iOS 15에서 애플은 공식적으로 UIButton을 통해 다중 라인 UIButton을 지원합니다.구성 API입니다.

위버튼입니다.배열

단추와 단추 내용의 모양과 동작을 지정하는 구성입니다.

위버튼입니다.

이 새로운 API는 UIKit의 새로운 기능 및 세션에서 살펴봅니다.

UIKit 버튼 시스템을 만나보세요.

모든 앱은 버튼을 사용합니다.iOS 15를 사용하면 업데이트된 스타일을 채택하여 인터페이스에 쉽게 맞는 멋진 버튼을 만들 수 있습니다.다양한 유형의 버튼을 쉽게 만들고, 보다 풍부한 상호 작용을 제공하는 방법을 배우며, Mac Catalyst를 사용할 때 우수한 버튼을 얻을 수 있는 방법에 대해 알아보겠습니다.

https://developer.apple.com/videos/play/wwdc2021/10064/

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

self.btnError.titleLabel?.textAlignment = .center

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

Jesecurry의 답변을 STAButton에 포함시켰습니다. STAControls 오픈 소스 라이브러리의 일부입니다.현재 개발 중인 앱 중 하나에서 사용하고 있으며 필요에 따라 작동합니다.개선 방안에 대한 이슈를 열어보거나, 당김 요청을 보내주시기 바랍니다.

단추 제약 조건 및 하위 보기를 추가하는 중입니다.제 프로젝트에서는 이렇게 합니다. 이렇게 하면 훨씬 쉬워집니다.전 말 그대로 99%의 시간을 모든 걸 프로그래밍 방식으로 만들어요저한테는 훨씬 쉬우니까요.스토리보드는 때때로 버그가 발생할 수 있습니다 [1]: https://i.stack.imgur.com/5ZSwl.png

제 경험은 다음과 같습니다.

속성 탭으로 이동합니다.

제목으로 문자를 보내려면 "alt+Enter"를 누르면서 다음 줄로 이동합니다.

그리고 "속성 --> 제어" 필드에서 "워드 랩"을 선택합니다.

사진.

언급URL : https://stackoverflow.com/questions/604632/how-do-you-add-multi-line-text-to-a-uibutton 입니다.

반응형