386

私は次のコードを持っています...

UILabel *buttonLabel = [[UILabel alloc] initWithFrame:targetButton.bounds];
buttonLabel.text = @"Long text string";
[targetButton addSubview:buttonLabel];
[targetButton bringSubviewToFront:buttonLabel];

...ボタンに複数行のテキストを使用できるという考えですが、テキストは常にUIButtonのbackgroundImageによって隠されています。ボタンのサブビューを表示するロギング呼び出しは、UILabel が追加されたことを示しますが、テキスト自体は表示されません。これはUIButtonのバグですか、それとも何か間違っていますか?

4

30 に答える 30

699

iOS 6 以降では、次を使用して複数行を許可します。

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
// you probably want to center it
button.titleLabel.textAlignment = NSTextAlignmentCenter; // if you want to 
[button setTitle: @"Line1\nLine2" forState: UIControlStateNormal];

iOS 5 以下の場合、次を使用して複数行を許可します。

button.titleLabel.lineBreakMode = UILineBreakModeWordWrap;
// you probably want to center it
button.titleLabel.textAlignment = UITextAlignmentCenter;
[button setTitle: @"Line1\nLine2" forState: UIControlStateNormal];

2017年、iOS9以降

通常、次の 2 つのことを行うだけです。

  1. 「属性付きテキスト」を選択
  2. 「改行」ポップアップで「ワードラップ」を選択します
于 2009-12-01T22:34:56.043 に答える
61

複数の行が中央に配置されたタイトルのボタンを追加する場合は、Interface Builder の設定をボタンに設定します。

[ ここ]

于 2015-10-21T09:03:53.627 に答える
54

IOS 6 の場合:

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.textAlignment = NSTextAlignmentCenter;

として

UILineBreakModeWordWrap and UITextAlignmentCenter

IOS 6 以降では非推奨です。

于 2012-10-08T07:14:08.883 に答える
32

ロジャー・ノーランの提案を言い換えますが、明示的なコードを使用すると、これが一般的な解決策です。

button.titleLabel?.numberOfLines = 0
于 2010-10-28T15:45:02.900 に答える
11

もっと簡単な方法があります:

someButton.lineBreakMode = UILineBreakModeWordWrap;

(iOS 3以降用に編集:)

someButton.titleLabel.lineBreakMode = UILineBreakModeWordWrap;
于 2009-10-25T19:48:31.960 に答える
7

まず、UIButton の内部に既に UILabel があることに注意してください。で設定できます–setTitle:forState:

この例の問題は、UILabel のnumberOfLinesプロパティをデフォルト値の 1 以外に設定する必要があることですlineBreakMode。プロパティも確認する必要があります。

于 2009-03-03T08:35:36.170 に答える
4

ここでの回答は、プログラムで複数行のボタン タイトルを実現する方法を示しています。

ストーリーボードを使用している場合は、[Ctrl+Enter] を入力して、ボタン タイトル フィールドに改行を強制することができます。

HTH

于 2013-05-01T09:50:09.847 に答える
4

Xcode 4 のストーリーボードを使用している場合は、ボタンをクリックすると、右側のユーティリティ ペインの属性インスペクターの下に、改行のオプションが表示されます。Word Wrap を選択すると、準備完了です。

于 2012-05-09T18:12:27.617 に答える
3

タイトル ラベルの間隔をボタンに固定するには、setTitle の前にtitleEdgeInsets およびその他のプロパティを設定します。

    let button = UIButton()
    button.titleLabel?.lineBreakMode = .byWordWrapping
    button.titleLabel?.numberOfLines = 0
    button.titleEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 20, right: 20)
    button.setTitle("Dummy button with long long long long long long long long title", for: .normal)

PS私はtitleLabel?.textAlignmentの設定をテストしましたが、タイトルは必要ありません.natural

于 2020-03-04T18:28:33.783 に答える
3

iOS 6 で自動レイアウトを使用する場合は、次のpreferredMaxLayoutWidthプロパティも設定する必要がある場合があります。

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.textAlignment = NSTextAlignmentCenter;
button.titleLabel.preferredMaxLayoutWidth = button.frame.size.width;
于 2013-05-01T18:45:41.753 に答える
2

それは完全に機能します。

これを Plist のような構成ファイルで使用するには、次のように CDATA を使用して複数行のタイトルを記述する必要があります。

<string><![CDATA[Line1
Line2]]></string>
于 2011-05-11T10:04:58.020 に答える
1

独自のボタン クラスをロールします。長い目で見れば、これが最良の解決策です。UIButton およびその他の UIKit クラスは、カスタマイズ方法が非常に制限されています。

于 2009-03-10T13:16:10.243 に答える
0

ボタンの制約とサブビューを追加します。これが私のプロジェクトでのやり方です。このようにはるかに簡単です。私は文字通り 99% の時間をプログラムで作成しています。ストーリーボードは時々本当にバグがあります [1]: https://i.stack.imgur.com/5ZSwl.png

于 2020-08-09T20:18:34.563 に答える
0
self.btnError.titleLabel?.lineBreakMode = NSLineBreakMode.byWordWrapping

self.btnError.titleLabel?.textAlignment = .center

self.btnError.setTitle("Title", for: .normal)
于 2017-08-03T09:40:40.380 に答える
-4

サブビューをコントロールに追加することは問題ありませんが、実際に機能するという保証はありません。コントロールがそこにサブビューがあることを期待していない可能性があり、その結果、動作が低下する可能性があるためです。それを回避できる場合は、ラベルをボタンの兄弟ビューとして追加し、そのフレームをボタンに重なるように設定します。ボタンの上に表示されるように設定されている限り、ボタンにできることは何もありません。

言い換えると:

[button.superview addSubview:myLabel];
myLabel.center = button.center;
于 2009-03-03T12:04:43.500 に答える