UILabelに改行を追加するにはどうすればよいですか?


262

文字列が次のようになっていることを確認します。

NSString *longStr = @"AAAAA\nBBBBB\nCCCCC";  

UILabelがこのようなメッセージを表示するようにするにはどうすればよいですか

AAAAA
BBBBB
CCCCC

\nUILabelによって認識されるとは思わないので、NSLabelの内部に何かを入れて、UILabelが改行を作成しなければならないことを認識できるようにしますか?

回答:


332

\n文字列で使用しているとおりに使用します。

numberOfLinesを0に設定して、任意の数の行を許可します。

label.numberOfLines = 0;

を使用して、テキストのサイズに一致するようにラベルフレームを更新しますsizeWithFont:。これを行わないと、テキストは垂直方向に中央揃えされるか、切り取られます。

UILabel *label; // set frame to largest size you want
...
CGSize labelSize = [label.text sizeWithFont:label.font
                          constrainedToSize:label.frame.size
                              lineBreakMode:label.lineBreakMode];
label.frame = CGRectMake(
    label.frame.origin.x, label.frame.origin.y, 
    label.frame.size.width, labelSize.height);

更新:非推奨の代替

sizeWithFont:constrainedToSize:lineBreakMode:

リファレンス、廃止されたsizeWithFontの置換:iOS 7で?

CGSize labelSize = [label.text sizeWithAttributes:@{NSFontAttributeName:label.font}];

label.frame = CGRectMake(
    label.frame.origin.x, label.frame.origin.y, 
    label.frame.size.width, labelSize.height);

2
UILabeliOSにoriginnor sizeプロパティはありませんか?それはおそらくlabel.frame.origin.x等であるはずです
Peterdk '26年

1
sizeWithAttributesを使用してフレームを設定する代わりに、sizeToFitを呼び出してワークアウトし、1つの簡単な手順でフレームサイズを設定できます。
jimmyjudas 2015

@Hermang、回答を更新して最新のものにしてくれてありがとう。
Gerry Shaw

275

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

Interface Builderの小さなボックスに入力するときにoption-returnを使用して、改行(\ n)を挿入します。Interface BuilderのLabel属性で、#Lines = 0に設定します。

ラベルを選択し、上記の画像のようにLinesプロパティを0に変更し、文字列で改行するために\ nを使用します。


2
これはとても便利です!
Nitin Alabur、2015

これを永遠に探しました。ありがとう:)
Shai Mishali

素晴らしい答え。ありがとう!
Macondo2Seattle 2015

1
プログラムでラベルを設定し、文字列に\ n(改行)を追加すると機能しません。
Chewie The Chorkie 2018年

すごい。私の要件は、ストーリーボードラベルのみでこれを行うことでした。そして、これは魅力のように働きました。
Tejas

132

XMLファイルから文字列を読み取る場合\n、この文字列の改行はUILabelテキストでは機能しません。の\n改行に解析されません。

この問題を解決するための小さなトリックを次に示します。

// correct next line \n in string from XML file
NSString *myNewLineStr = @"\n";
myLabelText = [myLabelText stringByReplacingOccurrencesOfString:@"\\n" withString:myNewLineStr];

myLabel.text = myLabelText;

したがって\n、文字列内の解析されていない部分\nを、ハードコードされた解析済みの部分に置き換える必要がありますNSString

これが私のその他のラベル設定です。

myLabel.numberOfLines = 0;
myLabel.backgroundColor = [UIColor lightGrayColor];
myLabel.textColor = [UIColor redColor]; 
myLabel.font = [UIFont fontWithName:@"Helvetica Neue" size:14.0];   
myLabel.textAlignment = UITextAlignmentCenter;

(=ラベルの無制限の行数)に設定numberOfLinesすることが最も重要です0

なぜAppleが\nXMLから読み取った文字列を解析しないことを選択したのか分かりませんか?

お役に立てれば。


1
iOSは\nParse.comから文字列を取得するときに解析しません(他のAPIから文字列を取得するときにも発生すると思います)
Brian

あなたは私の日を救った。XMLファイルから改行付きの文字列を取得しています。
Senry

127

インターフェイスビルダーでは、Ctrl+ Enterを使用して/n目的の位置に挿入できます。この方法では、次の状況を実装できます

ああ
あああああ


いいえ、反対票は投じませんでした。私はちょうどより良いプレゼンテーションのために答えを編集しました。
Manoj Kumar

とてもシンプル!+1
marlonpya

2
私はそのトリックを知らなかったなんて信じられない!Shift-Enterを試してみたのは、他の場所ではかなり標準的なことだからです。それをありがとう!
エシェロン2017

これはまさに私が探していたものでした!+1ありがとうございます!
rickrvo 2018年

1
素晴らしいポスト!小さな修正:挿入/ nの代わりに挿入\ nを意味していると思います
craft

25

numberOfLinesプロパティを設定する必要がありますUILabel。デフォルトは1です。0に設定すると、すべての制限が削除されます。


22

それは\n(バックスラッシュ)ではなく(バックスラッシュ)であることに注意してください/n


