UILabelの複数行のテキスト


443

複数行のテキストを持ってする方法があるUILabelようにはしてUITextViewか、私の代わりに第二1を使用する必要がありますか?


5
これUILineBreakModeWordWrapはiOS 6で廃止されたことに注意してください。今すぐ使用する必要がNSLineBreakByWordWrapping = 0あります。こちら
オースティン

回答:


796

解決策を見つけました。

次のコードを追加するだけです。

// Swift
textLabel.lineBreakMode = .ByWordWrapping // or NSLineBreakMode.ByWordWrapping
textLabel.numberOfLines = 0 

// For Swift >= 3
textLabel.lineBreakMode = .byWordWrapping // notice the 'b' instead of 'B'
textLabel.numberOfLines = 0

// Objective-C
textLabel.lineBreakMode = NSLineBreakByWordWrapping;
textLabel.numberOfLines = 0;

// C# (Xamarin.iOS)
textLabel.LineBreakMode = UILineBreakMode.WordWrap;
textLabel.Lines = 0;  

古い回答を復元しました(参考のため、および6.0より前のiOSを喜んでサポートする開発者向け):

textLabel.lineBreakMode = UILineBreakModeWordWrap;
textLabel.numberOfLines = 0;

どちらにしても、両方の列挙値は0とにかく譲歩します。


16
UILineBreakModeWordWrapは実際にはデフォルトなので、最初の行は必要ありません。
ジャレッドオルソン

1
swiftを使用している場合:cell.textLabel?.lineBreakMode = NSLineBreakMode.ByWordWrappingおよびcell.textLabel?.numberOfLines = 0
boidkan 2014年

5
Xamarin-Codeも提供していただきありがとうございます。オートコンプリートは、そのプロパティを短縮することを選択したため機能しませんでした... +1
Jan Gillich

Jarred Olsonに同意します。NSLineBreakByWordWrappingデフォルトですGurumoorthy ArumugamのガイドのようにプロパティsizeToFitを追加して修正しました。ラベル内のフォントを調整して、ラベルの境界に合わせます。使用できます:textLabel.adjustsFontSizeToFitWidth = YES; 皆さんありがとう。
ライアントラン2015

@JarredOlsonのドキュメントでは、「このプロパティはデフォルトでbyTruncatingTailに設定されています。」
ビル

138

IBでは、行数を0に設定(無制限の行を許可)

IBを使用してテキストフィールド内に入力する場合は、「alt-return」を使用して改行を挿入し、次の行に移動します(または、行で区切られたテキストをコピーできます)。


1
[彼は1年以上前のスレッドを意図的に掘り下げているので…] IBでときどき私ができることの1つは、改行なしでテキスト入力し、UILineBreakModeWordWrapおよびnumberOfLines = 0を設定して、ラベルをautoにすることです。 -高さを自動的にサイズ調整しますが、その間もIBで設計します。ビューのサイズが横長に変更され、ラベルの改行が問題になる可能性がある場合を考えています。または...私はIBを誤用している可能性があります!おそらく、ラベルをIB内で自動サイズ設定すると、解決する以上の問題が発生しますか?(また、とにかく、この時点ではsizeToFitを呼び出すことはできません。)
Joe D'Andrea

私がUILabelのドキュメントから得た「0」のことは、Interface Builderを長年使用している友人からのalt-returnです。
Kendall Helmstetter Gelner、2011

3
「alt-return」について言及する唯一の回答である+1。特に「ctrl-return」は機能するように見えますが機能しません。
paulmelnikow 2013年

52

私が見つけた最良の解決策(フレームワークで解決すべきであるはずのイライラする問題に対して)は、vaychickの解決策に似ています。

IBまたはコードのいずれかで行数を0に設定するだけです

myLabel.numberOfLines = 0;

これにより、必要な行が表示されますが、ラベルが水平方向に中央揃えになるように再配置されます(1行と3行のラベルが水平位置に揃うように)。その追加を修正するには:

CGRect currentFrame = myLabel.frame;
CGSize max = CGSizeMake(myLabel.frame.size.width, 500);
CGSize expected = [myString sizeWithFont:myLabel.font constrainedToSize:max lineBreakMode:myLabel.lineBreakMode]; 
currentFrame.size.height = expected.height;
myLabel.frame = currentFrame;

あなたと@Ilya Suzdalnitskiの助けを借りて私のクエリを解決してください。どうもありがとう。
Mihir Oza

33

これを使用して、複数行のテキストを作成しUILabelます。

textLabel.lineBreakMode = NSLineBreakByWordWrapping;
textLabel.numberOfLines = 0;

迅速:

textLabel.lineBreakMode = .byWordWrapping
textLabel.numberOfLines = 0


16

以下を使用する必要がある場合:

myLabel.numberOfLines = 0;

