web-dev-qa-db-ja.com

タイトルに2行のテキストを含むUIButton(numberOfLines = 2)

TitleLabelに2行のテキストがあるUIButtonを作成しようとしています。これは私が使用しているコードです:

    UIButton *titleButton = [[UIButton alloc] initWithFrame:CGRectMake(15, 10, frame.size.width-100, 100)];
    titleButton.titleLabel.font = [UIFont boldSystemFontOfSize:24.0];
    [titleButton setTitle:@"This text is very long and should get truncated at the end of the second line" forState:UIControlStateNormal];
    titleButton.titleLabel.lineBreakMode = UILineBreakModeTailTruncation;
    titleButton.titleLabel.numberOfLines = 2;
    [self addSubview:titleButton];

これを試すと、テキストは1行にしか表示されません。 UIButton.titleLabelで複数行のテキストを実現する唯一の方法は、numberOfLines=0を設定してUILineBreakModeWordWrapを使用することです。しかし、これはテキストが正確に2行であることを保証するものではありません。

ただし、プレーンUILabelを使用しても機能します。

    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 10, frame.size.width-100, 100)];
    titleLabel.font = [UIFont boldSystemFontOfSize:24.0];
    titleLabel.text = @"This text is very long and should get truncated at the end of the second line";
    titleLabel.numberOfLines = 2;
    titleLabel.lineBreakMode = UILineBreakModeTailTruncation;
    [self addSubview:titleLabel];

UIButtonを2行で動作させる方法を知っている人はいますか?テキストを保持する別個のUILabelを作成し、ボタンのサブビューとして追加する唯一のソリューションですか?

79
marketer

最新のiOSバージョンの更新された回答

これは受け入れられた答えなので、@ Seanの答えをここに追加しました。

これらのプロパティをボタンのtitleLabelに設定します。

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.numberOfLines = 2; // if you want unlimited number of lines put 0

Swift 3および4:

button.titleLabel?.lineBreakMode = .byWordWrapping
button.titleLabel?.numberOfLines = 2 // if you want unlimited number of lines put 0

iOSの古いバージョンの元の回答

UIButtonの上に2行のテキストが必要な場合、その上に正確にそれを行うUIlabelを追加する必要があります。

UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 10, frame.size.width-100, 100)];
titleLabel.font = [UIFont boldSystemFontOfSize:24.0];
titleLabel.text = @"This text is very long and should get truncated at the end of the second line";
titleLabel.numberOfLines = 2;
titleLabel.lineBreakMode = UILineBreakModeTailTruncation;
[myButton addSubview:titleLabel]; //add label to button instead.

インターフェイスビルダーソリューション用に更新

より完全な回答のために、@ Borut Tomazinの回答を追加しました。 @Borut Tomazinの回答が改善されたため、この部分を再度更新しました。

コードを必要とせずに、これをより簡単に行うことができます。 Interface Builderで、UIButtonのLine BreakWord Wrapに設定します。複数行のタイトルを挿入できるよりも。 Option + Returnキーを押すだけで新しい行が作成されます。また、Interface Builderのユーザー定義ランタイム属性にこれを追加する必要があります。

titleLabel.textAlignment Number [1]
74
Totumus Maximus

UILabelをUIButtonに追加する必要はありません。それはただの余分なオブジェクトと仕事です。

これらのプロパティをボタンのtitleLabelに設定します。

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.numberOfLines = 2;//if you want unlimited number of lines put 0

迅速:

button.titleLabel!.lineBreakMode = NSLineBreakMode.ByWordWrapping
button.titleLabel!.numberOfLines = 2//if you want unlimited number of lines put 0
145
Sean

コードを必要とせずに、これをより簡単に行うことができます。 Interface Builderで、UIButtonのLine BreakWord Wrapに設定します。複数行のタイトルを挿入できるよりも。 Option + Returnキーを押すだけで新しい行が作成されます。また、Interface Builderのユーザー定義ランタイム属性にこれを追加する必要があります。

titleLabel.textAlignment Number [1]

とても簡単です。それが役に立てば幸い...

86
Borut Tomazin
 button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;

button.titleLabel.textAlignment = NSTextAlignmentCenter;

[button setTitle: @"Line1\nLine2" forState: UIControlStateNormal];
20
Suraj K Thomas

Xcode5以降では、コードを編集する必要性、したがってビューをサブクラス化する必要性を完全に回避するには、Borut Tomazinの提案に従うことができます。

Interface Builderで(またはストーリーボード)改行をワードラップに設定します。複数行のタイトルを挿入できるよりも。打つだけ Option + Return 新しい行を作成するキー。

そして、ser Defined Runtime Attributesで追加できます

キーパス:titleLabel.textAlignment
タイプ:Number
値:1

注:UITextAlignmentCenter定数を数値に変換しているため(これは新しいiOSバージョンがリリースされると変更される可能性があるため)、これは完全に「将来の証拠」ではありません。しかし、近い将来には安全と思われます。

9
furins

Storyboardから必要な値を直接変更できます。ボタンを選択し、IDインスペクターに移動して、「ユーザー定義のランタイム属性」セクションに次のキーと値のペアを追加します。

enter image description here

0
Arik Segal