2 行のテキスト用のスペースがありますUILabel
。テキストが短すぎると、このテキストがラベルの垂直中央に表示されることがあります。
テキストを常に上部に垂直に配置するにはどうすればよいでしょうかUILabel
?
ベストアンサー1
に vertical-align を設定する方法はありませんUILabel
が、ラベルのフレームを変更することで同じ効果を得ることができます。何が起こっているのかがはっきりとわかるように、ラベルをオレンジ色にしました。
これをすばやく簡単に行う方法は次のとおりです。
[myLabel sizeToFit];
複数行になる長いテキストを含むラベルがある場合は、numberOfLines
に設定します0
(ここで 0 は行数が無制限であることを意味します)。
myLabel.numberOfLines = 0;
[myLabel 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;