UIButton 글꼴 크기를 너비로 조정


122

다음 코드가 있습니다.

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

일이 맞죠?


작동하거나 theLabel.adjustsFontSizeToFitWidth = YES입니다.
Luke

이 방식으로 작동합니다titleButton.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
onmyway133

답변:


291

이 시도:

button.titleLabel.numberOfLines = 1;
button.titleLabel.adjustsFontSizeToFitWidth = YES;
button.titleLabel.lineBreakMode = NSLineBreakByClipping; //<-- MAGIC LINE

왜 이것이 트릭을 수행하는지 잘 모르겠지만 :)


1
감사합니다. button.titleLabel.lineBreakMode = UILineBreakModeClip; <
-MAGIC

8
@yunas NSLineBreakByClipping와 UILineBreakModeClip 교체
CodeReaper

1
Nvm, 방금 numberOfLines0으로 변경 되었습니다
Marty

34
button.titleLabel.adjustsFontSizeToFitWidth = YES;

Auto-Layout을 사용 하고 버튼의 너비에 제약을 설정 한 경우 자체적으로 작업을 수행해야합니다 .

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


15

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

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

결과가 브레이크 모드에 따라 다르다는 것을 알았으므로 label? .lineBreakMode로 재생할 수 있습니다.


.adjustsFontSizeToFitWidth = true-NSTextField 및 크기 조정 가능한 창으로 어떻게 똑같이 할 수 있습니까?
Leo Dabus 2014

Xcode IB를 사용하여 레이블을 선택하고 최소 글꼴 배율을 0.01로 자동 축소하도록 설정하는 것과 동일하게 보입니다
Leo

NSTextField를 사용할 때 AutoShrink 옵션이 없습니다
Leo Dabus 2014

UITextField에는 텍스트를 자동 축소하는 옵션이 있지만 NSTextField에는 없습니다. 따라서 텍스트 필드 너비에 맞게 수동으로 글꼴을 조정해야한다고 생각합니다.
Alexander Belyavskiy 2014

10

최근 신속하게 이것은 나를 위해 작동하는 것 같습니다.

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

10

여기에 다른 답변을 기반으로 한 iOS 10.3 솔루션 :

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

baselineAdjustment아직 아무도 언급 하지 않았습니다. adjustsFontSizeToFitWidth효과가 적용된 후 버튼 레이블이 수직으로 어긋나 기 때문에 필요했습니다 . Apple의 baselineAdjustment문서 :

경우 adjustsFontSizeToFitWidth속성에 설정되어 true,이 속성 컨트롤 글꼴 크기의 조정이 필요한 상황에서 텍스트 기준선의 동작. 이 속성의 기본값은 alignBaselines입니다. 이 속성은 numberOfLines속성이로 설정된 경우에만 유효 합니다 1.


FWIW, 저는 라벨을 완벽하게 정렬 할 수 없었습니다.


8

adjustsFontSizeToFitWidth Interface Builder에서 내 버튼에 너비 제약 조건을 설정할 때까지 작동하지 않았습니다.

제약 조건을 설정하면 버튼의 크기가 커지지 않아 텍스트를 축소해야한다는 사실을 깨닫지 못했습니다.


8

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 
        }
    }
}

여기에 이미지 설명 입력


당신은 무엇을 위해 태그를 사용합니까?
Zaporozhchenko Oleksandr

게터하게 사용할 수의 경우
닉 KOV

무슨 뜻인지 더 깊이 설명해 주시겠습니까?
Zaporozhchenko Oleksandr

조정이 활성화되었는지 정의하기 위해 플래그와 같은 태그를 사용합니다.
Nik Kov

왜 self.titleLabel을 사용하지 않습니까? .adjustsFontSizeToFitWidth? 뭐가 더 필요해?
Zaporozhchenko Oleksandr

3

Xamarin.iOS 솔루션

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

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


3

Nik Kov의 답변에 따라 :

import UIKit


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

이것은 작동하지만 글꼴 크기는 17에서 12로 많이 줄어들고 있습니다. 문자열이 더 클 때 titlelabel의 너비를 늘리는 방법이 있습니까?
R. Mohan

@ R.Mohan 확실하지만 이것은 고정 너비에 관한 것입니다. 제약을 고정하지 않으면 성장할 것입니다. 모두 후행 / 선행, 또는 그들 중 하나를> 만들 = 설정하지 마십시오
Zaporozhchenko 올렉산드르

0

아래 솔루션이 저에게 효과적이었습니다.

button.titleLabel?.adjustsFontForContentSizeCategory = true

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

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


0

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