10

Swift 2.2では、> iOS 8

StoryboardのAttribute InspectorでLines = 0を設定し、参照アウトレットをラベルにリンクしました。次に、このようにコントローラで使用します:

 @IBOutlet weak var listLabel: UILabel!

 override func viewDidLoad() {
      ...
      listLabel.text = "Line 1\nLine 2\nLine 3\nLine 4\nLine 5\nLine 6\nLine 7\nLine 8"
 }

7

このようにしてください

NSString * strCheck = @"A\nB";

strCheck = [strCheck stringByReplacingOccurrencesOfString:@"\\n" withString:@"\n"];  //This is to prevent for fetching string from plist or data structure

label.numberOfLines = 0;

label.lineBreakMode = NSLineBreakByWordWrapping;

label.text = strCheck;

それは働いています.. :)
Bibin Joseph

6

// numberOfLinesをゼロに設定することを忘れないでください

UILabel* locationTitle = [[UILabel alloc] initWithFrame:CGRectMake(5, 30, 230, 40)];
locationTitle.font = [UIFont systemFontOfSize:13.0];
locationTitle.numberOfLines = 0;
locationTitle.text = [NSString stringWithFormat:@"Eaton industries pvt. Ltd \nUK Apr 12"];
[cell addSubview:locationTitle];

4

Xcode 6では、ワードラップを使用する場合、文字列内でも\ nを使用できます。それが動作します。だから例えば:

UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0, 100, screenRect.size.width, 50)];
label.textAlignment = NSTextAlignmentCenter;
label.text = @"This will be on the first line\nfollowed by a line under it.";
label.lineBreakMode = UILineBreakModeWordWrap;
label.numberOfLines = 0;

3

を使用しUILabelている場合、デフォルト設定が1行であることを覚えておく必要があるため、追加する改行の数(\nまたは\r)は関係ありません。追加できるように、必ず複数行に設定する必要があります。より多くのライン。

1つの代替方法は、UITextView実際には複数行を対象とした使用です。

これは、UILabelのXCode属性セクションで簡単に実現できます。スクリーンショットを参照してください。

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


3

簡単な解決策が必要な場合は、テキストラベル入力ボックスで次の操作を行います。

番号行が0に設定されていることを確認してください。

Alt + Enter

(Altはオプションキーです)

乾杯!



2

私の場合も\ n機能していませんでした。行数を0にして問題を修正し、たとえばHello \ n World iの代わりに新しい行自体でテキストをコピーして貼り付けました

こんにちは

世界

インターフェースビルダーで。


優れた!動作します。
DmitryKanunnikoff 2018

2

xCode 11、Swift 5では問題なく\n動作します。以下のコードを試してください。

textlabel.numberOfLines = 0
textlabel.text = "This is line one \n This is line two \n This is line three"

1
textLabel.text = @"\nAAAAA\nBBBBB\nCCCCC";
textLabel.numberOfLines = 3; \\As you want - AAAAA\nBBBBB\nCCCCC
textLabel.lineBreakMode = UILineBreakModeWordWrap;
NSLog(@"The textLabel text is - %@",textLabel.text);

0

sizeWithFont:constrainedToSize:lineBreakMode:ios8で問題が発生する可能性のある人やios8に切り替える人(この方法はios7で非推奨)については、sizeToFit代わりにを使用して高さを調整しました。

UILabel *label;
label.numberOfLines = 0;
// Setup label with desired settings
...
[label sizeToFit];
label.frame = CGRectMake(label.frame.origin.x,     // Or use any desired origin
                         label.frame.origin.y, 
                         label.frame.size.width,   // Or use any desired width
                         label.frame.size.height);

0
NSCharacterSet *charSet = NSCharacterSet.newlineCharacterSet;
NSString *formatted = [[unformatted componentsSeparatedByCharactersInSet:charSet] componentsJoinedByString:@"\n"];

0

特にautolayoutを使用している場合は、ラベルフレームのサイズを変更するのは間違っているようです。appendFormatメソッドを使用する方が適切と思われます。これが私の例です:

NSMutableString *list = [[NSMutableString alloc] init];
NSArray *textArray = @[@"AAAA", @"BBBB"];
for (NSString *string in textArray) {
    [list appendFormat:@"%@\n", string.mutableCopy];
}
self.label.text = list;
self.label.numberOfLines = 0;

0

UILableプロパティをPlainからAttributedに設定した場合、UILabelの高さと幅がテキストを表示したい画面領域に合うように設定されるため、UILabelは複数の段落に関係なく複数行のテキストを保持します。


0

私は同じ問題に直面しました、そしてここに、私が問題をどのように解決したかがあります。これが誰かのために役立つことを願っています。

// Swift 2

   lblMultiline.lineBreakMode = .ByWordWrapping // or use NSLineBreakMode.ByWordWrapping
   lblMultiline.numberOfLines = 0 

// Objective-C

  lblMultiline.lineBreakMode = NSLineBreakByWordWrapping;
  lblMultiline.numberOfLines = 0;

// C#(Xamarin.iOS)

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