UILabel内でテキストを垂直方向に上に揃える 質問する

UILabel内でテキストを垂直方向に上に揃える 質問する

2 行のテキスト用のスペースがありますUILabel。テキストが短すぎると、このテキストがラベルの垂直中央に表示されることがあります。

テキストを常に上部に垂直に配置するにはどうすればよいでしょうかUILabel?

垂直中央揃えのテキストを持つ UILabel を表す画像

ベストアンサー1

に vertical-align を設定する方法はありませんUILabelが、ラベルのフレームを変更することで同じ効果を得ることができます。何が起こっているのかがはっきりとわかるように、ラベルをオレンジ色にしました。

これをすばやく簡単に行う方法は次のとおりです。

    [myLabel sizeToFit];

sizeToFit ラベルを縮小する


複数行になる長いテキストを含むラベルがある場合は、numberOfLinesに設定します0(ここで 0 は行数が無制限であることを意味します)。

    myLabel.numberOfLines = 0;
    [myLabel sizeToFit];

sizeToFit による長いラベルテキスト


ロングバージョン

何が起こっているのかがわかるように、コードでラベルを作成します。この設定のほとんどは、Interface Builder でも行うことができます。私の設定は、余白 (20 ポイント) を表示するために Photoshop で作成した背景画像を使用したビューベースのアプリです。ラベルは魅力的なオレンジ色なので、寸法で何が起こっているのかがわかります。

- (void)viewDidLoad
{
    [super viewDidLoad];

    // 20 point top and left margin. Sized to leave 20 pt at right.
    CGRect labelFrame = CGRectMake(20, 20, 280, 150);
    UILabel *myLabel = [[UILabel alloc] initWithFrame:labelFrame];
    [myLabel setBackgroundColor:[UIColor orangeColor]];

    NSString *labelText = @"I am the very model of a modern Major-General, I've information vegetable, animal, and mineral";
    [myLabel setText:labelText];

    // Tell the label to use an unlimited number of lines
    [myLabel setNumberOfLines:0];
    [myLabel sizeToFit];

    [self.view addSubview:myLabel];
}

sizeToFit中央揃えまたは右揃えのテキストを使用する場合、使用上の制限がいくつかあります。次のようなことが起こります。

    // myLabel.textAlignment = NSTextAlignmentRight;
    myLabel.textAlignment = NSTextAlignmentCenter;

    [myLabel setNumberOfLines:0];
    [myLabel sizeToFit];

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

ラベルのサイズは、左上隅が固定されたままです。元のラベルの幅を変数に保存して の後にそれを設定するsizeToFitか、固定幅を指定してこれらの問題に対処することができます。

    myLabel.textAlignment = NSTextAlignmentCenter;

    [myLabel setNumberOfLines:0];
    [myLabel sizeToFit];

    CGRect myFrame = myLabel.frame;
    // Resize the frame's width to 280 (320 - margins)
    // width could also be myOriginalLabelFrame.size.width
    myFrame = CGRectMake(myFrame.origin.x, myFrame.origin.y, 280, myFrame.size.height);
    myLabel.frame = myFrame;

ラベル配置


は、最初のラベルの最小幅を尊重することに注意してくださいsizeToFit。幅 100 のラベルから始めてsizeToFitそれを呼び出すと、幅 100 (またはそれより少し小さい) の (おそらく非常に高い) ラベルが返されます。サイズを変更する前に、ラベルを必要な最小幅に設定することをお勧めします。

フレーム幅を変更してラベルの位置合わせを修正する

他に注意すべき点:

が尊重されるかどうかはlineBreakMode、設定​​方法によって異なります。NSLineBreakByTruncatingTail(デフォルト) はsizeToFit、他の 2 つの切り捨てモード (先頭と中央) と同様に、の後に無視されますNSLineBreakByClipping。 も無視されます。NSLineBreakByCharWrapping通常どおり動作します。フレームの幅は、右端の文字に収まるように引き続き狭められます。


マーク・アメリーコメントで、自動レイアウトを使用した NIB とストーリーボードの修正方法を示しました:

ラベルが、view自動レイアウトを使用する ViewController のサブビューとして nib またはストーリーボードに含まれている場合、sizeToFitへの呼び出しviewDidLoadは機能しません。これは、 が呼び出された後に自動レイアウトによってサブビューのサイズと位置がviewDidLoad設定され、呼び出しの効果が直ちに元に戻されるためですsizeToFit。ただし、sizeToFit内からの呼び出しは機能viewDidLayoutSubviews します


私のオリジナルの回答(後世/参考用):

これは、NSStringメソッドを使用してsizeWithFont:constrainedToSize:lineBreakMode:、文字列を収めるのに必要なフレームの高さを計算し、原点と幅を設定します。

挿入するテキストを使用して、ラベルのフレームのサイズを変更します。これにより、任意の数の行を収容できます。

CGSize maximumSize = CGSizeMake(300, 9999);
NSString *dateString = @"The date today is January 1st, 1999";
UIFont *dateFont = [UIFont fontWithName:@"Helvetica" size:14];
CGSize dateStringSize = [dateString sizeWithFont:dateFont 
        constrainedToSize:maximumSize 
        lineBreakMode:self.dateLabel.lineBreakMode];

CGRect dateFrame = CGRectMake(10, 10, 300, dateStringSize.height);

self.dateLabel.frame = dateFrame;

おすすめ記事