web-dev-qa-db-ja.com

UILabelにテキストを合わせる

ここに私のコードがあります

 UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(10, 50, 300, 50)];
    label.textAlignment = UITextAlignmentCenter;
    label.backgroundColor = [UIColor clearColor];
    label.textColor = [UIColor whiteColor];
    label.textColor.font = [UIFont fontWithName:@"Verdana" size:30];
    label.text = @"A very long string";
     etc...

問題は、フォントが大きく、ラベルに収まらないことです。 「非常に」と表示されるだけです

テキスト全体が表示されるようにする方法。私が試してみました

label.lineBreakMode = UILineBreakModeWordWrap;
label.numberOfLines = 0;

しかし、私にはうまくいきません。プログラムでそれをしたいです。

//編集

CGRect frame = CGRectMake(10, 50, 300, 50);
    NSString *labelString = @"Players.";

    UILabel *howManyUsersLabel = [[UILabel alloc]initWithFrame:frame];
    howManyUsersLabel.textAlignment = UITextAlignmentCenter;
    howManyUsersLabel.backgroundColor = [UIColor clearColor];
    howManyUsersLabel.textColor = [UIColor whiteColor];
    howManyUsersLabel.adjustsFontSizeToFitWidth = NO;
    howManyUsersLabel.numberOfLines = 0;

    CGFloat fontSize = 30;
    while (fontSize > 0.0)
    {
        CGSize size = [labelString sizeWithFont:[UIFont fontWithName:@"Verdana" size:fontSize] constrainedToSize:CGSizeMake(frame.size.width, 10000) lineBreakMode:UILineBreakModeWordWrap];

        if (size.height <= frame.size.height) break;
        fontSize -= 1.0;
        NSLog(@"test");
    }

    howManyUsersLabel.font = [UIFont fontWithName:@"Verdana" size:fontSize];
38
objlv

これを追加するだけでいいと思います:

label.adjustsFontSizeToFitWidth = YES;
label.minimumFontSize = 0;

その後、テキストはラベルに合わせて自動的にサイズ変更されます。

ただし、これは実際にはlabel.numberOfLines = 1の場合にのみ機能するため、テキストは1行になります。

テキストを複数行に折り返す必要があるが、それでも収まるように縮小する必要がある場合、ソリューションはより複雑になります。これを行うには、次のように、テキストのレンダリングされたサイズを計算し、ループで縮小する必要があります。

NSString *theText = @"A long string";
CGRect labelRect = CGRectMake(10, 50, 300, 50);
label.adjustsFontSizeToFitWidth = NO;
label.numberOfLines = 0;

CGFloat fontSize = 30;
while (fontSize > 0.0)
{
    CGSize size = [theText sizeWithFont:[UIFont fontWithName:@"Verdana" size:fontSize] constrainedToSize:CGSizeMake(labelRect.size.width, 10000) lineBreakMode:UILineBreakModeWordWrap];

    if (size.height <= labelRect.size.height) break;

    fontSize -= 1.0;
}

//set font size
label.font = [UIFont fontWithName:@"Verdana" size:fontSize];

これは基本的に、ラベルに収まるまでフォントサイズを小さくするだけです。

更新:

IOS7の時点で、adjustsFontSizeToFitWidth = YESので、この回答の2番目の部分は不要になりました(iOS 6以前をまだサポートしていない場合)。

89
Nick Lockwood

最後に、アラビア語のテキスト配置の問題の解決策を見つけました。

    label.text = @"هذا هو نص طويل جدا";
    label.textAlignment = NSTextAlignmentNatural;

    CGSize size = [labels sizeThatFits:CGSizeMake(_lblAddress.width, CGFLOAT_MAX)];
    label.height = size.height;
3
[UILabel sizeToFit];

それはあなたの問題のために働きます。

1

iOS 9でのスイフト

let maxFontSize: CGFloat = 40
let minFontSize: CGFloat = 10

label.font = UIFont(name: label.font.fontName, size: maxFontSize)!
label.adjustsFontSizeToFitWidth = true
label.minimumScaleFactor = minFontSize/maxFontSize

これにより、ラベルを埋めるためのフォントサイズは増加しません。最大サイズから始まり、必要に応じて最小サイズまで減少します。また、行数が1であると仮定しています。

0
Suragch
CGRect titleRect        = CGRectMake(10, 50, 300, 50);

UILabel *textTitleView  = [[UILabel alloc] initWithFrame:titleRect];

textTitleView.numberOfLines = 3  //for multiple lines;

textTitleView.lineBreakMode = UILineBreakModeWordWrap;

[UIFont fontWithName:@"Verdana" size:30];

textTitleView.text          = @"your text";
0
Piyush Kashyap

Interface Builderでは、これをすぐに行うことができます。

  1. UILabelの[自動圧縮]で、[固定フォントサイズ]ではなく"最小フォントサイズ"を選択します。
  2. 最小フォントサイズを8などの合理的な値に設定します。
  3. チェックマーク"Tighten Letter Spacing"をチェックすることもできます。

または、プログラムで実行することもできます。

label.adjustsFontSizeToFitWidth = YES;
0
Jeffrey Sun

IOS 8(おそらくiOS 7も)ですべてが壊れているようです。

解決:

-(UIFont*)fontForString:(NSString*)string toFitInRect:(CGRect)rect seedFont:(UIFont*)seedFont {
    UIFont* returnFont = seedFont;
    CGSize stringSize = [string sizeWithAttributes:@{NSFontAttributeName : seedFont}];

    while(stringSize.width > rect.size.width){
        returnFont = [UIFont systemFontOfSize:returnFont.pointSize -1];
        stringSize = [string sizeWithAttributes:@{NSFontAttributeName : returnFont}];
    }

    return returnFont;
}

label.adjustsFontSizeToFitWidth = YESを使用しようとしないでください。そうしないと、混乱してしまい、新しいサイズが適切に機能しません。

0
brandonscript