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です。
ルーク、

それによって動作します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 UILineBreakModeClipをNSLineBreakByClippingで置き換える
CodeReaper

1
Nvm、それはちょうどそれnumberOfLinesを0 に変更した
Marty

34
button.titleLabel.adjustsFontSizeToFitWidth = YES;

自動レイアウトを使用していて、ボタンの幅に制約を設定している場合は、独自に作業を行う必要があります。

その他のオプション(最小倍率、行数など)は、必要に応じてさらにカスタマイズするために使用できますが、必須ではありません。


15

EliBudからの回答がiOS 8では機能しません。iOS8で機能する解決策を見つけました。以下は迅速なコードです。

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

結果はさまざまなブレークモードによって異なることがわかったので、label?.lineBreakModeで遊ぶことができます。


.adjustsFontSizeToFitWidth = true-NSTextFieldとサイズ変更可能なウィンドウで同じことをするにはどうすればよいですか?
レオダバス2014

これは、Xcode IB選択ラベルを使用し、最小フォントスケールを0.01に自動縮小するように設定するのと同じように見えます
Leo Dabus

NSTextFieldを使用する場合、AutoShrinkオプションはありません
Leo

UITextFieldにはテキストを自動縮小するオプションがありますが、NSTextFieldにはありません。したがって、テキストフィールドの幅に合わせて手動でフォントを調整する必要があると思います。
Alexander Belyavskiy 14

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

ゲッターを作成するために利用可能
Nik Kov

どういう意味ですか?
Zaporozhchenko Oleksandr

フラグのようなタグを使用して、調整が有効かどうかを定義します。
Nik Kov 2018

なぜ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のように大幅に減少しています。文字列が大きいときにタイトルラベルの幅を増やす方法はありますか?
R.モハン

@ R.Mohan確かに、これはすべて固定幅に関するものです。制約を固定せずにそのままにしておくと、大きくなります。先頭と末尾の両方を設定しないでください。または、いずれかを設定しないでください> =
Zaporozhchenko Oleksandr

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.