プロパティ("\n")では、コードで標準の改行を使用して新しい行を強制することもできます。


15

あなたは使用することができ\r、最大充填しながら次の行に移動するにはUILabel使用してNSString

UILabel * label;


label.text = [NSString stringWithFormat:@"%@ \r %@",@"first line",@"seconcd line"];

14

これを試してみましょう

textLabel.lineBreakMode = NSLineBreakModeWordWrap; // UILineBreakModeWordWrap deprecated     
textLabel.numberOfLines = 0;                          

また、これはUILabelのIB 'Lines'属性全体で0に設定できます。
KoreanXcodeWorker 2016年

11
textLabel.lineBreakMode = UILineBreakModeWordWrap;
textLabel.numberOfLines = 0;

上記の解決策は私の場合うまくいきません。私はこのようにしています:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // ...

    CGSize size = [str sizeWithFont:[UIFont fontWithName:@"Georgia-Bold" size:18.0] constrainedToSize:CGSizeMake(240.0, 480.0) lineBreakMode:UILineBreakModeWordWrap];
    return size.height + 20;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
    {
        // ...
        cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
        cell.textLabel.numberOfLines = 0;
        cell.textLabel.font = [UIFont fontWithName:@"Georgia-Bold" size:18.0];
    }

    // ...

    UILabel *textLabel = [cell textLabel];
    CGSize size = [text sizeWithFont:[UIFont fontWithName:@"Georgia-Bold" size:18.0]
                                        constrainedToSize:CGSizeMake(240.0, 480.0)
                                            lineBreakMode:UILineBreakModeWordWrap];

    cell.textLabel.frame = CGRectMake(0, 0, size.width + 20, size.height + 20);

    //...
}


8

Swift 3
動的テキスト情報の行数をゼロに設定します。これは、さまざまなテキストに役立ちます。

var label = UILabel()
let stringValue = "A label\nwith\nmultiline text."
label.text = stringValue
label.numberOfLines = 0
label.lineBreakMode = .byTruncatingTail // or .byWrappingWord
label.minimumScaleFactor = 0.8 . // It is not required but nice to have a minimum scale factor to fit text into label frame

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


1
それは私のために働いているクルナルありがとう!
Yogesh Patel

6
UILabel *helpLabel = [[UILabel alloc] init];
NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:label];
helpLabel.attributedText = attrString;
// helpLabel.text = label;

helpLabel.textAlignment = NSTextAlignmentCenter;
helpLabel.lineBreakMode = NSLineBreakByWordWrapping;
helpLabel.numberOfLines = 0;

いくつかの理由で、iOS 6で機能しないのはなぜですか。属性付きテキストありとなしで試してみました。助言がありますか。


6

これを使ってみてください:

lblName.numberOfLines = 0;
[lblName sizeToFit];

sizeOfFitは、numberOfLineが0以外の場合は機能しません。興味深いです。
Onur Tuna

3

これらは私を助けました

UILabelのこれらのプロパティを変更する

label.numberOfLines = 0;
label.adjustsFontSizeToFitWidth = NO;
label.lineBreakMode = NSLineBreakByWordWrapping;

そして、入力文字列を与える間、\ nを使用して異なる行に異なる単語を表示します。

例:

 NSString *message = @"This \n is \n a demo \n message for \n stackoverflow" ;

3

方法1:

extension UILabel {//Write this extension after close brackets of your class
    func lblFunction() {
        numberOfLines = 0
        lineBreakMode = .byWordWrapping//If you want word wraping
        //OR
        lineBreakMode = .byCharWrapping//If you want character wraping
    }
}

今すぐこのように呼び出します

myLbl.lblFunction()//Replace your label name 

例:

Import UIKit

class MyClassName: UIViewController {//For example this is your class. 

    override func viewDidLoad() {
    super.viewDidLoad()

        myLbl.lblFunction()//Replace your label name 

    }

}//After close of your class write this extension.

extension UILabel {//Write this extension after close brackets of your class
    func lblFunction() {
        numberOfLines = 0
        lineBreakMode = .byWordWrapping//If you want word wraping
        //OR
        lineBreakMode = .byCharWrapping//If you want character wraping
    }
}

方法2:

プログラム的に

yourLabel.numberOfLines = 0
yourLabel.lineBreakMode = .byWordWrapping//If you want word wraping
//OR
yourLabel.lineBreakMode = .byCharWrapping//If you want character wraping

方法3:

ストーリーボードを通して

複数行を表示するには、0(ゼロ)を設定すると、ラベルに複数行が表示されます。

n行を表示する場合は、nを設定します。

以下の画面を参照してください。

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

ラベルの最小フォントサイズを設定する場合自動圧縮をクリックして、最小フォントサイズオプションを選択します。

以下の画面を参照してください

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

