含まれているテキストに合うようにUILabelボックス/境界を自動サイズ変更することは可能ですか? (それがディスプレイより大きくなっても構いません)
ユーザーが "こんにちは"または "私の名前は本当にこのボックスに収まるようにしたいです"と入力した場合、切り捨てられることはなく、ラベルはそれに応じて '拡大'されますか?
UILabel
name__のカテゴリーを作成したところで私の要旨をチェックしてください。私のカテゴリーでは、UILabel
name__にすべてのコンテンツを表示できるようにすることができます。 https://Gist.github.com/1005520
または、この記事をチェックしてください。 https://stackoverflow.com/a/7242981/662605
これは高さを引き伸ばしますが、反対の方法で幅を引き伸ばすために簡単に変更することができます。
@implementation UILabel (dynamicSizeMeWidth)
- (void)resizeToStretch{
float width = [self expectedWidth];
CGRect newFrame = [self frame];
newFrame.size.width = width;
[self setFrame:newFrame];
}
- (float)expectedWidth{
[self setNumberOfLines:1];
CGSize maximumLabelSize = CGSizeMake(CGRectGetWidth(self.bounds), CGFLOAT_MAX);
CGSize expectedLabelSize = [[self text] sizeWithFont:[self font]
constrainedToSize:maximumLabelSize
lineBreakMode:[self lineBreakMode]];
return expectedLabelSize.width;
}
@end
もっと簡単にsizeToFit
name__クラスから利用可能なUIView
name__メソッドを使用できますが、安全のために行数を1に設定します。
オートレイアウトを使用している場合は、組み込みのソリューションがあります。行数を0に設定すると、フレームワークはテキストに合わせてラベルのサイズを適切に変更します(高さを追加する)。
sizeWithFont:
は非推奨なので、代わりにsizeWithAttributes:
を使用してください。
- (float)expectedWidth{
[self setNumberOfLines:1];
CGSize expectedLabelSize = [[self text] sizeWithAttributes:@{NSFontAttributeName:self.font}];
return expectedLabelSize.width;
}
[label sizeToFit];
を使用しても、Danielsカテゴリと同じ結果が得られます。
自動レイアウトを使用して、制約に基づいてラベルのサイズを変更することをお勧めします。
UILabel
をテキストサイズに基づいて縮小および拡大する必要がある場合は、自動レイアウト付きストーリーボードが最適な選択肢です。以下はこれを達成するためのステップです。
UILabelをView Controllerに入れて、好きな場所に配置します。 numberOfLines
のUILabel
プロパティにも0
を入れます。
上、前、後のスペースピン制約を適用します。
Update Frame
をクリックし、Fix Misplacement
をクリックしてください。これで、このUILabelはテキストが少ない場合は縮小し、テキストが多い場合は拡大します。これは、他のいくつかの答えが示すほど複雑ではありません。
自動レイアウトを使用して、ラベルの左側と上部を固定するための制約を追加します。
その後、自動的にサイズ変更されます。
自動レイアウトを使用するときにsizeToFit
を設定する必要はありません。サンプルプロジェクトのための私の完全なコードはここにあります:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var myLabel: UILabel!
@IBAction func changeTextButtonTapped(sender: UIButton) {
myLabel.text = "my name is really long i want it to fit in this box"
}
}
myLabel.preferredMaxLayoutWidth = 150 // or whatever
を追加します。 (ラベルの高さが増えるとボタンが下に移動するように、ボタンをラベルの下部に固定しました。)UITableViewCell
内のラベルのサイズを動的に変更する場合は、 この答え を参照してください。UILabelのテキストを調整するには[label sizeToFit];
を使用してください
私は上記のDanielの回答に基づいていくつかのメソッドを作成しました。
-(CGFloat)heightForLabel:(UILabel *)label withText:(NSString *)text
{
CGSize maximumLabelSize = CGSizeMake(290, FLT_MAX);
CGSize expectedLabelSize = [text sizeWithFont:label.font
constrainedToSize:maximumLabelSize
lineBreakMode:label.lineBreakMode];
return expectedLabelSize.height;
}
-(void)resizeHeightToFitForLabel:(UILabel *)label
{
CGRect newFrame = label.frame;
newFrame.size.height = [self heightForLabel:label withText:label.text];
label.frame = newFrame;
}
-(void)resizeHeightToFitForLabel:(UILabel *)label withText:(NSString *)text
{
label.text = text;
[self resizeHeightToFitForLabel:label];
}
@implementation UILabel (UILabel_Auto)
- (void)adjustHeight {
if (self.text == nil) {
self.frame = CGRectMake(self.frame.Origin.x, self.frame.Origin.y, self.bounds.size.width, 0);
return;
}
CGSize aSize = self.bounds.size;
CGSize tmpSize = CGRectInfinite.size;
tmpSize.width = aSize.width;
tmpSize = [self.text sizeWithFont:self.font constrainedToSize:tmpSize];
self.frame = CGRectMake(self.frame.Origin.x, self.frame.Origin.y, aSize.width, tmpSize.height);
}
@end
これはカテゴリー方式です。 UILabelの高さを調整するためにこのメソッドを呼び出すよりも、最初にテキストを設定する必要があります。
あなたは2つの方法を使用してテキストと他の関連コントロールに従ってあなたのラベルを大きさで分類することができます -
IOS 7.0以降の場合
CGSize labelTextSize = [labelText boundingRectWithSize:CGSizeMake(labelsWidth, MAXFLOAT)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{
NSFontAttributeName : labelFont
}
context:nil].size;
iOS 7.0より前では、これはラベルサイズを計算するために使用することができました
CGSize labelTextSize = [label.text sizeWithFont:label.font
constrainedToSize:CGSizeMake(label.frame.size.width, MAXFLOAT)
lineBreakMode:NSLineBreakByWordWrapping];
// labelTextHeightに基づいて他のコントロールを再設定します
CGFloat labelTextHeight = labelTextSize.height;
ラベルのテキストのサイズを計算したくない場合は、UILabelのインスタンスで-sizeToFitを使用します。
[label setNumberOfLines:0]; // for multiline label
[label setText:@"label text to set"];
[label sizeToFit];// call this to fit size of the label according to text
//この後、ラベルフレームを取得して他の関連コントロールをリフレームすることができます
これが私の状況に合ったものです。
1)UILabelの高さは、自動レイアウトを使用して> = 0の制約があります。幅は固定です。 2)その時点ですでにスーパービューを持っているUILabelにテキストを割り当てます(それがどれほど重要かはわかりません)。 3)それから、
label.sizeToFit()
label.layoutIfNeeded()
ラベルの高さが適切に設定されました。
[label sizeToFit];
を追加私は自動レイアウトに関して大きな問題を抱えていました。テーブルセル内に2つのコンテナがあります。 2番目のコンテナーは商品の説明(0 - 1000文字)に応じてサイズ変更されます。行はそれらに基づいてサイズ変更する必要があります。
不足している成分は説明のための下の制約でした。
動的要素の下部制約を=から> =に変更しました。
1行の出力を表示してプロパティを設定するLine =複数行の出力を表示してプロパティを設定するLine = 1以上
[self.yourLableName sizeToFit];
いつでもフィット! :)
name.text = @"Hi this the text I want to fit to"
UIFont * font = 14.0f;
CGSize size = [name.text sizeWithAttributes:@{NSFontAttributeName: font}];
nameOfAssessment.frame = CGRectMake(400, 0, size.width, 44);
nameOfAssessment.font = [UIFont systemFontOfSize:font];