code

UIButton 글꼴 크기를 너비에 맞게 조정

starcafe 2023. 4. 18. 23:10
반응형

UIButton 글꼴 크기를 너비에 맞게 조정

다음 코드가 있습니다.

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(0.0, 0.0, 25, 25);

[[button layer] setCornerRadius:5.0f];
[[button layer] setMasksToBounds:YES];
[[button layer] setBackgroundColor:[[UIColor redColor] CGColor]];
[button.titleLabel setFrame:CGRectMake(0,0, 25, 25)];

[button setTitle:[NSString stringWithFormat:@"%@", [[topics objectAtIndex:indexPath.row] unread]] forState:UIControlStateNormal];

이 문제는 텍스트 내의 문자열이 길지 않은 경우 정상(1-2자리)으로 표시되는 것입니다.다만, 꽤 길면(3++자리) 안에 텍스트가 없는 빨간색 버튼 밖에 보이지 않습니다.이거 어떻게 조절해요?

난 그렇게 생각하지 않아:

[button.titleLabel setAdjustsFontSizeToFitWidth:YES];

일이 잘 되는 거죠?

이것을 시험해 보세요.

button.titleLabel?.numberOfLines = 1
button.titleLabel?.adjustsFontSizeToFitWidth = true
button.titleLabel?.lineBreakMode = .byClipping //<-- MAGIC LINE

이게 왜 효과가 있는지 모르겠지만 효과가 있습니다:)

button.titleLabel.adjustsFontSizeToFitWidth = YES;

자동 레이아웃을 사용하고 있으며 버튼 너비에 제한을 두고 있는 경우,는 스스로 작업을 수행해야 합니다.

다른 옵션(최소 축척률, 라인 수 등)은 필요에 따라 추가로 사용자 정의하는 데 사용할 수 있지만 필수는 아닙니다.

EliBud의 답변은 iOS 8에서 작동하지 않습니다. iOS 8에서 작동하는 솔루션을 찾았습니다. 아래는 빠른 코드입니다.

let label = self.button?.titleLabel
label?.minimumScaleFactor = 0.01
label?.adjustsFontSizeToFitWidth = true
label?.font = UIFont.systemFontOfSize(100)

라벨 가지고 놀 수 있어?lineBreakMode는 브레이크모드에 따라 결과가 다르다는 것을 알게 되었습니다.

Swift 4 확장

extension UIButton {
    @IBInspectable var adjustFontSizeToWidth: Bool {
        get {
            return self.titleLabel?.adjustsFontSizeToFitWidth
        }
        set {
            self.titleLabel?.numberOfLines = 1
            self.titleLabel?.adjustsFontSizeToFitWidth = newValue;
            self.titleLabel?.lineBreakMode = .byClipping;
            self.titleLabel?.baselineAdjustment = .alignCenters 
        }
    }
}

여기에 이미지 설명 입력

최근에 이것은 나에게 효과가 있는 것 같다

button.titleLabel!.numberOfLines = 1
button.titleLabel!.adjustsFontSizeToFitWidth = true
button.titleLabel!.lineBreakMode = NSLineBreakMode.ByClipping

iOS 10.3 솔루션은 다음과 같은 다른 답변을 기반으로 합니다.

    button.titleLabel!.numberOfLines = 1
    button.titleLabel!.adjustsFontSizeToFitWidth = true
    button.titleLabel!.baselineAdjustment = .alignCenters

아무도 언급하지 않았다.baselineAdjustment버튼 라벨이 세로 방향으로 어긋나기 때문에 필요했습니다.adjustsFontSizeToFitWidth유효하게 됩니다.애플의baselineAdjustment문서:

이 경우,adjustsFontSizeToFitWidth속성이 로 설정됩니다.true이 속성은 글꼴 크기 조정이 필요한 경우 텍스트 기준선의 동작을 제어합니다.이 속성의 기본값은 다음과 같습니다.alignBaselines이 속성은 다음 경우에만 유효합니다.numberOfLines속성이 로 설정됩니다.1.


WWIW, 라벨을 완벽하게 맞출 수 없었습니다.

adjustsFontSizeToFitWidthInterface Builder에서 버튼의 너비 제한을 설정할 때까지 작동하지 않았습니다.

구속조건을 설정하면 버튼의 크기가 커지는 것을 방지하고 텍스트를 축소해야 한다는 것을 깨닫지 못했습니다.

Nik Kov의 답변에 근거합니다.

import UIKit


    extension UIButton {
        @IBInspectable var adjustFontSizeToWidth: Bool {
            get {
                return titleLabel!.adjustsFontSizeToFitWidth
            }
            set {
                titleLabel!.adjustsFontSizeToFitWidth = newValue
                titleLabel!.lineBreakMode             = .byClipping
            }
        }
    }

Swift 5가 탑재된 iOS 13.1에서는contentEdgeInsets패딩 조절도 가능합니다.

extension UIButton {
    @IBInspectable var adjustFontSizeToWidth: Bool {
        get {
            return self.titleLabel?.adjustsFontSizeToFitWidth ?? false
        }
        set {
            self.titleLabel?.numberOfLines = 1
            self.titleLabel?.adjustsFontSizeToFitWidth = newValue;
            self.titleLabel?.lineBreakMode = .byClipping;
            self.titleLabel?.baselineAdjustment = .alignCenters
            self.contentEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
        }
    }
}

다른 답변이 모두 도움이 되지 않으면 기본 스토리보드 스타일 값을 설정한 후adjustsFontSizeToFitWidth작동해야 합니다.

단추 소품

자마린OS 솔루션

var accountButton = new UIButton();
accountButton.SetTitle("Account", UIControlState.Normal);            
accountButton.TitleLabel.AdjustsFontSizeToFitWidth = true;
accountButton.TitleLabel.Lines = 1;
accountButton.TitleLabel.LineBreakMode = UILineBreakMode.Clip;
accountButton.TitleLabel.Font = accountButton.TitleLabel.Font.WithSize(35);

시스템이 크기를 조정하기 전에 글꼴 크기를 "크게" 설정했습니다.

이하의 솔루션이 유효했습니다.

button.titleLabel?.adjustsFontForContentSizeCategory = true

개발자 문서에서는 이 속성에 대해 다음과 같이 설명합니다.

장치의 콘텐츠 크기 범주가 변경될 때 개체가 자동으로 글꼴을 업데이트할지 여부를 나타내는 부울 값입니다.

언급URL : https://stackoverflow.com/questions/6178545/adjust-uibutton-font-size-to-width

반응형