web-dev-qa-db-ja.com

UIButtonラベルテキストがクリップされています

デフォルトのラベルが付いたInterface Builderに組み込まれたUIButtonがあります。 Xcodeでは、ラベルテキストを次のように動的に変更しています。

myButton.titleLabel.text = @"this is the new label";

ただし、テキストが更新されると、新しい文字列は元の文字列と同じサイズに切り取られ、次のようになります。

this...label

なぜこれが起こっているのか誰でも知っていますか?

39
thenameisnick

UIButtonのタイトルを変更するには、 setTitle:forState: を使用する必要があります。タイトルを自分で変更した場合、ボタンにはラベルのサイズを変更する必要があることが示されません。そのため、次のようなことをしなければなりません。

myButton.titleLabel.text = @"this is the new label";
[myButton setNeedsLayout];

しかし、それがすべてのケースで機能するかどうかさえわかりません。 setTitle:forState:のようなメソッドが提供され、ボタンを手動で更新することなく複数の状態のタイトルを提供できるようになり、ボタンは新しいタイトルでレイアウトする必要があることを認識できます。

65

(ラベルに直接タイトルを設定するのではなく)ボタンのsetTitleメソッドを使用してみてください。タイトルラベルのサイズを強制的に変更する必要があります。

目的C:

[myButton setTitle:@"This is the text" forState:UIControlStateNormal];

またはSwiftで:

myButton.setTitle("This is the text", for: .normal)
31
Ian

別の解決策は、UILabelsができるように、UIButtonの内部UILabelがフォントサイズを縮小できるようにすることです。

button.titlelabel.minimumFontSize = 8.0; // or some more adequate size
self.buttonWithLongTitle.titleLabel.adjustsFontSizeToFitWidth = YES;
21

ボタンでsizeToFitを呼び出します。これにより、テキストに合わせてボタンのサイズが変更されます。

8
Jasarien

それがうまくいかなかった場合は、いつでも文字列のサイズを決定し、ボタンフレームの幅を調整できます。その場合、あなたはそれが収まると確信しています。

// Calculate the size 
CGSize buttonSize = [@"My text.." sizeWithFont:[UIFont systemFontOfSize:15.0]
                    constrainedToSize:someSize lineBreakMode:UILineBreakModeWordWrap];

// Do whatever you want with the "buttonSize", you can for example adjust your button's frame width
1
0x8b4df00d

Swift 4.2のソリューション

yourButton.titleLabel?.minimumScaleFactor = 0.5 //set whatever you want here to scale
yourButton.titleLabel?.adjustsFontSizeToFitWidth = true

Objective Cのソリューション

[yourButton.titleLabel setMinimumScaleFactor:0.5];
[yourButton.titleLabel setAdjustsFontSizeToFitWidth:YES];
0
iOS Lifee