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.