在UILabel中使用文本

时间:2012-02-01 19:02:16

标签: objective-c ios 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;

但它对我不起作用。 我想以编程方式做到这一点。

// EDIT

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];

7 个答案:

答案 0 :(得分:89)

我认为你只需要添加:

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

然后文本将自动调整大小以适合标签。

但是请注意,只有当label.numberOfLines = 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时自动缩小,因此不再需要此答案的第二部分(除非您仍支持iOS 6及更早版本)。

答案 1 :(得分:3)

最后,我得到了阿拉伯语文本对齐问题的解决方案,你就是这样做的:

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

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

答案 2 :(得分:1)

[UILabel sizeToFit];

它可以解决您的问题。

答案 3 :(得分:0)

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";

答案 4 :(得分:0)

Interface Builder允许您立即执行此操作。

  1. 在UILabel中,在自动收缩下,选择“最小字体大小”,而不是“固定字体大小”。
  2. 最小字体大小设置为合理的,例如8。
  3. 您还可以勾选“收紧字母间距”复选标记。
  4. 或者你可以通过编程方式完成:

    label.adjustsFontSizeToFitWidth = YES;
    

答案 5 :(得分:0)

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,否则会感到非常困惑,新尺寸将无法正常使用。

答案 6 :(得分:0)

使用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。