web-dev-qa-db-ja.com

表示されるテキストに基づいてUILabelの自動サイズ変更

表示するテキストに基づいてテキスト領域のサイズを自動変更する必要があるアプリケーションで作業しています。

第一に、UILabel(私の場合は静的テキストを表示するのに論理的に最良の選択です)またはUITextViewのどちらを使用すべきかわかりません。

使用方法
テキストでラベルまたはテキストビューを初期化するだけです。代わりに、最初にフレームを定義してから、その領域のテキストを制限します。

適切なソリューションを提案できる場合、それは大きな助けになります。

私はドキュメントや他の参考文献を調べましたが、ここで私を助けたり見落としたりすることのできるものはあまり見つけませんでした。

55

sizeToFitメソッドは非常にうまく機能しました。

私は次のことをしました。

UILabel *testLabel =[[UILabel alloc] initWithFrame:CGRectMake(6,3, 262,20 )]; // RectMake(xPos,yPos,Max Width I want, is just a container value);

NSString * test=@"this is test this is test inthis is test ininthis is test inthis is test inthis is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...";

testLabel.text = test;
testLabel.numberOfLines = 0; //will wrap text in new line
[testLabel sizeToFit];

[self.view addSubview:testLabel];
97

あなたはテキストサイズを見つけることができます:

CGSize textSize = [[myObject getALongText] 
                    sizeWithFont:[UIFont boldSystemFontOfSize:15] 
                    constrainedToSize:CGSizeMake(maxWidth, 2000)
                    lineBreakMode:UILineBreakModeWordWrap];

UILabelを次のように作成できます:

UILabel * lbl = [[UILabel alloc] initWithFrame:CGRectMake(0,0,textSize.width, textSize.height];
[lbl setNumberOfLines:0];
[lbl setLineBreakMode:UILineBreakModeWordWrap];
[lbl setText:[myObject getALongText]];
29
j_freyre

Swiftの場合:

testLabel = UILabel(frame: CGRectMake(6, 3, 262, 20))
testLabel.text = test
testLabel.numberOfLines = 0
testLabel.sizeToFit()

Objective Cで

UILabel *testLabel = [[UILabel alloc] initWithFrame: CGRectMake(6, 3, 262, 20)]];
testLabel.text = test;
testLabel.numberOfLines = 0;
[testLabel sizeToFit];
14
Segev

UILabelの高さのみをサイズ変更する場合は、これを使用します。

@property (nonatomic, weak) IBOutlet UILabel *titleLabel;

CGRect titleLabelBounds = self.titleLabel.bounds;
titleLabelBounds.size.height = CGFLOAT_MAX;
// Change limitedToNumberOfLines to your preferred limit (0 for no limit)
CGRect minimumTextRect = [self.titleLabel textRectForBounds:titleLabelBounds limitedToNumberOfLines:2];

CGFloat titleLabelHeightDelta = minimumTextRect.size.height - self.titleLabel.frame.size.height;
CGRect titleFrame = self.titleLabel.frame;
titleFrame.size.height += titleLabelHeightDelta;
self.titleLabel.frame = titleFrame;

これで、titleLabelHeightDeltaを使用して、ラベルサイズに応じて他のビューをレイアウトできます(自動レイアウトを使用しなくても)。

9
Berik

質問を完全に理解しているかどうかはわかりませんが、sizeToFitUILabelメソッドを使用して(メソッドはUIViewから継承されます)、ラベルのテキスト。

6
Erik Tjernlund

を見つけるための最も簡単な方法。テキストに応じた行数。次のコードを使用できます。

ceil(([aText sizeWithFont:aFont].width)/self.bounds.size.width-300); 

フロート値を返します。

[lbl setNumberOfLines:floatvalue];
6
Anand

アプリでこのソリューションを何度も使用するため、以下を実行します。

1)extensionsというディレクトリを作成し、_UILabel.Swift_という新しいファイルを次のコードで追加します。

_import UIKit

extension UILabel {
    func resizeToText() {
        self.numberOfLines = 0
        self.sizeToFit()
    }
}
_

2)アプリコードで、必要なラベル幅を定義し、resizeToText()を呼び出すだけです。

_label.frame.size.width = labelWidth
label.resizeToText()
_

これにより、幅が維持され、高さが自動的に増加します。

2
Alex

Autolayout呼び出しでは、sizeToFitはサイズを変更しないことに注意してください。サイズは後でautolayout計算によって変更されるためです。この場合、「height> = xx」値を使用してUILabelに適切な高さ制約を設定する必要があります。

2
Ilja Popov

この関数を使用して、文字列の長さに基づいてラベルのサイズを変更できます

func ChangeSizeOfLabel(text:String) -> CGSize{

    let font = UIFont(name: "HelveticaNeue", size: 12)!
    let textAttributes = [NSFontAttributeName: font]
    let size = text.boundingRectWithSize(CGSizeMake(310, 999), options: .UsesLineFragmentOrigin, attributes: textAttributes, context: nil)
    let adjustSize = CGSizeMake(size.width, size.height)
    return adjustSize
}

次のように使用します:

させる

showLabel.frame = CGRectMake(x, y, width , self.ChangeSizeOfLabel("Hello , Height is changing dynamically.....").height)
0

以下のコードを試してください、それは複数行で動作します

self.labelText.text = string;
self.labelText.lineBreakMode = NSLineBreakByWordWrapping;
self.labelText.numberOfLines = 0;
0
Patel Jigar