ここで最小フォントサイズを設定します

EX:9(この画像)

ラベルがその時点でより多くのテキストを取得する場合、ラベルテキストは最大9に縮小されます

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


2
UILabel *labelName = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
[labelName sizeToFit];
labelName.numberOfLines = 0;
labelName.text = @"Your String...";
[self.view addSubview:labelName];

追加することを忘れないでください:[labelName setLineBreakMode:NSLineBreakByWordWrapping];
Irineu Licks Filho 14

2

ストーリーボードからも行うことができます。

  1. ビューコントローラーでラベルを選択します
  2. 属性インスペクターで、行オプションの値を大きくします(Alt + Cmd + 4を押して属性インスペクターを表示します)。
  3. ビューコントローラでラベルをダブルクリックして、テキストを書き込むか貼り付けます
  4. テキスト全体を表示できるように、ラベルのサイズを変更するかフォントサイズを大きくします

Linesを0に設定します。それ以外の場合は、指定した行数に配置できるテキストのみが表示され、その他は省略されます。
toing_toing 2016年

2

あなたはこれを試す必要があります:

-(CGFloat)dynamicLblHeight:(UILabel *)lbl
{
    CGFloat lblWidth = lbl.frame.size.width;
    CGRect lblTextSize = [lbl.text boundingRectWithSize:CGSizeMake(lblWidth, MAXFLOAT)
                                               options:NSStringDrawingUsesLineFragmentOrigin
                                            attributes:@{NSFontAttributeName:lbl.font}
                                               context:nil];
    return lblTextSize.size.height;
}

1
UILabel *textLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 150, 30)];
[textLabel sizeToFit];
textLabel.numberOfLines = 0;
textLabel.text = @"Your String...";

1

すでに回答済みですが、ストーリーボードでも手動で行うことができます。ラベルの属性インスペクターで、改行をワードラップ(または文字ラップ)に変更できます。


1

この関数では、ラベルに割り当てる文字列を渡し、self.activityFontの代わりにフォントサイズを渡し、235の代わりにラベルの幅を渡します。これで、文字列に従ってラベルの高さを取得できます。正常に動作します。

-(float)calculateLabelStringHeight:(NSString *)answer
{
    CGRect textRect = [answer boundingRectWithSize: CGSizeMake(235, 10000000) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:self.activityFont} context:nil];
    return textRect.size.height;

}

1

コードまたはストーリーボード自体で以下に設定

Label.lineBreakMode = NSLineBreakByWordWrapping; Label.numberOfLines = 0;

ラベルの左、右、上、下の制約を設定することを忘れないでください。そうしないと機能しません。


どこでも、単語の折り返しとno.of行を0に設定するように言われています。それでも、私の場合は折り返しませんでした。左、上、下、右の制約を設定すると、折り返されます。
anoo_radha

1

スウィフト4:

label.lineBreakMode = .byWordWrapping

label.numberOfLines = 0

label.translatesAutoresizingMaskIntoConstraints = false

label.preferredMaxLayoutWidth = superview.bounds.size.width - 10 

0

C#では、UITableViewCell内でこれが機能しました。

        UILabel myLabel = new UILabel();
        myLabel.Font = UIFont.SystemFontOfSize(16);
        myLabel.Lines = 0;
        myLabel.TextAlignment = UITextAlignment.Left;
        myLabel.LineBreakMode = UILineBreakMode.WordWrap;
        myLabel.MinimumScaleFactor = 1;
        myLabel.AdjustsFontSizeToFitWidth = true;

       myLabel.InvalidateIntrinsicContentSize();
       myLabel.Frame = new CoreGraphics.CGRect(20, mycell.ContentView.Frame.Y + 20, cell.ContentView.Frame.Size.Width - 40, mycell.ContentView.Frame.Size.Height);
       myCell.ContentView.AddSubview(myLabel);

ここでのポイントは次のとおりです。

            myLabel.TextAlignment = UITextAlignment.Left;
            myLabel.LineBreakMode = UILineBreakMode.WordWrap;
            myLabel.MinimumScaleFactor = 1;
            myLabel.AdjustsFontSizeToFitWidth = true;

-2

このコードは、テキストに従ってサイズの高さを返します

+ (CGFloat)findHeightForText:(NSString *)text havingWidth:(CGFloat)widthValue andFont:(UIFont *)font
 {
    CGFloat result = font.pointSize+4;
    if (text) 
{
        CGSize size;

        CGRect frame = [text boundingRectWithSize:CGSizeMake(widthValue, 999)
                                          options:NSStringDrawingUsesLineFragmentOrigin
                                       attributes:@{NSFontAttributeName:font}
                                          context:nil];
        size = CGSizeMake(frame.size.width, frame.size.height+1);
        result = MAX(size.height, result); //At least one row
    }
    return result;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.