タイトルに2行のテキストが含まれるUIButton(numberOfLines = 2)


86

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

    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];

誰かがUIButton2行で作品を作る方法を知っていますか?UILabelテキストを保持するためのセパレートを作成し、それをボタンのサブビューとして追加する唯一の解決策はありますか?


1
これ見たことある ?- stackoverflow.com/questions/604632/...
Viraj

Viraj、はい、設定numberOfLines=0して使用するとUILineBreakModeWordWrap、複数の行を取得できます。それに関する問題は、テキストが長すぎると2行以上になる可能性があることです。私がしたい正確に(テキストが長すぎる場合)は、第2の行の末尾に省略記号を持つ2つのlonesを。
マーケティング担当者

ああ、それならサブビューを追加することが唯一の方法かもしれないと思います。
Viraj 2011年

回答:


87

最新のiOSバージョンの回答を更新

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

これらのプロパティは、ボタンのtitleLabelで設定します。

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

スウィフト3と4:

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

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

上に2行のテキストUIButtonが必要な場合は、その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.

InterfaceBuilderソリューション用に更新

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

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

titleLabel.textAlignment Number [1]

5
UILineBreakMode非推奨です。NSLineBreakMode代わりに使用してください
guillaume 2013

2
最近のiOSバージョンでは、これは不要です。@seanの回答を参照してください。
cbowns 2014

146

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

6
これは2013年であり、今日の時点でこれは最先端のソリューションです。
クラース2013年

@Blip残念ながらできず、コードで行う必要があります。この機能を要求するAppleにバグレポートを提出する価値があるかもしれません。
bpapa 2015

@bpapaはい、同意します。ストーリーボードはもっと柔軟なはずです。
ブリップ2015

6
これは私にとってはうまくいきますが、ボタンのデフォルトの動作を壊し、intrinsicContentSizeテキストの1行だけに対応する高さを返します。intrinsicContentSize高さをに設定したボタンを上書きして修正しました[self.titleLabel sizeThatFits(CGSizeMake(self.titleLabel.frame.size.width, CGFLOAT_MAX)].height
エリーゼ

@WillVonUllrichは、承認された回答は編集されたときにのみ変更できるためです。私はこれらの回答を承認された回答に追加したので、承認された回答よりも先を見ない人々を助けることができます。
Totumus Maximus 2017

88

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

titleLabel.textAlignment Number [1]

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


1
このソリューションは、単純なケースでは、現在受け入れられているソリューションよりも優れています(オブジェクト、コードが少ない)。
Jonathan Zhan 2012年

1
プログラムで設定するのとまったく同じプロパティを設定するため、引数「lessobjects」は無効になります。コードは多分少ないです。しかし、それはより読みやすいです。お
好きなものを

ああ、はっきりしなかったと思います。明確にしてくれてありがとう。それがIBvsCodeで行われているという事実にはあまり関心がありませんでした。Borutのソリューションでラベルを追加する必要がなく、同じことを実現するという事実と関係があります。しかし、はい、どちらもうまく機能します。:)
Jonathan Zhan 2012年

このような基本的なタスクのためにコードビハインドに行く必要があるのは本当に圧倒的です。
缶Poyrazoğlu

3
Interface BuilderでtitleLabel.textAlignment ユーザー定義のランタイム属性を追加し、それをNumber = 1(NSTextAlignmentCenterの値)に設定することで、同じ目標を100%コードレスで達成できます。
0xced 2014

21
 button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;

button.titleLabel.textAlignment = NSTextAlignmentCenter;

[button setTitle: @"Line1\nLine2" forState: UIControlStateNormal];

完璧なもの!NSString内部を分割する必要はありませんsetTitle。`WordWrapping``はあなたのためにこれをやっています!
Alex Cio 2015年

私にとっては、セットのタイトル内で文字列を分割する必要がありました。それなしでは機能しませんでした
user1960169 2016年

9

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

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

次に、ユーザー定義のランタイム属性に追加できます

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

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


0

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

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.