デフォルトのラベルが付いたInterface Builderに組み込まれたUIButtonがあります。 Xcodeでは、ラベルテキストを次のように動的に変更しています。
myButton.titleLabel.text = @"this is the new label";
ただし、テキストが更新されると、新しい文字列は元の文字列と同じサイズに切り取られ、次のようになります。
this...label
なぜこれが起こっているのか誰でも知っていますか?
UIButton
のタイトルを変更するには、 setTitle:forState: を使用する必要があります。タイトルを自分で変更した場合、ボタンにはラベルのサイズを変更する必要があることが示されません。そのため、次のようなことをしなければなりません。
myButton.titleLabel.text = @"this is the new label";
[myButton setNeedsLayout];
しかし、それがすべてのケースで機能するかどうかさえわかりません。 setTitle:forState:
のようなメソッドが提供され、ボタンを手動で更新することなく複数の状態のタイトルを提供できるようになり、ボタンは新しいタイトルでレイアウトする必要があることを認識できます。
(ラベルに直接タイトルを設定するのではなく)ボタンのsetTitleメソッドを使用してみてください。タイトルラベルのサイズを強制的に変更する必要があります。
目的C:
[myButton setTitle:@"This is the text" forState:UIControlStateNormal];
またはSwiftで:
myButton.setTitle("This is the text", for: .normal)
別の解決策は、UILabelsができるように、UIButtonの内部UILabelがフォントサイズを縮小できるようにすることです。
button.titlelabel.minimumFontSize = 8.0; // or some more adequate size
self.buttonWithLongTitle.titleLabel.adjustsFontSizeToFitWidth = YES;
ボタンでsizeToFit
を呼び出します。これにより、テキストに合わせてボタンのサイズが変更されます。
それがうまくいかなかった場合は、いつでも文字列のサイズを決定し、ボタンフレームの幅を調整できます。その場合、あなたはそれが収まると確信しています。
// 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
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];